Dim i As Long
Dim A() As String
'何かの処理で配列全部に文字列を入れる。
i=1
Do while Len(A(i))>0
'何かの処理
i=i+1
Loop
配列の全部の要素に文字列が入ってると、最後のiでエラーになります。静的配列を使う場合は、要素数に余裕を持たせて宣言するので問題無かったのですが、動的配列を使うようになりエラーが出ました。
動的配列では条件判断に配列を使わない方がいいのでしょうか?というよりDowhile自体使わない方がいいのでしょうか。
勿論やりようで使える筈です。例えば要素数を1個追加して空""にするとか。常識的な方法はあるのでしょうか。例えばFor nextとか。
No.1ベストアンサー
- 回答日時:
ご相談のマクロでは、脱出条件としてA(i)が「存在する」ことが前提になってるのですから、つまりはロジックの組み方が間違ってます。
>常識的な方法
一般には
option base 1
for i = 1 to ubound(a)
’if len(a(i)) = 0 then exit for ’必要なら
何かの処理 a(i)
next i
のようにしとくのが、ご相談の状況では一番簡単確実に見えます。
#もちろん例えばdo loopの中で動的配列の上限を操作する可能性があってそういう事をしているのかもしれませんが、そこはご相談の範疇じゃないので割愛します。
No.5
- 回答日時:
こんばんは。
>Dowhile自体使わない方がいいのでしょうか。
Do While というのは、一般的に、数的な終了条件を求められない時に使うものです。
だから、VBAの実務では、外部ファイルのテキストファイルのEOF などの制御コードの時に用います。
数的に捉えられるものは、For 初期値 To 最終値 のほうが便利で早いです。
今回は、あくまでも、初級の練習だと解釈するしかありません。
また、ふつう、動的配列というものは、配列の添字の最大値が予め分からない場合に用いることであって、元はどういう構造になっているのか見せられていませんから、なんとも言えません。
以下のサンプルコードの場合は、本来は、動的配列は不要です。
(サンプルコードとは違うとかいうレスはしないでください。違うのだったら、元のコードを見せてください。)
常識的に、動的に配列に入れたなら、動的配列に使った、カウンター数か、UBoundで、Loopから抜ければよいだけではないでしょうか?
>最後のiでエラーになります。
Loopで戻った後に、配列の添字の上限以上の数を入れるわけですから、配列にない添字を入れたわけですから、エラーになります。
Do
a = a & Ar(i) '一例
i = i + 1
Loop While i <= UBound(Ar) Or Trim(Ar(i - 1)) = ""
あえて、2つの条件をあわせるなら、こうなります。
'//
Sub TestArray()
Dim i As Long
Dim j As Long
Dim k As Long
Dim Ar() As String
Dim a As String
Const sABC As String = "abcdefghijklmnopqrstuvwxyz"
For i = 1 To Len(sABC)
ReDim Preserve Ar(j)
Ar(j) = Mid(sABC, i, 1)
j = j + 1 'ここで、カウンター数を取得
Next i
Do
'If Trim(Ar(k)) = "" Then Exit Do 'もし空白条件を入れるなら。
a = a & Ar(k)
k = k + 1
Loop While k < j 'While k <= UBound(Ar) '下に入れる
Stop
End Sub
'//
こういうスタイルの場合は、最初に、予め配列の添字の上限を決めてしまうのが通例です。
空白で、Len(Ar(i))=0 というのは、Ar()が文字型ですから、「""」で十分ですが、あえて、Trimを使いました。
ありがとうございます。
Dowhileは数値では用いない、了解です。その様にします。
〉サンプルコードとは違うとかいうレスはしないでください
前回質問のやり取りを意識しての事と思いますが、それを言われてしまうと私としても「質問外の事を書かないでくれ」としか返事出来ません。ソースコードもありませんし、あったとしてもおそらく開示出来ません。ここに質問する時は、変えるとか必要部分のみ書いてます。
Trim これは知りませんでした。調べてみます。
No.4
- 回答日時:
Do While i <= UBound(A)
'何かの処理
i = i + 1
Loop
でいけそうですがどうでしょう。
No.2
- 回答日時:
UBoundで配列の数を取得しておいて、For~Nextを使用すれば対応できると思います。
---
Dim A() As String
'何かの処理で配列全部に文字列を入れる。
Dim i As Long
i = 1
Dim arrayMax As Long
arrayMax = UBound(A)
For i = 0 To arrayMax
'何かの処理
If Len(A(i)) = 0 Then Exit For
Next i
---
といった感じではないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) Vba 配列の中の特定文字列の位置の調べ方 9 2022/05/23 17:46
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
構造体配列の特定のメンバーをF...
-
VB.NETの配列にExcelから読み込...
-
vba フィルター 複数条件 3つ以...
-
定数配列の書き方
-
CheckBoxの配列化
-
Excel2010のinputboxで複数デー...
-
VB6のメモリ解放に関して
-
配列のペースト出力結果の書式...
-
コンボボックスのインデックス...
-
2次元配列の初期値
-
配列をランダムに並び替えても...
-
Dir関数で読み取り順を操作でき...
-
大量の変数を定義するにはどう...
-
テキストボックの文字を一行ず...
-
Excelのメモリ(配列)の上限は2G...
-
画像の座標取得
-
free()関数の多用 と Segment...
-
dimを使わずにredimを使う場合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
VB6からの移行したいけど、VB.N...
-
大量の変数を定義するにはどう...
-
VB6のメモリ解放に関して
おすすめ情報