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

回答編集履歴

6

エレガントなコードに変更

2016/11/25 07:11

投稿

jawa
jawa

スコア3021

answer CHANGED
@@ -92,7 +92,7 @@
92
92
  End If
93
93
 
94
94
  '次の行を作る前に改行を追記
95
- strOutput = strOutput & strLine & vbLf & vbLf
95
+ strOutput = strOutput & vbLf & vbLf
96
96
  Loop
97
97
 
98
98
  ''結果をB1セルに出力

5

エレガントなコードに変更

2016/11/25 07:11

投稿

jawa
jawa

スコア3021

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
- 'strOutput = strOutput & strLine & vbCrLf
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

修正

2016/11/25 07:09

投稿

jawa
jawa

スコア3021

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 = Sheet5.Range("A1").Value
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

誤字修正

2016/11/24 01:06

投稿

jawa
jawa

スコア3021

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

追記(変換結果の記載)

2016/11/22 12:15

投稿

jawa
jawa

スコア3021

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

修正

2016/11/22 12:07

投稿

jawa
jawa

スコア3021

answer CHANGED
@@ -9,25 +9,24 @@
9
9
  ①対象文字列を取得する
10
10
 
11
11
  (ループ1開始 ~対象文字列がなくなるまでループ処理~)
12
- ②対象文字列から先頭31文字分を切り出す
12
+  ②対象文字列から先頭31文字分を切り出す
13
13
 
14
- (ループ2開始 ~区切り文字の数だけループ処理~)
14
+   (ループ2開始 ~区切り文字の数だけループ処理~)
15
- ③切り出した文字列から区切り文字を検索する
15
+    ③切り出した文字列から区切り文字を検索する
16
16
 
17
- ④区切り文字が含まれていた場合、最後の区切り文字までの文字長を取得
17
+     ④区切り文字が含まれていた場合、最後の区切り文字までの文字長を取得
18
- ※全ての区切り文字で最長となる文字数を調べる
18
+    ※全ての区切り文字で最長となる文字数を調べる
19
-
20
- (ループ2ここまで)
19
+   (ループ2ここまで)
21
20
 
22
- 対象文字列(31文字)から最大の文字長となる区切り位置までの文字列を切り出す
21
+   ⑤対象文字列(31文字)から最大の文字長となる区切り位置までの文字列を切り出す
23
- ※区切り文字がひとつも見つからなかった場合、対象文字(31文字)をそのまま使用とする
22
+   ※区切り文字がひとつも見つからなかった場合、対象文字(31文字)をそのまま使用とする
24
23
 
25
- ⑥⑤で切り出した文字列に改行をつけて出力用文字列に連結する
24
+   ⑥⑤で切り出した文字列に改行をつけて出力用文字列に連結する
26
25
 
27
- ⑦出力した文字数分、対象文字列の先頭を削る
26
+   ⑦出力した文字数分、対象文字列の先頭を削る
28
- ⇒これが次回の対象文字列となります。
27
+  ⇒これが次回の対象文字列となります。
29
28
 
30
- ⑧対象文字列がなくなったらループ1終了
29
+   ⑧対象文字列がなくなったらループ1終了
31
30
  (ループ1ここまで)
32
31
 
33
32
  ⑨出力用文字列が変換結果として完成