プロが教える店舗&オフィスのセキュリティ対策術

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
のように一気に吐き出せますが、三次元の場合はどうでしょう。

A 回答 (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
    • good
    • 0
この回答へのお礼

3次元に収めても、一気に吐き出すことは出来ないし、効率が良いとは思えないということですね。
2次元c(150,20)に収めて一気に吐き出すことを検討しようと思います。
ありがとうごさいました。

お礼日時:2016/12/19 09:29

50代 女性ではありませんが、


Dim c(49, 2, 19) As Variant
となるのでは?
多次元配列
http://www.officepro.jp/excelvba/array/index5.html

あと マルチは回答者に失礼ですよ
http://detail.chiebukuro.yahoo.co.jp/qa/question …
    • good
    • 0
この回答へのお礼

50代女性はこちらの情報でした。。。
回答ありがとうございました。
2次元配列はいつも使用していて、
「Option Base 1」をつける習慣になっていて説明をつけるのを忘れました。すみませんでした。
その上でエラーが出ていたので質問させていただきました。
マルチとは、多サイトで同質問をすることなんですね。申し訳ありませんでした。他サイトならまた別の方々に回答いただけると思ってやってしまいました。

お礼日時:2016/12/19 09:37

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
「三次元配列の利用について」の回答画像1
    • good
    • 0
この回答へのお礼

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次元配列へのセットはもう少しやってみようと思います。
ありがとうございました。

お礼日時:2016/12/19 09:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!