目安箱 IV

目安箱投稿のルールはこちらをごらんください。
ご意見は電子メールで承っています。
「目安箱」は質問禁止です。技術的な質問はそれぞれの質問箱へどうぞ。

迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
10 / 117 ツリー ←次へ | 前へ→

【286】二次元配列の合体 Jaka 17/9/1(金) 22:46 Excel[未読]
【287】ちょい変更 Jaka 17/9/1(金) 23:39 Excel[未読]
【288】Re:二次元配列の合体 マナ 17/9/3(日) 21:11 Excel[未読]

【286】二次元配列の合体
Excel  Jaka  - 17/9/1(金) 22:46 -

引用なし
パスワード
   使用頻度はほとんど無いと思うけど、なんとなく勉強のために。
なんかやたら、メモリ喰いそうだし。
シートに貼り付けて合体させた方が速そう。

エクセル関数を使っているので要素数の上限問題が…。
Excel2000だと、Transposeできる配列の要素数は、5461個(1〜5461)まで。
つまり、Excel2000だと2つの配列の総素数の合計が、5461個までしかまともに動かないと思う。

10カラム(10列)づつだったら、合計546行ぐらいか。
しょぼい。
見本(下記コードで作った)以外のデータでは試していません。

尚、メインのThinkpad A31(Win2000 & Excel2000)のバッテリーが逝かれて、
起動するとバイオス画面が出てくるようになったので、
下記コードは、Win7 & Excel2007 で書きました。


Sub 二次元配列合体()
 Dim TBL_1(1 To 4, 1 To 4)
 Dim TBL_2(1 To 3, 1 To 4)

 Range("A1:E20").Value = Empty

 '二次元配列に値を代入(ショボイデータ作成)
 TBL_1(1, 1) = 11: TBL_1(1, 2) = 12: TBL_1(1, 3) = 13: TBL_1(1, 4) = 14
 TBL_1(2, 1) = 21: TBL_1(2, 2) = 22: TBL_1(2, 3) = 23: TBL_1(2, 4) = 24
 TBL_1(3, 1) = 31: TBL_1(3, 2) = 32: TBL_1(3, 3) = 33: TBL_1(3, 4) = 34
 TBL_1(4, 1) = 41: TBL_1(4, 2) = 42: TBL_1(4, 3) = 43: TBL_1(4, 4) = 44
 Range("A1:D4").Value = TBL_1

 TBL_2(1, 1) = "A1": TBL_2(1, 2) = "B1": TBL_2(1, 3) = "C1": TBL_2(1, 4) = "D1"
 TBL_2(2, 1) = "A2": TBL_2(2, 2) = "B2": TBL_2(2, 3) = "C2": TBL_2(2, 4) = "D2"
 TBL_2(3, 1) = "A3": TBL_2(3, 2) = "B3": TBL_2(3, 3) = "C3": TBL_2(3, 4) = "D3"
 Range("A6:D8").Value = TBL_2

 MsgBox "シートに書いた2つの配列を合体します。"

 '列数分の配列を作り、二次元配列から1列づつ一次元配列に変換した配列を収めていく。
 '二次元配列から1列転記した場合、二次元配列になっていたので。

 Dim tbb(1 To 4)
 Dim NewTB()

 For i = 1 To UBound(tbb)
   tbb(i) = Split(Join(Application.Transpose(Application.Index(TBL_1, 0, i))) & " " & _
          Join(Application.Transpose(Application.Index(TBL_2, 0, i))))
 Next

 NewTB = Application.Transpose(tbb)
 行 = UBound(NewTB, 1)
 列 = UBound(NewTB, 2)
 Range("A11").Resize(行, 列).Value = NewTB

 Erase TBL_1, TBL_2, tbb, NewTB
End Sub

【287】ちょい変更
Excel  Jaka  - 17/9/1(金) 23:39 -

引用なし
パスワード
   > Dim tbb(1 To 4)
> Dim NewTB()

 ↓

Dim tbb()
Dim NewTB()
ReDim tbb(1 To UBound(TBL_1, 2))

【288】Re:二次元配列の合体
Excel  マナ  - 17/9/3(日) 21:11 -

引用なし
パスワード
   ▼Jaka さん:

>しょぼい。

そんなことないです。
わたしは大きなデータを使うことないので、全く問題なさそうです。
勉強になりました。

1000行×10列:<0,1sec
10000行×10列:<1sec
60000行×10列:<4sec

1000行×26列:<0,5sec
10000行×26列:<4sec
60000行×26列:<20sec

Sub test()
  Dim TBL_1, TBL_2
  
  ActiveSheet.UsedRange.ClearContents
  
  TBL_1 = [row(a1:a100)*column(a1:z1)]
  TBL_2 = [row(a1:a10000)&"_"&column(a1:z1)]
  
  MsgBox "2つの配列を合体します。"
 
  Dim t As Double
  t = Timer
  
  Dim tbb()
  ReDim tbb(1 To UBound(TBL_1, 2))
  Dim NewTB
  Dim i As Long, 行 As Long, 列 As Long
   
  For i = 1 To UBound(tbb)
    tbb(i) = Split(Join(Application.Transpose(Application.Index(TBL_1, 0, i))) & " " & _
        Join(Application.Transpose(Application.Index(TBL_2, 0, i))))
  Next
  
  NewTB = Application.Transpose(tbb)
  
  MsgBox Timer - t
  
  行 = UBound(NewTB, 1)
  列 = UBound(NewTB, 2)
   Cells(1).Resize(行, 列).Value = NewTB
  
  Erase TBL_1, TBL_2, tbb, NewTB

End Sub

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
10 / 117 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:   
0
(SS)C-BOARD v3.8 is Free