回答編集履歴

3 追記

jawa

jawa score 2993

2017/11/01 17:03  投稿

いくつか方法はありますが、シンプルな方法を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)"`という値が代入され、目的の結果が完成となります。
2 修正2

jawa

jawa score 2993

2017/10/31 13:30  投稿

いくつか方法はありますが、シンプルな方法を2つご紹介します。
方法①:文字列を繰り返し連結する
---
これは他の方々のアドバイスにもある、同じ変数に繰り返し文字列を結合していく方法です。
```
Dim lRept As Long      '繰り返し回数
lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する
Dim sNull As String    '繰り返す文字列
sNull = ",NULL"
Dim lLoop As Long  'ループカウンタ
Dim sRet As String '結合結果の文字列
Dim nullColumn As String '結合結果の文字列
For lLoop = 1 To lRept
   sRet = sRet & sNULL
   nullColumn = nullColumn & sNull
Next lLoop
If sRet <> "" Then
If nullColumn <> "" Then
   '空文字列でなければ括弧でくくる
   sRet = "(" & sRet & ")"
   nullColumn = "(" & nullColumn & ")"
End If
```
方法②:ワークシート関数を利用する
---
エクセルのワークシート関数にREPTというものがあります。
これは「文字列を指定した回数だけ繰り返す」というまさに今回行いたいことをやってくれる関数です。
```
Dim lRept As Long      '繰り返し回数
lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する
Dim sNull As String    '繰り返す文字列
sNull = ",NULL"
Dim sRet As String '結合結果の文字列
Dim nullColumn As String '結合結果の文字列
If lRept > 0 Then
   '文字列を指定回数だけ繰り返したした結果をsRetに格納する
   sRet = WorksheetFunction.Rept(sNull, lRept)
   nullColumn = WorksheetFunction.Rept(sNull, lRept)
EndIf
If sRet <> "" Then
If nullColumn <> "" Then
   '空文字列でなければ括弧でくくる
   sRet = "(" & sRet & ")"
   nullColumn = "(" & nullColumn & ")"
End If
```
参考になれば幸いです。
1 修正

jawa

jawa score 2993

2017/10/31 13:28  投稿

いくつか方法はありますが、シンプルな方法を2つご紹介します。
方法①:文字列を繰り返し連結する
---
これは他の方々のアドバイスにもある、同じ変数に繰り返し文字列を結合していく方法です。
```
Dim lRept As Long      '繰り返し回数
lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text)
lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する
Dim sNull As String    '繰り返す文字列
sNull = ",NULL"
Dim lLoop As Long  'ループカウンタ
Dim sRet As String '結合結果の文字列
For lLoop = 1 To lRept
   sRet = sRet & sNULL
Next lLoop
If sRet <> "" Then
   '空文字列でなければ括弧でくくる
   sRet = "(" & sRet & ")"
End If
```
方法②:ワークシート関数を利用する
---
エクセルのワークシート関数にREPTというものがあります。
これは「文字列を指定した回数だけ繰り返す」というまさに今回行いたいことをやってくれる関数です。
```
Dim lRept As Long      '繰り返し回数
lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text)
lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する
Dim sNull As String    '繰り返す文字列
sNull = ",NULL"
Dim sRet As String '結合結果の文字列
If lRept > 0 Then
   '文字列を指定回数だけ繰り返したした結果をsRetに格納する
   sRet = WorksheetFunction.Rept(sNull, lRept)
EndIf
If sRet <> "" Then
   '空文字列でなければ括弧でくくる
   sRet = "(" & sRet & ")"
End If
```
参考になれば幸いです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る