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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

4回答

11097閲覧

VBA同じ文字列の繰り返しを作成したい

chanrina0920

総合スコア18

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2017/10/31 02:50

###前提・実現したいこと
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ページで確認できます。

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

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

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

guest

回答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
jawa

総合スコア3013

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

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

chanrina0920

2017/10/31 05:50

回答ありがとうございます!
guest

0

ループで回すのが常套手段だと思いますが、別の手法も紹介しておきます。

VBA

1i = tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text 2nullColumn = "(" & WorksheetFunction.Rept(",NULL", i) & ")"

投稿2017/10/31 04:12

ttyp03

総合スコア16998

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

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

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
sazi

総合スコア25195

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

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

0

この様なイメージでしょうか?

Sub test() 'NULL繰り返し回数の取得 Dim i As Long Dim n As String n = ",NULL" 'i = tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text i = 10 'とりあえず10 output = "(" For j = 1 To i output = output & n Next j Debug.Print output & ")" End Sub

結果
イメージ説明

投稿2017/10/31 02:58

motuo

総合スコア3027

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問