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

回答編集履歴

5

ソース修正

2016/11/25 07:07

投稿

SASAHARA
SASAHARA

スコア247

answer CHANGED
@@ -222,8 +222,9 @@
222
222
  Dim blnFlag As Boolean ' フラグ(true:繰り返す、false:条件満たして終了)
223
223
  Dim i As Integer ' For文で使用
224
224
 
225
- 'B列クリア
225
+ '修正:B列 → B1セルクリア
226
- Columns("B").Clear
226
+ 'Columns("B").Clear
227
+ Range("B1").Clear
227
228
 
228
229
  'A1の長文を格納
229
230
  If Cells(1, 1).Value = "" Then

4

ソース追加

2016/11/25 07:07

投稿

SASAHARA
SASAHARA

スコア247

answer CHANGED
@@ -196,3 +196,145 @@
196
196
  ボタン2作るのが面倒な場合は、セルをコピーするのではなく、中を選択(B1セルでF2を選択)してからすべてコピペしたのちに秀丸に張り付ければこの現象は回避できます。
197
197
 
198
198
  以上、参考になれば幸いです。
199
+
200
+
201
+ ### 追記3
202
+ 回答および追記2のソースを一つのボタンで実行できるようにまとめてみました。
203
+ (言われずともボタン1つで完了させるべきでした。横着してしまいすみません)
204
+
205
+ ```VBA
206
+ ' 改行する指定文字列の定義(増やしたい時は最後尾に「,追加文字列」とする)
207
+ Private Const strSplit As String = "、,。,?,?,!,!,★,」,(笑),・・・"
208
+
209
+ '上記改行する文字列以外で使いそうもない記号・文字
210
+ Private Const strReplace As String = "□"
211
+
212
+ 'ボタン押下処理
213
+ Private Sub CommandButton1_Click()
214
+ Dim strA1 As String ' A1の文字列を格納
215
+ Dim valNewLine As Variant ' 改行指定文字列を格納
216
+ Dim valSplitA1 As Variant ' A1の文字列を区切ったものを格納
217
+ Dim strMainSent As String ' A1文字列を色々弄っては格納する文字列
218
+ Dim strTempSent As String ' strLastSentに入れる前の仮
219
+ Dim strLastSent() As String ' 最終的に出力するものを格納
220
+
221
+ Dim intNum As Integer ' 繰り返した回数
222
+ Dim blnFlag As Boolean ' フラグ(true:繰り返す、false:条件満たして終了)
223
+ Dim i As Integer ' For文で使用
224
+
225
+ 'B列クリア
226
+ Columns("B").Clear
227
+
228
+ 'A1の長文を格納
229
+ If Cells(1, 1).Value = "" Then
230
+ MsgBox ("A1セルに文字がありません。")
231
+ Exit Sub
232
+ End If
233
+ strA1 = Cells(1, 1).Value
234
+
235
+ '改行する指定文字列
236
+ valNewLine = Split(strSplit, ",")
237
+
238
+ '指定文字列文繰り返す
239
+ strMainSent = strA1
240
+ For Each nl In valNewLine
241
+ strMainSent = Replace(strMainSent, nl, nl & strReplace)
242
+ Next nl
243
+
244
+ '---------------------------------------
245
+ ' ここまでで、指定文字列の後ろにすべて
246
+ ' 使いそうもない記号・文字が加わっている
247
+ '---------------------------------------
248
+
249
+ 'A1の文字列を区切る
250
+ valSplitA1 = Split(strMainSent, strReplace)
251
+
252
+ '色々初期化
253
+ ReDim strLastSent(0)
254
+ blnFlag = True
255
+ intNum = 0
256
+ strTempSent = ""
257
+
258
+ 'A1の文字列を整える
259
+ Do While blnFlag
260
+ If intNum <> 0 Then
261
+
262
+ '-----------------------------------------
263
+ ' 文字列の数が問題ないか確認(文字数)
264
+ ' 文字数ならLen、バイトで見るならLenBを使用
265
+ ' 今回は文字数で実施してます
266
+ '-----------------------------------------
267
+
268
+ '単体で32文字より大きかった時の処理
269
+ If Len(strTempSent) > 31 Then
270
+ ReDim Preserve strLastSent(UBound(strLastSent) + 1)
271
+ strLastSent(UBound(strLastSent)) = Left(strTempSent, 31)
272
+ strTempSent = Mid(strTempSent, 32)
273
+ End If
274
+
275
+ '組み合わせで32文字未満かどうかの処理
276
+ If Len(strTempSent + valSplitA1(intNum)) < 32 Then
277
+ strTempSent = strTempSent + valSplitA1(intNum)
278
+ Else
279
+ '格納配列を増やして最後尾に格納
280
+ ReDim Preserve strLastSent(UBound(strLastSent) + 1)
281
+ strLastSent(UBound(strLastSent)) = strTempSent
282
+ strTempSent = valSplitA1(intNum)
283
+ End If
284
+
285
+ Else
286
+ '初回のみ
287
+ strTempSent = valSplitA1(0)
288
+ End If
289
+
290
+ '最終配列か確認
291
+ If intNum = UBound(valSplitA1) Then
292
+ blnFlag = False
293
+
294
+ '最後の文字列を格納
295
+ ReDim Preserve strLastSent(UBound(strLastSent) + 1)
296
+ strLastSent(UBound(strLastSent)) = strTempSent
297
+ End If
298
+
299
+ intNum = intNum + 1
300
+ Loop
301
+
302
+ '出力処理①
303
+ For i = 1 To UBound(strLastSent)
304
+ Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
305
+ Next i
306
+
307
+ '---------------------------------------------------------
308
+ ' もし最終行「さぼらないように頑張りたいと思います。」の後に
309
+ ' 改行を入れたくなければ以下4行の先頭「'」を外して
310
+ ' 上記出力処理①のFor~Nextの3行の先頭に「'」をつけてください
311
+ '----------------------------------------------------------
312
+ '出力処理②
313
+ ' For i = 1 To UBound(strLastSent) - 1
314
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
315
+ ' Next i
316
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(UBound(strLastSent))
317
+
318
+ '-- ここから追加 --
319
+
320
+ 'B1セルにカーソルをあてる
321
+ Cells(1, 2).Select
322
+
323
+ 'コード2
324
+ Dim buf As String, buf2 As String, CB As New DataObject
325
+ buf = ActiveCell
326
+ With CB
327
+ .SetText buf ''変数のデータをDataObjectに格納する
328
+ .PutInClipboard ''DataObjectのデータをクリップボードに格納する
329
+ .GetFromClipboard ''クリップボードからDataObjectにデータを取得する
330
+ buf2 = .GetText ''DataObjectのデータを変数に取得する
331
+ End With
332
+ End Sub
333
+ ```
334
+
335
+ 変更箇所としては、B1セルにカーソルを移動させてからクリップボードにコピーをするようにしました。
336
+ 処理完了時点でクリップボードにコピーされておりますので、処理完了後に秀丸を開いて張り付ければご希望の処理になっているかと思います。ご確認くださいませ。
337
+
338
+ ボタン操作の中にほぼソースを入れてしまったのでまったくもって綺麗とはかけ離れたソースになってしまいました・・・。お好みでプロシージャ分けなどして頂ければと思います。
339
+
340
+ 参考になれば幸いです。

