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

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

ただいまの
回答率

90.52%

  • VBA

    2249questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 37K+

cesolution

score 200

前提・実現したいこと

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

発生している問題・コード

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

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


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

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


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

    Dim Arr() As String: ReDim Arr(1, 1)
                    For Each r In Split(Node2.Text, vbLf)
                        For Each c In Split(r, ",")
                                If UBound(Arr, 2) < j Then
                                    ReDim Preserve Arr(UBound(Arr, 1), UBound(Arr, 2) + 1)
                                          Arr(i, j) = c
                                        Else
                                           If UBound(Arr, 1) < i Then
                                            Debug.Print ("行の数=" & UBound(Arr, 1))
                                         '↓ここでコードがループから抜けてしまう
                                           ReDim Preserve Arr(UBound(Arr) + 1, UBound(Arr, 2))
                                              Arr(i, j) = c
                                            Else
                                              Arr(i, j) = c
                                       End If
                                End If
                        j = j + 1
                        Next
                        j = 0
                        i = i + 1
                    Next

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

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

Dim rows() As String
Dim Arr() As String

rows = Split(csv, vbLf)
ReDim Arr(UBound(rows), 1)

i = 0
For Each r In rows
    j = 0
    For Each c In Split(r, ",")
        If j + 1 > UBound(Arr, 2) Then
            ReDim Preserve Arr(UBound(Arr, 1), UBound(Arr, 2) + 1)
        End If
        Arr(i, j) = c
        j = j + 1
    Next
    i = i + 1
Next

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 13:37

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

    キャンセル

  • 2017/02/24 13:39

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

    キャンセル

  • 2017/02/24 13:45

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

    キャンセル

  • 2017/02/24 14:33

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

    キャンセル

0

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 13:38

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

    キャンセル

  • 2017/02/24 13:46

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

    キャンセル

  • 2017/02/24 13:50

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

    キャンセル

同じタグがついた質問を見る

  • VBA

    2249questions

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