teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2017/11/01 08:03

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -49,4 +49,110 @@
49
49
  End If
50
50
  ```
51
51
 
52
- 参考になれば幸いです。
52
+ 参考になれば幸いです。
53
+
54
+
55
+ (追記)サンプルコードの解説
56
+ ---
57
+ コメント文を多めに記述したつもりでしたが、少し解説が足りていなかったようでしたので改めて解説を追記させていただきます。
58
+
59
+ なおサンプルで提供させていただいたコードには、本題の改修以外にも以下の観点で修正を加えてあります。
60
+ ・変数名は使用目的がわかる名称にする
61
+ ・文字列型から数値型へ直接代入(暗黙的な型変換が行われている)はせず、型を揃えてから代入する(文字列型を数値型に変換する)
62
+
63
+ 変数名の違いなどはこのために発生しています。
64
+ ここらへんについても説明が足りておらず、結果的に理解を難しくしてしまったようで申し訳ありませんでした。
65
+
66
+
67
+ ①について
68
+ ---
69
+ ループ処理の中で文字列を連結する方法です。
70
+ まず、もともと
71
+ ```
72
+ For j = 1 To i
73
+ Debug.Print n
74
+ Next j
75
+ ```
76
+ というコードを記述されていたのでループ処理については説明不要かと思いますが、上記では変数jの値を1から順にiの値となるまで繰り返し処理します。
77
+ iが10ならjの値を1,2,3・・・と変更しながらj=10になるまで処理が繰り返されます。
78
+
79
+ 私が紹介したサンプルコードでは、このループ処理の部分が
80
+ ```
81
+ For lLoop = 1 To lRept
82
+ nullColumn = nullColumn & sNull
83
+ Next lLoop
84
+ ```
85
+ となっています。
86
+ 変数lLoopの値を1~lReptの値まで繰り返す処理となっています。
87
+ jやiの変数名が変わっているだけで、ループ文としては同じ内容です。
88
+
89
+ ループの中で繰り返し行われる処理内容が、Debug.Priintではなく`nullColumn = nullColumn & sNull`にかわっています。
90
+ これが文字列の連結を行っている部分です。
91
+
92
+ ループ処理で具体的にどんなことが起きているか、順を追ってみてみましょう。
93
+
94
+ 最初、変数nullColumnに何も値が入っていない状態("")から始まります。
95
+ 変数sNULLには事前に",NULL"という文字列が代入してあります。
96
+
97
+ この状態でループ1周目に入ります。
98
+ 1回目の`nullColumn = nullColumn & sNull`が行われますが、その内容は
99
+ `nullColumn = "" & ",NULL"`
100
+ ということになりますよね。
101
+ 結果、`nullColumn = ",NULL"`という状態になるわけです。
102
+
103
+ 続いてループ2周目に入ります。
104
+ 2回目の`nullColumn = nullColumn & sNull`が行われますが、その内容は1回目の結果を受けて
105
+ `nullColumn = ",NULL" & ",NULL"`
106
+ というものになりますよね。
107
+ 結果、`nullColumn = ",NULL,NULL"`という状態になるわけです。
108
+
109
+ さらにループ3周目に入ります。
110
+ 3回目の`nullColumn = nullColumn & sNull`が行われますが、その内容は2回目の結果を受けて
111
+ `nullColumn = ",NULL,NULL" & ",NULL"`
112
+ というものになり、結果は`nullColumn = ",NULL,NULL,NULL"`となります。
113
+
114
+ 1周するたびにnullColumnの後ろに",NULL"という文字列が追記されていくという訳です。
115
+
116
+ ループ処理を抜けた後の処理として、サンプルコードでは
117
+ ```
118
+ If nullColumn <> "" Then
119
+ '空文字列でなければ括弧でくくる
120
+ nullColumn = "(" & nullColumn & ")"
121
+ End If
122
+ ```
123
+ という条件処理が行われています。
124
+ コメントにも書いてある通りですが、nullColumnが空でなければnullColumnの文字列の前後に括弧を付けるための処理です。
125
+
126
+ ループを「繰り返す回数」はセルの値から取得していますが、これがForループの初期値1よりも小さかった場合、ループ処理は1回も行われずに抜けることになります。
127
+ この場合`nullColumn = ""`という状態のままループ後の処理に進みますが、この状態で無条件に括弧を付けてしまうと`nullColumn = "()"`となってしまいます。
128
+ 一度もNULLを連結していないのなら括弧も不要と思い`nullColumn <> ""`の場合のみ括弧を付ける処理を行うよう条件文を記述しました。
129
+
130
+ ちゃんと1回以上NULLが連結された場合、例えば「繰り返す回数」が10だった場合にはループを10周して抜けてきますので、nullColumnには",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL"という文字列が代入されています。
131
+ ここで`nullColumn = "(" & nullColumn & ")"`が行われることにより
132
+ `nullColumn = "(,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)"`という値が代入されることになります。
133
+
134
+ これで目的の結果が完成しました。
135
+
136
+ ②について
137
+ ---
138
+ ②ではループ処理を使わず、ワークシート関数で文字列連結を行っています。
139
+ それが
140
+ ```
141
+ If lRept > 0 Then
142
+ '文字列を指定回数だけ繰り返したした結果をsRetに格納する
143
+ nullColumn = WorksheetFunction.Rept(sNull, lRept)
144
+ EndIf
145
+ ```
146
+ の部分です。
147
+
148
+ 条件文となっているのは、セルから取得した「繰り返す回数」が0以下だった場合には処理しないようにするためです。
149
+
150
+ あとはREPT関数の機能にすべてお任せです。
151
+ 「VBA REPT関数」で調べれば関数の使い方はすぐにわかると思いますが、第1引数に「繰り返す文字列」、第2引数に「繰り返す回数」を指定することで、指定した文字列を指定した回数繰り返した文字列を返してくれます。
152
+
153
+ サンプルでは`nullColumn = WorksheetFunction.Rept(sNull, lRept)`となっています。
154
+ 第1引数にsNULL、第2引数にlReptを指定していますので、",NULL"という文字列を、セルから取得した「繰り返す回数」だけ繰り返した文字列が返ってきます。
155
+ 繰り返す回数が10回なら、結果は",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL"となります。
156
+
157
+ その後、①と同様に空文字列でなければ前後に括弧を付けています。
158
+ 結果、`nullColumn = "(,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)"`という値が代入され、目的の結果が完成となります。

2

修正2

2017/11/01 08:03

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -11,15 +11,15 @@
11
11
  sNull = ",NULL"
12
12
 
13
13
  Dim lLoop As Long 'ループカウンタ
14
- Dim sRet As String '結合結果の文字列
14
+ Dim nullColumn As String '結合結果の文字列
15
15
 
16
16
  For lLoop = 1 To lRept
17
- sRet = sRet & sNULL
17
+ nullColumn = nullColumn & sNull
18
18
  Next lLoop
19
19
 
20
- If sRet <> "" Then
20
+ If nullColumn <> "" Then
21
21
  '空文字列でなければ括弧でくくる
22
- sRet = "(" & sRet & ")"
22
+ nullColumn = "(" & nullColumn & ")"
23
23
  End If
24
24
  ```
