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

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

ただいまの
回答率

87.51%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 8,564

score 18

前提・実現したいこと

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+1

いくつか方法はありますが、シンプルな方法を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 14:50

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

    キャンセル

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


結果
イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

直書きなのでエラーがあるかもしれません。

Dim i As Long
Dim n As String
n = ""
For i = 1 To tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text
    n = n & ",NULL"
Next i
n = "(" & n & ")"
Debug.Print n  

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 87.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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