🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2510閲覧

2次元配列のループを使わない宣言方法

SiiSuu

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/11/08 02:21

編集2019/11/08 03:24

前提・実現したいこと

2次元配列をループを使わないで宣言したい。
(Arr(0,0)で取り出せる2次元配列を、値を一つづつ簡単に変更できる形で作りたい。)

発生している問題・エラーメッセージ

インデックスが有効範囲にありません。

該当のソースコード

Sub Array_Test() Dim Arr() As Integer 'ループで作った場合 Arr(0,0) になる。 ReDim Arr(5, 5) For i = 0 To 5 For i2 = 0 To 5 Arr(i, i2) = 0 Next i2 Next i 'ループを使わずに作った場合 Arr(0)(0) になる。(型が一致しません) Arr = Array(Array(0, 0, 0, 0, 0, 0), _ Array(0, 0, 0, 0, 0, 0), _ Array(0, 0, 0, 0, 0, 0), _ Array(0, 0, 0, 0, 0, 0), _ Array(0, 0, 0, 0, 0, 0), _ Array(0, 0, 0, 0, 0, 0)) _ End Sub

試したこと

ローカルウィンドウで確認すると Arr(0)(0) になっているので、 Arr(0,0) でループを使わずに宣言したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/11/08 02:24 編集

「宣言」をどういう意味で使っていますか? 文字通りなら、Dim Arr(3, 3) As Integer で宣言できます。
m.ts10806

2019/11/08 02:44

「ループを使う」で出来ているのならそのコードも提示された方が回答者との認識や定義にずれがなくなると思います (コードはマークダウンのcode機能を利用してご提示ください)
SiiSuu

2019/11/08 03:28

宣言については配列が空で宣言して、ReDimで変更してからforで2次元配列にしていたのですが、 デバッグの為に2次元配列内の値を一つづつ打ち込みで簡単に変更できる形で作りたいと思いました。 コードを変更しました。質問がわかりずらく申し訳ありません。よろしくお願いします。
Youbun

2019/11/08 04:07

根本の解決にはならないですが、 >>>'ループを使わずに作った場合 Arr(0)(0) になる。(型が一致しません) この方法で配列を作って「ReDim Arr(X, X)」で定義した配列に値を入れる仕様にしたら 希望する仕様ができると思います。 ※配列の入れ替え処理を関数化して使うようにしたらそこまで見ずらくもならないと思います。
guest

回答2

0

ベストアンサー

Variant を使えばできるようですが、配列型の変数に配列を代入することはできないようです。

VBA

1Dim arr As Variant 2arr = [{ 1, 2, 3; 4, 5, 6 }] 3ActiveSheet.Cells(1, 1).Value = arr(2, 3)

Office TANAKA - 変数の使い方[バリアント型を配列として使う]

他のプログラミング言語では、配列に配列を代入できるものもありますが、VBAではできません。そんなときは、一般的にバリアント型変数に代入します。

投稿2019/11/08 03:48

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SiiSuu

2019/11/08 04:06

Variantを使わなければいけないとは思いませんでした!ありがとうございます!
guest

0

解決済みですか、一応、簡単に補足解説しておきます。

まず、

vba

1Arr = Array(Array(0, 0, 0, 0, 0, 0), _ 2 Array(0, 0, 0, 0, 0, 0), _ 3 Array(0, 0, 0, 0, 0, 0), _ 4 Array(0, 0, 0, 0, 0, 0), _ 5 Array(0, 0, 0, 0, 0, 0), _ 6 Array(0, 0, 0, 0, 0, 0))

は2次元配列ではなく一次元配列の要素に一次元配列を格納したもので、ジャグ配列(正確には疑似ですが)というものになります。

VBAでジャグ配列(多段階配列)を作るには - t-hom’s diary

要素にアクセスするには、Arr(0)(0) という形になります。


次に、

vba

1Dim arr As Variant 2arr = [{ 1, 2, 3; 4, 5, 6 }]

でvaliant型の二次元配列が生成できますが、これの []Evaluate メソッドの省略形で、省略せずに記述すると下記のようになります。

vba

1Dim arr As Variant 2arr = Application.Evaluate("{ 1, 2, 3; 4, 5, 6 }")

この ApplicationというのはExcelのことで、Evaluate メソッドはExcelの機能です。
純粋のVBAではないので、ほかのOfficeアプリ(Access, Word, PowerPoint など)では使えないので注意が必要です。(Excelオブジェクトを生成すれば使えますが)

投稿2019/11/08 04:37

hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SiiSuu

2019/11/08 04:51

わかりやすい補足解説ありがとうございます!すごく理解できました! 少し問題が起きたのですが、Evaluateで作った2次元配列はなぜインデックスが1から始まるのでしょうか?インデックスを0から始めることは可能なのでしょうか?
hatena19

2019/11/08 07:57

たぶん無理だと思います。 例えば、下記のようにセル範囲を配列に格納することができますが、 Dim arr arr = Range("A2:B5").Value この場合もインデックスは1から始まります。 Cellsも1から始まるので、VBAではなくExcelの仕様に合わせたのでしょう。
SiiSuu

2019/11/08 08:32

わかりました! 配列のインデックスをズラすfunctionを作成して、使用してみます。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問