###前提・実現したいこと
VBAマクロで同じ文字列を指定数分繰り返し、次の形に整形したいです。
,NULL
,NULL
,NULL
.....指定数分繰返し
文字列の繰り返し指定数はワークシートのセルに記載があります。
###発生している問題・エラーメッセージ
,NULLが指定数分入った変数を作成したいのです。
一旦For文で,NULLの繰り返しをイミディエイトウインドウに出力するプログラムを組みましたが
他の変数にこれらが格納されるにはどのように記載すればよいのか知りたいです。
イメージは
nullColumn =(,NULL,NULL,NULL,.....)のようにしたいです。
###該当のソースコード
'NULL繰り返し回数の取得
Dim i As Long
Dim n As String
n = ",NULL"
i = tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text
For j = 1 To i
Debug.Print n
Next j
###試したこと
上記ソースと、コレクションにいれられないか試してみましたがエラーになってしまい行き詰っています。
###補足情報(言語/FW/ツール等のバージョンなど)
VBA
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
いくつか方法はありますが、シンプルな方法を2つご紹介します。
方法①:文字列を繰り返し連結する
これは他の方々のアドバイスにもある、同じ変数に繰り返し文字列を結合していく方法です。
Dim lRept As Long '繰り返し回数 lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する Dim sNull As String '繰り返す文字列 sNull = ",NULL" Dim lLoop As Long 'ループカウンタ Dim nullColumn As String '結合結果の文字列 For lLoop = 1 To lRept nullColumn = nullColumn & sNull Next lLoop If nullColumn <> "" Then '空文字列でなければ括弧でくくる nullColumn = "(" & nullColumn & ")" End If
方法②:ワークシート関数を利用する
エクセルのワークシート関数にREPTというものがあります。
これは「文字列を指定した回数だけ繰り返す」というまさに今回行いたいことをやってくれる関数です。
Dim lRept As Long '繰り返し回数 lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する Dim sNull As String '繰り返す文字列 sNull = ",NULL" Dim nullColumn As String '結合結果の文字列 If lRept > 0 Then '文字列を指定回数だけ繰り返したした結果をsRetに格納する nullColumn = WorksheetFunction.Rept(sNull, lRept) EndIf If nullColumn <> "" Then '空文字列でなければ括弧でくくる nullColumn = "(" & nullColumn & ")" End If
参考になれば幸いです。
(追記)サンプルコードの解説
コメント文を多めに記述したつもりでしたが、少し解説が足りていなかったようでしたので改めて解説を追記させていただきます。
なおサンプルで提供させていただいたコードには、本題の改修以外にも以下の観点で修正を加えてあります。
・変数名は使用目的がわかる名称にする
・文字列型から数値型へ直接代入(暗黙的な型変換が行われている)はせず、型を揃えてから代入する(文字列型を数値型に変換する)
変数名の違いなどはこのために発生しています。
ここらへんについても説明が足りておらず、結果的に理解を難しくしてしまったようで申し訳ありませんでした。
①について
ループ処理の中で文字列を連結する方法です。
まず、もともと
For j = 1 To i Debug.Print n Next j
というコードを記述されていたのでループ処理については説明不要かと思いますが、上記では変数jの値を1から順にiの値となるまで繰り返し処理します。
iが10ならjの値を1,2,3・・・と変更しながらj=10になるまで処理が繰り返されます。
私が紹介したサンプルコードでは、このループ処理の部分が
For lLoop = 1 To lRept nullColumn = nullColumn & sNull Next lLoop
となっています。
変数lLoopの値を1~lReptの値まで繰り返す処理となっています。
jやiの変数名が変わっているだけで、ループ文としては同じ内容です。
ループの中で繰り返し行われる処理内容が、Debug.PriintではなくnullColumn = nullColumn & sNull
にかわっています。
これが文字列の連結を行っている部分です。
ループ処理で具体的にどんなことが起きているか、順を追ってみてみましょう。
最初、変数nullColumnに何も値が入っていない状態("")から始まります。
変数sNULLには事前に",NULL"という文字列が代入してあります。
この状態でループ1周目に入ります。
1回目のnullColumn = nullColumn & sNull
が行われますが、その内容は
nullColumn = "" & ",NULL"
ということになりますよね。
結果、nullColumn = ",NULL"
という状態になるわけです。
続いてループ2周目に入ります。
2回目のnullColumn = nullColumn & sNull
が行われますが、その内容は1回目の結果を受けて
nullColumn = ",NULL" & ",NULL"
というものになりますよね。
結果、nullColumn = ",NULL,NULL"
という状態になるわけです。
さらにループ3周目に入ります。
3回目のnullColumn = nullColumn & sNull
が行われますが、その内容は2回目の結果を受けて
nullColumn = ",NULL,NULL" & ",NULL"
というものになり、結果はnullColumn = ",NULL,NULL,NULL"
となります。
1周するたびにnullColumnの後ろに",NULL"という文字列が追記されていくという訳です。
ループ処理を抜けた後の処理として、サンプルコードでは
If nullColumn <> "" Then '空文字列でなければ括弧でくくる nullColumn = "(" & nullColumn & ")" End If
という条件処理が行われています。
コメントにも書いてある通りですが、nullColumnが空でなければnullColumnの文字列の前後に括弧を付けるための処理です。
ループを「繰り返す回数」はセルの値から取得していますが、これがForループの初期値1よりも小さかった場合、ループ処理は1回も行われずに抜けることになります。
この場合nullColumn = ""
という状態のままループ後の処理に進みますが、この状態で無条件に括弧を付けてしまうとnullColumn = "()"
となってしまいます。
一度もNULLを連結していないのなら括弧も不要と思いnullColumn <> ""
の場合のみ括弧を付ける処理を行うよう条件文を記述しました。
ちゃんと1回以上NULLが連結された場合、例えば「繰り返す回数」が10だった場合にはループを10周して抜けてきますので、nullColumnには",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL"という文字列が代入されています。
ここでnullColumn = "(" & nullColumn & ")"
が行われることにより
nullColumn = "(,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)"
という値が代入されることになります。
これで目的の結果が完成しました。
②について
②ではループ処理を使わず、ワークシート関数で文字列連結を行っています。
それが
If lRept > 0 Then '文字列を指定回数だけ繰り返したした結果をsRetに格納する nullColumn = WorksheetFunction.Rept(sNull, lRept) EndIf
の部分です。
条件文となっているのは、セルから取得した「繰り返す回数」が0以下だった場合には処理しないようにするためです。
あとはREPT関数の機能にすべてお任せです。
「VBA REPT関数」で調べれば関数の使い方はすぐにわかると思いますが、第1引数に「繰り返す文字列」、第2引数に「繰り返す回数」を指定することで、指定した文字列を指定した回数繰り返した文字列を返してくれます。
サンプルではnullColumn = WorksheetFunction.Rept(sNull, lRept)
となっています。
第1引数にsNULL、第2引数にlReptを指定していますので、",NULL"という文字列を、セルから取得した「繰り返す回数」だけ繰り返した文字列が返ってきます。
繰り返す回数が10回なら、結果は",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL"となります。
その後、①と同様に空文字列でなければ前後に括弧を付けています。
結果、nullColumn = "(,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)"
という値が代入され、目的の結果が完成となります。
投稿2017/10/31 04:26
編集2017/11/01 08:03総合スコア3020
0
直書きなのでエラーがあるかもしれません。
VBA
1Dim i As Long 2Dim n As String 3n = "" 4For i = 1 To tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text 5 n = n & ",NULL" 6Next i 7n = "(" & n & ")" 8Debug.Print n
投稿2017/10/31 03:02
編集2017/10/31 03:07総合スコア25430
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2017/10/31 02:58
総合スコア3027
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/31 05:50