1レコードが長い(60セル)データが50レコードあったとします。
印刷の必要があり、見やすいように、1明細3行表示の一覧表を作成したいです。
高速化を考え、三次元配列でと考えましたが可能でしょうか。
三次元はやったことがないのです。
c(50,3,20)---c(50レコード,3行,20セル)
に収めて、一気に書き出そうとしましたが
dim c as variant
c(0,0,0)="a"
最初のところで「型が一致しません」でこけました。
使い方、間違ってますか。
もっと効率の良い方法あればご教授ください。
二次元の場合、
Range("A1:Z100") = c
のように一気に吐き出せますが、三次元の場合はどうでしょう。
No.3ベストアンサー
- 回答日時:
こんにちは。
Excelで、三次元なんていうものは、私には想像だに付きませんね。
>1明細3行表示の一覧表を作成したいです。
入れ物が3つ合っても、2次元だと思います。それでも、扱いは難しくなります。
>dim c as variant
>c(0,0,0)="a"
それで、最初からつまづいてしまっていますね。
Excelにレコードという概念はあっても、それを、VBAの中で表現しようとすると、このような形にはなりません。
>c(50,3,20)---c(50レコード,3行,20セル)
例えば、3行、20セルでひとまとめで、50レコードとするなら、このようなスタイルになります。
データは、A1:T150 までの3行ずつ20セルをひとまとめという場合です。
Sub TestArray()
Dim TestAr As Variant
ReDim TestAr(1 To 50, 1 To 3)
Dim j As Long
j = 1
For i = 1 To 150 Step 3
TestAr(j, 1) = Application.Transpose(Cells(i, 1).Resize(20).Value)
TestAr(j, 2) = Application.Transpose(Cells(i + 1, 1).Resize(20).Value)
TestAr(j, 3) = Application.Transpose(Cells(i + 2, 1).Resize(20).Value)
j = j + 1
Next i
End Sub
ただ、このようなスタイルになった変数でさえ、慣れていないと扱いきれません。
もちろん、ここで、3次元にして、TestAr(1 to 50, 1 To 3, 1 To 20) にして、それぞれに当てはめるということは可能ですが、すでに、2次元になった時点で、Variant型なのですから、そのメリットがありません。その上に、3次元目のIndex 一つずつに、データを入れるなんていうのは、かなり面倒なコードが必要になってきます。
一気に吐き出すというテクニックにこだわるなら、三次元ではなく、ジャグ配列や2次元配列で整えなくてはなりませんが、それだけの技術をもってしても、どのぐらいの違いがでるのか、甚だ疑問が生じてきてしまいます。質問した答えに答えろというのなら、私の回答はボツなのでしょうけれども、Excelは、あくまでも、2次元までです。(私の扱える範囲として、という意味です。)
添付画像は、2次元目の中身です。
3次元に収めても、一気に吐き出すことは出来ないし、効率が良いとは思えないということですね。
2次元c(150,20)に収めて一気に吐き出すことを検討しようと思います。
ありがとうごさいました。
No.2
- 回答日時:
50代 女性ではありませんが、
Dim c(49, 2, 19) As Variant
となるのでは?
多次元配列
http://www.officepro.jp/excelvba/array/index5.html
あと マルチは回答者に失礼ですよ
http://detail.chiebukuro.yahoo.co.jp/qa/question …
50代女性はこちらの情報でした。。。
回答ありがとうございました。
2次元配列はいつも使用していて、
「Option Base 1」をつける習慣になっていて説明をつけるのを忘れました。すみませんでした。
その上でエラーが出ていたので質問させていただきました。
マルチとは、多サイトで同質問をすることなんですね。申し訳ありませんでした。他サイトならまた別の方々に回答いただけると思ってやってしまいました。
No.1
- 回答日時:
Dim c(50, 3, 20) As Variant
のようにしてください。
以下は、3次元配列の(0,0,0)に"a"をセットし、その内容をメッセージボックスに表示しています。
Public Sub test()
Dim c(50, 3, 20) As Variant
c(0, 0, 0) = "a"
MsgBox (c(0, 0, 0))
End Sub
Dim c As Variant
Dim c(1 to 50,1 to 3,1 to20) As Variant
Dim c(50,3,20) As Variant
自分が試したときはどれもダメだったと思いましたが、
Dim c(50,3,20) As Variant で出来るんですね。
今回は、c(150,20)の2次元を使ってみようと思いますが、好学のためにも、3次元配列へのセットはもう少しやってみようと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- 流行・カルチャー 二次創作の二次創作(三次創作)はパクリではないか 3 2023/08/09 16:55
- Visual Basic(VBA) 表にフィルターをかけ、絞ったデータ(可視化セルのみ)を一次元配列として変数に入れるという動作を書きた 3 2023/06/16 00:31
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- 物理学 どうして、三次元にいられるのですか。 4 2023/02/10 20:58
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- Visual Basic(VBA) VBA シート間の転記で、条件の追加コードの書き方について教えて下さい。 13 2023/02/26 09:31
- 物理学 相対性理論と円運動について。 1 2023/01/30 11:39
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
DBから取得した値を配列へ代入する
-
C#でbyte配列から画像を表示さ...
-
構造体配列の一部初期化!!!
-
エクセルでXY座標に並べられた...
-
VB6で、一次元配列と二次元配列...
-
定数配列の書き方
-
配列の中の最大値とそのインデ...
-
オブジェクト名を変数で参照で...
-
配列の要素がすべてカラかどう...
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
ActiveReports(アクティブレポ...
-
VB.NETの配列にExcelから読み込...
-
VBで配列に格納されているデー...
-
8bitインデックス画像の入出力方法
-
Redim とEraseの違いは?
-
VBでの配列をEXCELに出力する方法
-
EXCEL VBA 配列デー...
-
Excel2010のinputboxで複数デー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
VB6からの移行したいけど、VB.N...
-
VB6のメモリ解放に関して
おすすめ情報