回答編集履歴
6
エレガントなコードに変更
test
CHANGED
@@ -186,7 +186,7 @@
|
|
186
186
|
|
187
187
|
'次の行を作る前に改行を追記
|
188
188
|
|
189
|
-
strOutput = strOutput &
|
189
|
+
strOutput = strOutput & vbLf & vbLf
|
190
190
|
|
191
191
|
Loop
|
192
192
|
|
5
エレガントなコードに変更
test
CHANGED
@@ -104,8 +104,6 @@
|
|
104
104
|
|
105
105
|
'セル(A1)から文字列を取得
|
106
106
|
|
107
|
-
'strRest = Sheet5.Range("A1").Value
|
108
|
-
|
109
107
|
strRest = sht.Range("A1").Value
|
110
108
|
|
111
109
|
|
@@ -164,98 +162,114 @@
|
|
164
162
|
|
165
163
|
|
166
164
|
|
167
|
-
'切り出した文字列
|
165
|
+
'切り出した文字列を出力
|
168
|
-
|
166
|
+
|
169
|
-
|
167
|
+
strOutput = strOutput & strLine
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
'切り出した文字列分を未出力文字列から除去
|
172
|
+
|
173
|
+
strRest = Mid(strRest, Len(strLine) + 1)
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
If strRest = "" Then
|
178
|
+
|
179
|
+
'未出力文字列がなくなったら終了
|
180
|
+
|
181
|
+
Exit Do
|
182
|
+
|
183
|
+
End If
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
'次の行を作る前に改行を追記
|
170
188
|
|
171
189
|
strOutput = strOutput & strLine & vbLf & vbLf
|
172
190
|
|
173
|
-
|
191
|
+
Loop
|
192
|
+
|
193
|
+
|
194
|
+
|
174
|
-
|
195
|
+
''結果をB1セルに出力
|
196
|
+
|
197
|
+
'sht.Range("B1") = strOutput
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
'結果をクリップボードに出力
|
202
|
+
|
203
|
+
Dim objClip As New DataObject
|
204
|
+
|
205
|
+
With objClip
|
206
|
+
|
207
|
+
.SetText strOutput 'クリップボードにセットする値を指定
|
208
|
+
|
209
|
+
.PutInClipboard 'クリップボードに格納
|
210
|
+
|
211
|
+
End With
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
End Sub
|
216
|
+
|
217
|
+
```
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
ソース②:正規表現検索FindEx(メインロジックで使用している為ファンクション名は変更不可)
|
222
|
+
|
223
|
+
```
|
224
|
+
|
225
|
+
'正規表現検索(最終マッチ文字までの文字長を返す)
|
226
|
+
|
227
|
+
Function FindEx(ByVal vsTarget As String, ByVal vsPattern As String) As Integer
|
228
|
+
|
229
|
+
|
230
|
+
|
231
|
+
Dim iIdx As Integer
|
232
|
+
|
233
|
+
Dim objReg As Object
|
234
|
+
|
235
|
+
Dim objMatchs
|
236
|
+
|
237
|
+
|
238
|
+
|
239
|
+
Set objReg = CreateObject("VBScript.RegExp")
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
With objReg
|
244
|
+
|
245
|
+
.Pattern = vsPattern
|
246
|
+
|
247
|
+
.IgnoreCase = True
|
248
|
+
|
249
|
+
.Global = True
|
250
|
+
|
251
|
+
'正規表現検索
|
252
|
+
|
253
|
+
Set objMatchs = .Execute(vsTarget)
|
254
|
+
|
255
|
+
If objMatchs.Count = 0 Then
|
256
|
+
|
257
|
+
'マッチしなかった場合-1
|
258
|
+
|
259
|
+
FindEx = -1
|
260
|
+
|
261
|
+
Else
|
262
|
+
|
263
|
+
'マッチ数を取得
|
264
|
+
|
265
|
+
iIdx = objMatchs.Count - 1
|
266
|
+
|
175
|
-
'
|
267
|
+
'マッチした候補の最終文字列までの文字長を返す
|
176
|
-
|
268
|
+
|
177
|
-
|
269
|
+
FindEx = objMatchs(iIdx).FirstIndex + objMatchs(iIdx).Length
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
If strRest = "" Then
|
182
|
-
|
183
|
-
'未出力文字列がなくなったら終了
|
184
|
-
|
185
|
-
Exit Do
|
186
270
|
|
187
271
|
End If
|
188
272
|
|
189
|
-
Loop
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
'結果をメッセージ表示
|
194
|
-
|
195
|
-
'MsgBox strOutput
|
196
|
-
|
197
|
-
sht.Range("B1") = strOutput
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
End Sub
|
202
|
-
|
203
|
-
```
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
ソース②:正規表現検索FindEx(メインロジックで使用している為ファンクション名は変更不可)
|
208
|
-
|
209
|
-
```
|
210
|
-
|
211
|
-
'正規表現検索(最終マッチ文字までの文字長を返す)
|
212
|
-
|
213
|
-
Function FindEx(ByVal vsTarget As String, ByVal vsPattern As String) As Integer
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
Dim iIdx As Integer
|
218
|
-
|
219
|
-
Dim objReg As Object
|
220
|
-
|
221
|
-
Dim objMatchs
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
Set objReg = CreateObject("VBScript.RegExp")
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
With objReg
|
230
|
-
|
231
|
-
.Pattern = vsPattern
|
232
|
-
|
233
|
-
.IgnoreCase = True
|
234
|
-
|
235
|
-
.Global = True
|
236
|
-
|
237
|
-
'正規表現検索
|
238
|
-
|
239
|
-
Set objMatchs = .Execute(vsTarget)
|
240
|
-
|
241
|
-
If objMatchs.Count = 0 Then
|
242
|
-
|
243
|
-
'マッチしなかった場合-1
|
244
|
-
|
245
|
-
FindEx = -1
|
246
|
-
|
247
|
-
Else
|
248
|
-
|
249
|
-
'マッチ数を取得
|
250
|
-
|
251
|
-
iIdx = objMatchs.Count - 1
|
252
|
-
|
253
|
-
'マッチした候補の最終文字列までの文字長を返す
|
254
|
-
|
255
|
-
FindEx = objMatchs(iIdx).FirstIndex + objMatchs(iIdx).Length
|
256
|
-
|
257
|
-
End If
|
258
|
-
|
259
273
|
|
260
274
|
|
261
275
|
End With
|
4
修正
test
CHANGED
@@ -70,12 +70,24 @@
|
|
70
70
|
|
71
71
|
|
72
72
|
|
73
|
+
ソース①:メインロジック(関数名は任意でOK)
|
74
|
+
|
73
75
|
```
|
74
76
|
|
75
77
|
Sub Test2()
|
76
78
|
|
79
|
+
Dim sht As Worksheet
|
80
|
+
|
81
|
+
Set sht = Sheets("Sheet5") 'シート名は任意に指定
|
82
|
+
|
83
|
+
'Set sht = ActiveSheet 'アクティブシートでマクロ実行する場合はこちらでも可
|
84
|
+
|
85
|
+
|
86
|
+
|
77
87
|
Dim aryPtn As Variant
|
78
88
|
|
89
|
+
Dim ptn As Variant
|
90
|
+
|
79
91
|
aryPtn = Array("、", "。", "★", "」", "」", ")", "\)", "\!", "\?", "!", "?", "・+")
|
80
92
|
|
81
93
|
|
@@ -92,7 +104,9 @@
|
|
92
104
|
|
93
105
|
'セル(A1)から文字列を取得
|
94
106
|
|
107
|
+
'strRest = Sheet5.Range("A1").Value
|
108
|
+
|
95
|
-
strRest =
|
109
|
+
strRest = sht.Range("A1").Value
|
96
110
|
|
97
111
|
|
98
112
|
|
@@ -152,7 +166,9 @@
|
|
152
166
|
|
153
167
|
'切り出した文字列に改行をつけて出力
|
154
168
|
|
155
|
-
strOutput = strOutput & strLine & vbCrLf
|
169
|
+
'strOutput = strOutput & strLine & vbCrLf
|
170
|
+
|
171
|
+
strOutput = strOutput & strLine & vbLf & vbLf
|
156
172
|
|
157
173
|
|
158
174
|
|
@@ -176,13 +192,21 @@
|
|
176
192
|
|
177
193
|
'結果をメッセージ表示
|
178
194
|
|
179
|
-
MsgBox strOutput
|
195
|
+
'MsgBox strOutput
|
196
|
+
|
197
|
+
sht.Range("B1") = strOutput
|
180
198
|
|
181
199
|
|
182
200
|
|
183
201
|
End Sub
|
184
202
|
|
185
|
-
|
203
|
+
```
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
ソース②:正規表現検索FindEx(メインロジックで使用している為ファンクション名は変更不可)
|
208
|
+
|
209
|
+
```
|
186
210
|
|
187
211
|
'正規表現検索(最終マッチ文字までの文字長を返す)
|
188
212
|
|
@@ -258,22 +282,42 @@
|
|
258
282
|
|
259
283
|
今日は、朝から天気が良く、真夏日になるらしいので、
|
260
284
|
|
285
|
+
|
286
|
+
|
261
287
|
熱中症対策には十分気を付けたいです。(笑)
|
262
288
|
|
289
|
+
|
290
|
+
|
263
291
|
庭にブールーベリーやひまわりが植えているので暑くなる前に水やり
|
264
292
|
|
293
|
+
|
294
|
+
|
265
295
|
をしたいと思ます★
|
266
296
|
|
297
|
+
|
298
|
+
|
267
299
|
ブルーベリーの実がなってきて色づいてきたのでもう少ししたら収穫
|
268
300
|
|
301
|
+
|
302
|
+
|
269
303
|
できるのではないかと今から楽しみでなりません!?
|
270
304
|
|
305
|
+
|
306
|
+
|
271
307
|
朝から水やりをした後に近所でラジオ体操をやっているので、
|
272
308
|
|
309
|
+
|
310
|
+
|
273
311
|
姪っ子と甥っ子を連れて、ラジオ体操に今から行ってきます。
|
274
312
|
|
313
|
+
|
314
|
+
|
275
315
|
「眠い」と思わず声にでてしまう時も多々ありますが、
|
276
316
|
|
317
|
+
|
318
|
+
|
277
319
|
さぼらないように頑張りたいと思います。
|
278
320
|
|
279
321
|
|
322
|
+
|
323
|
+
|
3
誤字修正
test
CHANGED
@@ -100,23 +100,29 @@
|
|
100
100
|
|
101
101
|
iLen = -1
|
102
102
|
|
103
|
+
|
104
|
+
|
103
105
|
'ループ処理
|
104
106
|
|
105
107
|
Do
|
106
108
|
|
107
|
-
'31文字
|
109
|
+
'先頭31文字を切り出す
|
108
110
|
|
109
111
|
strLine = Left(strRest, 31)
|
110
112
|
|
111
113
|
|
112
114
|
|
115
|
+
'文字長の初期化
|
116
|
+
|
117
|
+
iLen = -1
|
118
|
+
|
119
|
+
|
120
|
+
|
113
121
|
'置換パターンの数だけループ処理
|
114
122
|
|
115
|
-
iLen = 0
|
116
|
-
|
117
123
|
For Each ptn In aryPtn
|
118
124
|
|
119
|
-
'最後にマッチした区切り文字までの長
|
125
|
+
'最後にマッチした区切り文字までの文字長を調べる
|
120
126
|
|
121
127
|
Dim iLenWk As Integer
|
122
128
|
|
@@ -124,7 +130,7 @@
|
|
124
130
|
|
125
131
|
If iLenWk > iLen Then
|
126
132
|
|
127
|
-
'
|
133
|
+
'長い文字長を採用していく
|
128
134
|
|
129
135
|
iLen = iLenWk
|
130
136
|
|
@@ -136,7 +142,7 @@
|
|
136
142
|
|
137
143
|
If iLen > 0 Then
|
138
144
|
|
139
|
-
'区切り文字が見つかった場合
|
145
|
+
'区切り文字が見つかった場合、文字列を切り出す
|
140
146
|
|
141
147
|
strLine = Left(strLine, iLen)
|
142
148
|
|
@@ -178,7 +184,7 @@
|
|
178
184
|
|
179
185
|
|
180
186
|
|
181
|
-
'正規表現
|
187
|
+
'正規表現検索(最終マッチ文字までの文字長を返す)
|
182
188
|
|
183
189
|
Function FindEx(ByVal vsTarget As String, ByVal vsPattern As String) As Integer
|
184
190
|
|
@@ -204,7 +210,7 @@
|
|
204
210
|
|
205
211
|
.Global = True
|
206
212
|
|
207
|
-
'正規表現
|
213
|
+
'正規表現検索
|
208
214
|
|
209
215
|
Set objMatchs = .Execute(vsTarget)
|
210
216
|
|
@@ -220,7 +226,7 @@
|
|
220
226
|
|
221
227
|
iIdx = objMatchs.Count - 1
|
222
228
|
|
223
|
-
'マッチした候補の最終文字列までの文字長
|
229
|
+
'マッチした候補の最終文字列までの文字長を返す
|
224
230
|
|
225
231
|
FindEx = objMatchs(iIdx).FirstIndex + objMatchs(iIdx).Length
|
226
232
|
|
2
追記(変換結果の記載)
test
CHANGED
@@ -243,3 +243,31 @@
|
|
243
243
|
|
244
244
|
|
245
245
|
参考になれば幸いです。
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
変換結果
|
250
|
+
|
251
|
+
---
|
252
|
+
|
253
|
+
今日は、朝から天気が良く、真夏日になるらしいので、
|
254
|
+
|
255
|
+
熱中症対策には十分気を付けたいです。(笑)
|
256
|
+
|
257
|
+
庭にブールーベリーやひまわりが植えているので暑くなる前に水やり
|
258
|
+
|
259
|
+
をしたいと思ます★
|
260
|
+
|
261
|
+
ブルーベリーの実がなってきて色づいてきたのでもう少ししたら収穫
|
262
|
+
|
263
|
+
できるのではないかと今から楽しみでなりません!?
|
264
|
+
|
265
|
+
朝から水やりをした後に近所でラジオ体操をやっているので、
|
266
|
+
|
267
|
+
姪っ子と甥っ子を連れて、ラジオ体操に今から行ってきます。
|
268
|
+
|
269
|
+
「眠い」と思わず声にでてしまう時も多々ありますが、
|
270
|
+
|
271
|
+
さぼらないように頑張りたいと思います。
|
272
|
+
|
273
|
+
|
1
修正
test
CHANGED
@@ -20,43 +20,41 @@
|
|
20
20
|
|
21
21
|
(ループ1開始 ~対象文字列がなくなるまでループ処理~)
|
22
22
|
|
23
|
-
②対象文字列から先頭31文字分を切り出す
|
23
|
+
②対象文字列から先頭31文字分を切り出す
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
-
|
27
|
+
(ループ2開始 ~区切り文字の数だけループ処理~)
|
28
|
-
|
28
|
+
|
29
|
-
③切り出した文字列から区切り文字を検索する
|
29
|
+
③切り出した文字列から区切り文字を検索する
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
④区切り文字が含まれていた場合、最後の区切り文字までの文字長を取得
|
33
|
+
④区切り文字が含まれていた場合、最後の区切り文字までの文字長を取得
|
34
|
-
|
34
|
+
|
35
|
-
※全ての区切り文字で最長となる文字数を調べる
|
35
|
+
※全ての区切り文字で最長となる文字数を調べる
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
|
39
|
-
|
37
|
+
(ループ2ここまで)
|
40
38
|
|
41
39
|
|
42
40
|
|
43
|
-
⑤
|
41
|
+
⑤対象文字列(31文字)から最大の文字長となる区切り位置までの文字列を切り出す
|
44
|
-
|
42
|
+
|
45
|
-
※区切り文字がひとつも見つからなかった場合、対象文字(31文字)をそのまま使用とする
|
43
|
+
※区切り文字がひとつも見つからなかった場合、対象文字(31文字)をそのまま使用とする
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
|
45
|
+
|
46
|
+
|
49
|
-
⑥⑤で切り出した文字列に改行をつけて出力用文字列に連結する
|
47
|
+
⑥⑤で切り出した文字列に改行をつけて出力用文字列に連結する
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
|
49
|
+
|
50
|
+
|
53
|
-
⑦出力した文字数分、対象文字列の先頭を削る
|
51
|
+
⑦出力した文字数分、対象文字列の先頭を削る
|
54
|
-
|
52
|
+
|
55
|
-
⇒これが次回の対象文字列となります。
|
53
|
+
⇒これが次回の対象文字列となります。
|
56
|
-
|
57
|
-
|
58
|
-
|
54
|
+
|
55
|
+
|
56
|
+
|
59
|
-
⑧対象文字列がなくなったらループ1終了
|
57
|
+
⑧対象文字列がなくなったらループ1終了
|
60
58
|
|
61
59
|
(ループ1ここまで)
|
62
60
|
|