3

文言修正

2016/11/24 11:15

投稿

SASAHARA
SASAHARA

スコア247

answer CHANGED
@@ -191,7 +191,8 @@
191
191
  ④ 秀丸などに張り付ける
192
192
 
193
193
  という方法でご希望の方法が達成されるかと思います。
194
+ (③実行しても特にアクションとかありませんが、④の貼り付けができます)
194
195
 
195
- ボタン2作るのが面倒な場合は、セルをコピーするのではなく、中を選択(B1でF2を選択)してからすべてコピペしたのちに秀丸に張り付ければこの現象は回避できます。
196
+ ボタン2作るのが面倒な場合は、セルをコピーするのではなく、中を選択(B1セルでF2を選択)してからすべてコピペしたのちに秀丸に張り付ければこの現象は回避できます。
196
197
 
197
198
  以上、参考になれば幸いです。

2

ソース追加

2016/11/24 09:44

投稿

SASAHARA
SASAHARA

スコア247

answer CHANGED
@@ -152,10 +152,46 @@
152
152
  参考になれば幸いです。
153
153
 
154
154
 
155
- ### 追記
155
+ ### 追記
156
156
 
157
157
  ご希望の処理にそっておらず申し訳ございません。
158
158
  出力処理箇所を修正いたしましたので、お試し頂ければと思います。
159
159
  出力箇所①、②は最終行の出力に合わせてどちらかを選んで頂ければと思います。
160
160
 
161
161
  以上、参考になれば幸いです。
