質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

4回答

19251閲覧

VBA 二次元配列のデータをSplitして変数に格納するときの挙動は?

King_of_Flies

総合スコア382

VBA

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

0グッド

0クリップ

投稿2018/01/05 06:50

編集2018/01/05 07:09

あけましておめでとうございます。

VBAに関する質問です。

二次元配列FileName(0,1,2)(0,1,2)があり、
それぞれ下記のデータが格納されているとします。

VBA

1Dim FileName As Variant 2FileName = Array(0,1,2)(0,1,2) 3FileName(0,0) = "a\b\c" 4FileName(0,1) = "a\e\f\k\s\t\h" 5FileName(0,2) = "b\f\g\a" 6FileName(1,0) = "g\g\h" 7FileName(1,1) = "k\h\s\q" 8910FileName(2,2) ="k\l\p"

私が今やりたいことが、FileNameのそれぞれのデータのファイルパスを、
""でSplitしたデータをtmpとして格納することで、
下記のようなイメージで取得をしたいと考えていますが、
実際にうまく取れないと思います。
(tmpを永遠と上書きしているので最後のFileName(2,2)しか取れないことをは承知しています。)

VBA

1Dim tmp As Variant 2 For i = 0 To 3 3 For j = 0 To 3 4 tmp = Split(FileName(i, j), "\") 5 Next j 6 Next i

ただ、上記コードのtmpを配列にして、この問題が解決できるものかわかりません。

tmpの宣言を二次元配列とした場合、

VBA

1Dim Tmp As Variant 2Tmp = Array(0,1,2)(0,1,2) 3 For i = 0 To 3 4 For j = 0 To 3 5 tmp(i,j) = Split(FileName(i, j), "\") 6 Next j 7 Next i

とすれば一見できそうですが、Splitで配列が作成されるので、
tmpは三次元配列になってしまう?と思います。

どのように解決すればよろしいでしょうか。
アドバイスお願いいたします。

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

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

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

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

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

guest

回答4

0

Split()は要素の分解であり、配列が返却されることはありません。
分解したものを配列にしたいのなら、各配列に格納し直さなければなりません。

そもそもパスを分解する目的があるなら、Splitで分解する時に行えば良いことだし、
配列に入れ直すことが効率良いというのが思い付かないのですが。

投稿2018/01/05 09:09

編集2018/01/05 13:04
sazi

総合スコア25188

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

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

sazi

2018/01/05 13:06

ご指摘のとおりです。
guest

0

配列の要素に配列を格納するということになりますね。このような配列をジャグ配列といいます。

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

今回の場合は、二次元配列の要素にSplitで返された1次元配列を格納するということになります。

ちなみに、
FileName = Array(0,1,2)(0,1,2)
はエラーになりますね。
そもそもArray関数では一次元配列しか作成できません。

コード例は他の方が書かれていますので、そちらをご参考に。

投稿2018/01/05 08:12

編集2018/01/05 12:39
hatena19

総合スコア33715

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

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

0

2次元配列の値がsplitによる1次元配列なだけです。3次元ではありません。
「解決する」というのがどういうことか質問からはわかりません。

vba

1 Dim FileName(2, 2) As Variant 2 FileName(0, 0) = "a\b\c" 3 FileName(0, 1) = "a\e\f\k\s\t\h" 4 FileName(0, 2) = "b\f\g\a" 5 FileName(1, 0) = "g\g\h" 6 FileName(1, 1) = "k\h\s\q" 7 FileName(1, 2) = "k\h\s\q" 8 FileName(2, 0) = "k\h\s\q" 9 FileName(2, 1) = "k\h\s\q" 10 FileName(2, 2) = "k\l\p" 11 12 Dim Tmp(2, 2) As Variant 13 14 Dim i As Long, j As Long 15 16 For i = 0 To 2 17 For j = 0 To 2 18 Tmp(i, j) = Split(FileName(i, j), "\") 19 Next j 20 Next i 21 22 Debug.Print Tmp(0, 0)(0) 'a 23 Debug.Print Tmp(0, 0)(1) 'b 24 Debug.Print Tmp(0, 0)(2) 'c 25

投稿2018/01/05 07:27

sousuke

総合スコア3828

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

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

0

まず、「Tmp = Array(0,1,2)(0,1,2)」は、
「Redim Tmp(Lbound(FileName ,1) to Ubound(FileName ,1),Lbound(FileName ,2) to Ubound(FileName ,2))」
にすべきでは?

そして、何が問題かが分かりかねます。
2次元配列の各要素に、Splitした1次元配列が入るだけのことです。

要素には、tmp(i,j)(n) 等でアクセスするだけですよ。

投稿2018/01/05 07:26

ExcelVBAer

総合スコア1175

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問