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

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

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

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

Q&A

解決済

2回答

110518閲覧

VBA 2次元動的配列で、行数を順次増やす方法について

cesolution

総合スコア217

VBA

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

0グッド

3クリップ

投稿2017/02/24 03:36

###前提・実現したいこと
現在、2次元の動的配列において、順次行数、列数を増やすマクロを作成しようとしています。

###発生している問題・コード
具体的には、Arrで定義した2次元配列において、もし、現在の配列の列数が足りない場合は、以下のコードで列数を増やしていきます。

VBA

1ReDim Preserve Arr(UBound(Arr, 1), UBound(Arr, 2) + 1)

同様に、現在の配列の行数が足りない場合は、以下のコードで増やそうとしています。

VBA

1ReDim Preserve Arr(UBound(Arr, 1) + 1, UBound(Arr, 2))

が、上記の書き方で列数については増えていくものの、行数については上記のコードは無視されてしまいます。
(上記のコードに到達すると、ループから抜けてしまいます)
列側は順調に拡張していけるのですが、何故行数側は上記のコードでこけてしまうのでしょうか。
全体のコードは以下になります。

VBA

1 Dim Arr() As String: ReDim Arr(1, 1) 2 For Each r In Split(Node2.Text, vbLf) 3 For Each c In Split(r, ",") 4 If UBound(Arr, 2) < j Then 5 ReDim Preserve Arr(UBound(Arr, 1), UBound(Arr, 2) + 1) 6 Arr(i, j) = c 7 Else 8 If UBound(Arr, 1) < i Then 9 Debug.Print ("行の数=" & UBound(Arr, 1)) 10 '↓ここでコードがループから抜けてしまう 11 ReDim Preserve Arr(UBound(Arr) + 1, UBound(Arr, 2)) 12 Arr(i, j) = c 13 Else 14 Arr(i, j) = c 15 End If 16 End If 17 j = j + 1 18 Next 19 j = 0 20 i = i + 1 21 Next

ご助言いただければ幸いです。

宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

下記サイトに解説があるように、ReDim Preserveで要素数を変更できるのは、最後の要素に限られます。
http://www.vba-ie.net/programing/arrangement.html
つまりデータを維持したまま列数は動的に増やせますが、行数は増やせないということになります。

というわけで先に行数を決めてしまい、列数のみ可変とすれば良いと思います。

VBA

1Dim rows() As String 2Dim Arr() As String 3 4rows = Split(csv, vbLf) 5ReDim Arr(UBound(rows), 1) 6 7i = 0 8For Each r In rows 9 j = 0 10 For Each c In Split(r, ",") 11 If j + 1 > UBound(Arr, 2) Then 12 ReDim Preserve Arr(UBound(Arr, 1), UBound(Arr, 2) + 1) 13 End If 14 Arr(i, j) = c 15 j = j + 1 16 Next 17 i = i + 1 18Next

投稿2017/02/24 04:34

編集2017/02/24 04:36
ttyp03

総合スコア16998

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

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

cesolution

2017/02/24 04:37

ありがとうございます。やはり行数側は無理なんですね、、、了解しました。原因が分かってスッキリしました。別のアプローチを考えてみます。
ttyp03

2017/02/24 04:39

あ、いや、提示したコードでその問題はクリアしているので、参考にしてください。
cesolution

2017/02/24 04:45

あ、すみませんよく確認できていませんでした。ありがとうございます。非常に助かりました。
cesolution

2017/02/24 05:33

短時間で非常に適格なアドバイスをいただき誠にありがとうございました。お蔭様で実現したかった機能が全て織り込めました。
guest

0

Collectionクラスを使いましょう。
要素の数を自動的に拡張してくれますし、配列と同様にfor eachも使えます。

クラスを使ったことがない場合少し戸惑うかもしれません。
また、環境によっては数千件のデータを入れると重くなるかもしれません。


追伸、載せていただいたコードが未定義の変数があるなど不完全なため、追うことができません。手間がかかりますが、必要十分なコードに近づけてくださると該当のコードの問題点を指摘できると思います。

投稿2017/02/24 04:09

iwamoto_takaaki

総合スコア2883

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

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

cesolution

2017/02/24 04:38

ご回答ありがとうございます。 Collectionクラスは使ったことが無いので、ちょっと調べてみます。
iwamoto_takaaki

2017/02/24 04:46

正確な名称はCollectionオブジェクトでした。失礼しました。 調べる分の手間はかかりますが、覚えてしまえば使わない理由がない。
cesolution

2017/02/24 04:50

ありがとうございます。勉強になります。それほど素晴らしい機能であれば、頑張ってマスターしてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問