25
25
 
@@ -37,15 +37,15 @@
37
37
  sNull = ",NULL"
38
38
 
39
39
 
40
- Dim sRet As String '結合結果の文字列
40
+ Dim nullColumn As String '結合結果の文字列
41
41
  If lRept > 0 Then
42
42
  '文字列を指定回数だけ繰り返したした結果をsRetに格納する
43
- sRet = WorksheetFunction.Rept(sNull, lRept)
43
+ nullColumn = WorksheetFunction.Rept(sNull, lRept)
44
44
  EndIf
45
45
 
46
- If sRet <> "" Then
46
+ If nullColumn <> "" Then
47
47
  '空文字列でなければ括弧でくくる
48
- sRet = "(" & sRet & ")"
48
+ nullColumn = "(" & nullColumn & ")"
49
49
  End If
50
50
  ```
51
51
 

1

修正

2017/10/31 04:30

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  これは他の方々のアドバイスにもある、同じ変数に繰り返し文字列を結合していく方法です。
6
6
  ```
7
7
  Dim lRept As Long '繰り返し回数
8
- lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text)
8
+ lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する
9
9
 
10
10
  Dim sNull As String '繰り返す文字列
11
11
  sNull = ",NULL"
@@ -31,7 +31,7 @@
31
31
 
32
32
  ```
33
33
  Dim lRept As Long '繰り返し回数
34
- lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text)
34
+ lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text) '念のため数値化して代入する
35
35
 
36
36
  Dim sNull As String '繰り返す文字列
37
37
  sNull = ",NULL"