回答編集履歴
6
エレガントなコードに変更
answer
CHANGED
@@ -92,7 +92,7 @@
|
|
92
92
|
End If
|
93
93
|
|
94
94
|
'次の行を作る前に改行を追記
|
95
|
-
strOutput = strOutput &
|
95
|
+
strOutput = strOutput & vbLf & vbLf
|
96
96
|
Loop
|
97
97
|
|
98
98
|
''結果をB1セルに出力
|
5
エレガントなコードに変更
answer
CHANGED
@@ -51,7 +51,6 @@
|
|
51
51
|
Dim strRest As String '未処理の文字列
|
52
52
|
|
53
53
|
'セル(A1)から文字列を取得
|
54
|
-
'strRest = Sheet5.Range("A1").Value
|
55
54
|
strRest = sht.Range("A1").Value
|
56
55
|
|
57
56
|
Dim iLen As Integer
|
@@ -81,9 +80,8 @@
|
|
81
80
|
strLine = Left(strLine, iLen)
|
82
81
|
End If
|
83
82
|
|
84
|
-
'切り出した文字列
|
83
|
+
'切り出した文字列を出力
|
85
|
-
|
84
|
+
strOutput = strOutput & strLine
|
86
|
-
strOutput = strOutput & strLine & vbLf & vbLf
|
87
85
|
|
88
86
|
'切り出した文字列分を未出力文字列から除去
|
89
87
|
strRest = Mid(strRest, Len(strLine) + 1)
|
@@ -92,12 +90,21 @@
|
|
92
90
|
'未出力文字列がなくなったら終了
|
93
91
|
Exit Do
|
94
92
|
End If
|
93
|
+
|
94
|
+
'次の行を作る前に改行を追記
|
95
|
+
strOutput = strOutput & strLine & vbLf & vbLf
|
95
96
|
Loop
|
96
97
|
|
97
|
-
'結果を
|
98
|
+
''結果をB1セルに出力
|
98
|
-
'MsgBox strOutput
|
99
|
-
sht.Range("B1") = strOutput
|
99
|
+
'sht.Range("B1") = strOutput
|
100
|
+
|
100
|
-
|
101
|
+
'結果をクリップボードに出力
|
102
|
+
Dim objClip As New DataObject
|
103
|
+
With objClip
|
104
|
+
.SetText strOutput 'クリップボードにセットする値を指定
|
105
|
+
.PutInClipboard 'クリップボードに格納
|
106
|
+
End With
|
107
|
+
|
101
108
|
End Sub
|
102
109
|
```
|
103
110
|
|
4
修正
answer
CHANGED
@@ -34,9 +34,15 @@
|
|
34
34
|
|
35
35
|
以下、サンプルソースです。
|
36
36
|
|
37
|
+
ソース①:メインロジック(関数名は任意でOK)
|
37
38
|
```
|
38
39
|
Sub Test2()
|
40
|
+
Dim sht As Worksheet
|
41
|
+
Set sht = Sheets("Sheet5") 'シート名は任意に指定
|
42
|
+
'Set sht = ActiveSheet 'アクティブシートでマクロ実行する場合はこちらでも可
|
43
|
+
|
39
44
|
Dim aryPtn As Variant
|
45
|
+
Dim ptn As Variant
|
40
46
|
aryPtn = Array("、", "。", "★", "」", "」", ")", "\)", "\!", "\?", "!", "?", "・+")
|
41
47
|
|
42
48
|
Dim strOutput As String '結果出力用
|
@@ -45,7 +51,8 @@
|
|
45
51
|
Dim strRest As String '未処理の文字列
|
46
52
|
|
47
53
|
'セル(A1)から文字列を取得
|
54
|
+
'strRest = Sheet5.Range("A1").Value
|
48
|
-
strRest =
|
55
|
+
strRest = sht.Range("A1").Value
|
49
56
|
|
50
57
|
Dim iLen As Integer
|
51
58
|
iLen = -1
|
@@ -75,7 +82,8 @@
|
|
75
82
|
End If
|
76
83
|
|
77
84
|
'切り出した文字列に改行をつけて出力
|
78
|
-
strOutput = strOutput & strLine & vbCrLf
|
85
|
+
'strOutput = strOutput & strLine & vbCrLf
|
86
|
+
strOutput = strOutput & strLine & vbLf & vbLf
|
79
87
|
|
80
88
|
'切り出した文字列分を未出力文字列から除去
|
81
89
|
strRest = Mid(strRest, Len(strLine) + 1)
|
@@ -87,10 +95,14 @@
|
|
87
95
|
Loop
|
88
96
|
|
89
97
|
'結果をメッセージ表示
|
90
|
-
MsgBox strOutput
|
98
|
+
'MsgBox strOutput
|
99
|
+
sht.Range("B1") = strOutput
|
91
100
|
|
92
101
|
End Sub
|
102
|
+
```
|
93
103
|
|
104
|
+
ソース②:正規表現検索FindEx(メインロジックで使用している為ファンクション名は変更不可)
|
105
|
+
```
|
94
106
|
'正規表現検索(最終マッチ文字までの文字長を返す)
|
95
107
|
Function FindEx(ByVal vsTarget As String, ByVal vsPattern As String) As Integer
|
96
108
|
|
@@ -128,12 +140,22 @@
|
|
128
140
|
変換結果
|
129
141
|
---
|
130
142
|
今日は、朝から天気が良く、真夏日になるらしいので、
|
143
|
+
|
131
144
|
熱中症対策には十分気を付けたいです。(笑)
|
145
|
+
|
132
146
|
庭にブールーベリーやひまわりが植えているので暑くなる前に水やり
|
147
|
+
|
133
148
|
をしたいと思ます★
|
149
|
+
|
134
150
|
ブルーベリーの実がなってきて色づいてきたのでもう少ししたら収穫
|
151
|
+
|
135
152
|
できるのではないかと今から楽しみでなりません!?
|
153
|
+
|
136
154
|
朝から水やりをした後に近所でラジオ体操をやっているので、
|
155
|
+
|
137
156
|
姪っ子と甥っ子を連れて、ラジオ体操に今から行ってきます。
|
157
|
+
|
138
158
|
「眠い」と思わず声にでてしまう時も多々ありますが、
|
159
|
+
|
139
160
|
さぼらないように頑張りたいと思います。
|
161
|
+
|
3
誤字修正
answer
CHANGED
@@ -49,25 +49,28 @@
|
|
49
49
|
|
50
50
|
Dim iLen As Integer
|
51
51
|
iLen = -1
|
52
|
+
|
52
53
|
'ループ処理
|
53
54
|
Do
|
54
|
-
'31文字
|
55
|
+
'先頭31文字を切り出す
|
55
56
|
strLine = Left(strRest, 31)
|
56
57
|
|
58
|
+
'文字長の初期化
|
59
|
+
iLen = -1
|
60
|
+
|
57
61
|
'置換パターンの数だけループ処理
|
58
|
-
iLen = 0
|
59
62
|
For Each ptn In aryPtn
|
60
|
-
'最後にマッチした区切り文字までの長
|
63
|
+
'最後にマッチした区切り文字までの文字長を調べる
|
61
64
|
Dim iLenWk As Integer
|
62
65
|
iLenWk = FindEx(strLine, ptn)
|
63
66
|
If iLenWk > iLen Then
|
64
|
-
'
|
67
|
+
'長い文字長を採用していく
|
65
68
|
iLen = iLenWk
|
66
69
|
End If
|
67
70
|
Next
|
68
71
|
|
69
72
|
If iLen > 0 Then
|
70
|
-
'区切り文字が見つかった場合
|
73
|
+
'区切り文字が見つかった場合、文字列を切り出す
|
71
74
|
strLine = Left(strLine, iLen)
|
72
75
|
End If
|
73
76
|
|
@@ -88,7 +91,7 @@
|
|
88
91
|
|
89
92
|
End Sub
|
90
93
|
|
91
|
-
'正規表現
|
94
|
+
'正規表現検索(最終マッチ文字までの文字長を返す)
|
92
95
|
Function FindEx(ByVal vsTarget As String, ByVal vsPattern As String) As Integer
|
93
96
|
|
94
97
|
Dim iIdx As Integer
|
@@ -101,7 +104,7 @@
|
|
101
104
|
.Pattern = vsPattern
|
102
105
|
.IgnoreCase = True
|
103
106
|
.Global = True
|
104
|
-
'正規表現
|
107
|
+
'正規表現検索
|
105
108
|
Set objMatchs = .Execute(vsTarget)
|
106
109
|
If objMatchs.Count = 0 Then
|
107
110
|
'マッチしなかった場合-1
|
@@ -109,7 +112,7 @@
|
|
109
112
|
Else
|
110
113
|
'マッチ数を取得
|
111
114
|
iIdx = objMatchs.Count - 1
|
112
|
-
'マッチした候補の最終文字列までの文字長
|
115
|
+
'マッチした候補の最終文字列までの文字長を返す
|
113
116
|
FindEx = objMatchs(iIdx).FirstIndex + objMatchs(iIdx).Length
|
114
117
|
End If
|
115
118
|
|
2
追記(変換結果の記載)
answer
CHANGED
@@ -120,4 +120,17 @@
|
|
120
120
|
End Function
|
121
121
|
```
|
122
122
|
|
123
|
-
参考になれば幸いです。
|
123
|
+
参考になれば幸いです。
|
124
|
+
|
125
|
+
変換結果
|
126
|
+
---
|
127
|
+
今日は、朝から天気が良く、真夏日になるらしいので、
|
128
|
+
熱中症対策には十分気を付けたいです。(笑)
|
129
|
+
庭にブールーベリーやひまわりが植えているので暑くなる前に水やり
|
130
|
+
をしたいと思ます★
|
131
|
+
ブルーベリーの実がなってきて色づいてきたのでもう少ししたら収穫
|
132
|
+
できるのではないかと今から楽しみでなりません!?
|
133
|
+
朝から水やりをした後に近所でラジオ体操をやっているので、
|
134
|
+
姪っ子と甥っ子を連れて、ラジオ体操に今から行ってきます。
|
135
|
+
「眠い」と思わず声にでてしまう時も多々ありますが、
|
136
|
+
さぼらないように頑張りたいと思います。
|
1
修正
answer
CHANGED
@@ -9,25 +9,24 @@
|
|
9
9
|
①対象文字列を取得する
|
10
10
|
|
11
11
|
(ループ1開始 ~対象文字列がなくなるまでループ処理~)
|
12
|
-
|
12
|
+
②対象文字列から先頭31文字分を切り出す
|
13
13
|
|
14
|
-
|
14
|
+
(ループ2開始 ~区切り文字の数だけループ処理~)
|
15
|
-
|
15
|
+
③切り出した文字列から区切り文字を検索する
|
16
16
|
|
17
|
-
|
17
|
+
④区切り文字が含まれていた場合、最後の区切り文字までの文字長を取得
|
18
|
-
|
18
|
+
※全ての区切り文字で最長となる文字数を調べる
|
19
|
-
|
20
|
-
|
19
|
+
(ループ2ここまで)
|
21
20
|
|
22
|
-
|
21
|
+
⑤対象文字列(31文字)から最大の文字長となる区切り位置までの文字列を切り出す
|
23
|
-
|
22
|
+
※区切り文字がひとつも見つからなかった場合、対象文字(31文字)をそのまま使用とする
|
24
23
|
|
25
|
-
|
24
|
+
⑥⑤で切り出した文字列に改行をつけて出力用文字列に連結する
|
26
25
|
|
27
|
-
|
26
|
+
⑦出力した文字数分、対象文字列の先頭を削る
|
28
|
-
|
27
|
+
⇒これが次回の対象文字列となります。
|
29
28
|
|
30
|
-
|
29
|
+
⑧対象文字列がなくなったらループ1終了
|
31
30
|
(ループ1ここまで)
|
32
31
|
|
33
32
|
⑨出力用文字列が変換結果として完成
|