162
+
163
+
164
+ ### 追記2
165
+
166
+ EXCELのB1セルをコピペして秀丸などに張り付けた時に先頭と最後尾に「"」が入ってしまう現象を確認いたしました。
167
+ おそらく、こちらのサイトが参考になるかと思います[エクセル術](http://excel-magic.com/double-quotation/)
168
+ こちらのサイトで色々手法が乗っておりますが、その中の「エクセルのコピー時にダイレクトにクリップボード操作するマクロ」が良いのではないかと思いました。
169
+
170
+ 上記の方法を現状に合わせるならば、今までのソースをボタン1とするならば、ボタン2を作って以下のソースをボタン2の処理とします。
171
+ ```VBA
172
+ 'ボタン2の処理
173
+ Private Sub CommandButton2_Click()
174
+ Dim buf As String, buf2 As String, CB As New DataObject
175
+ buf = ActiveCell
176
+ With CB
177
+ .SetText buf ''変数のデータをDataObjectに格納する
178
+ .PutInClipboard ''DataObjectのデータをクリップボードに格納する
179
+ .GetFromClipboard ''クリップボードからDataObjectにデータを取得する
180
+ buf2 = .GetText ''DataObjectのデータを変数に取得する
181
+ End With
182
+ End Sub
183
+
184
+ ```
185
+ (ツールの参照設定にある Microsoft Forms 2.0 Object Library を使えるようにする必要あり。私の環境では最初から使えるようになっていたのでもしかしたら設定不要かもしれません)
186
+
187
+ これを作成したのち、
188
+ ① ボタン1押下(これで「今日は、朝から天気が良く、~」の文章が改行してB1に作られる)
189
+ ② B1セルを選択
190
+ ③ ボタン2押下
191
+ ④ 秀丸などに張り付ける
192
+
193
+ という方法でご希望の方法が達成されるかと思います。
194
+
195
+ ボタン2作るのが面倒な場合は、セルをコピーするのではなく、中を選択(B1でF2を選択)してからすべてコピペしたのちに秀丸に張り付ければこの現象は回避できます。
196
+
197
+ 以上、参考になれば幸いです。

1

ソース一部修正

2016/11/24 05:45

投稿

SASAHARA
SASAHARA

スコア247

answer CHANGED
@@ -2,6 +2,8 @@
2
2
  突貫なので全然きれいなソースではないのですが、参考になれば幸いです。
3
3
  ボタンを適当に作って、ボタン押下後の処理となっております。
4
4
 
5
+ ※2016/11/24 修正
6
+
5
7
  ```VBA
6
8
  ' 改行する指定文字列の定義(増やしたい時は最後尾に「,追加文字列」とする)
7
9
  Private Const strSplit As String = "、,。,?,?,!,!,★,」,(笑),・・・"
@@ -95,14 +97,26 @@
95
97
  ReDim Preserve strLastSent(UBound(strLastSent) + 1)
96
98
  strLastSent(UBound(strLastSent)) = strTempSent
97
99
  End If
100
+
98
101
  intNum = intNum + 1
99
102
  Loop
100
103
 
101
- '出力処理
104
+ '出力処理① -- 以下、変更箇所
102
105
  For i = 1 To UBound(strLastSent)
103
- Cells(i, 2) = strLastSent(i)
106
+ Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
104
107
  Next i
105
108
 
109
+ '---------------------------------------------------------
110
+ ' もし最終行「さぼらないように頑張りたいと思います。」の後に
111
+ ' 改行を入れたくなければ以下4行の先頭「'」を外して
112
+ ' 上記出力処理①のFor~Nextの3行の先頭に「'」をつけてください
113
+ '----------------------------------------------------------
114
+ '出力処理②
115
+ ' For i = 1 To UBound(strLastSent) - 1
116
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
117
+ ' Next i
118
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(UBound(strLastSent))
119
+
106
120
  End Sub
107
121
 
108
122
  ```
@@ -112,18 +126,36 @@
112
126
  -------- 出力結果 ここから -------------
113
127
 
114
128
  今日は、朝から天気が良く、真夏日になるらしいので、
129
+
115
130
  熱中症対策には十分気を付けたいです。(笑)
131
+
116
132
  庭にブールーベリーやひまわりが植えているので暑くなる前に水やり
133
+
117
134
  をしたいと思ます★
135
+
118
136
  ブルーベリーの実がなってきて色づいてきたのでもう少ししたら収穫
137
+
119
138
  できるのではないかと今から楽しみでなりません!?
139
+
120
140
  朝から水やりをした後に近所でラジオ体操をやっているので、
141
+
121
142
  姪っ子と甥っ子を連れて、ラジオ体操に今から行ってきます。
143
+
122
144
  「眠い」と思わず声にでてしまう時も多々ありますが、
145
+
123
146
  さぼらないように頑張りたいと思います。
124
147
 
125
148
  -------- 出力結果 ここまで -------------
126
149
 
127
150
  長々となってしまいましたが、要は指定文字列の後ろに指定文字列以外の使いそうもない記号(今回のソースだと□)を置いて、そこから31字以上かどうか判断していく、という方法で作成しました。
128
151
 
129
- 参考になれば幸いです。
152
+ 参考になれば幸いです。
153
+
154
+
155
+ ### 追記
156
+
157
+ ご希望の処理にそっておらず申し訳ございません。
158
+ 出力処理箇所を修正いたしましたので、お試し頂ければと思います。
159
+ 出力箇所①、②は最終行の出力に合わせてどちらかを選んで頂ければと思います。
160
+
161
+ 以上、参考になれば幸いです。