回答編集履歴

5

ソース修正

2016/11/25 07:07

投稿

SASAHARA
SASAHARA

スコア247

test CHANGED
@@ -446,9 +446,11 @@
446
446
 
447
447
 
448
448
 
449
- 'B列クリア
449
+ '修正:B列 → B1セルクリア
450
-
450
+
451
- Columns("B").Clear
451
+ 'Columns("B").Clear
452
+
453
+ Range("B1").Clear
452
454
 
453
455
 
454
456
 

4

ソース追加

2016/11/25 07:07

投稿

SASAHARA
SASAHARA

スコア247

test CHANGED
@@ -395,3 +395,287 @@
395
395
  以上、参考になれば幸いです。
396
396
 
397
397
 
398
+
399
+
400
+
401
+ ### 追記3
402
+
403
+ 回答および追記2のソースを一つのボタンで実行できるようにまとめてみました。
404
+
405
+ (言われずともボタン1つで完了させるべきでした。横着してしまいすみません)
406
+
407
+
408
+
409
+ ```VBA
410
+
411
+ ' 改行する指定文字列の定義(増やしたい時は最後尾に「,追加文字列」とする)
412
+
413
+ Private Const strSplit As String = "、,。,?,?,!,!,★,」,(笑),・・・"
414
+
415
+
416
+
417
+ '上記改行する文字列以外で使いそうもない記号・文字
418
+
419
+ Private Const strReplace As String = "□"
420
+
421
+
422
+
423
+ 'ボタン押下処理
424
+
425
+ Private Sub CommandButton1_Click()
426
+
427
+ Dim strA1 As String ' A1の文字列を格納
428
+
429
+ Dim valNewLine As Variant ' 改行指定文字列を格納
430
+
431
+ Dim valSplitA1 As Variant ' A1の文字列を区切ったものを格納
432
+
433
+ Dim strMainSent As String ' A1文字列を色々弄っては格納する文字列
434
+
435
+ Dim strTempSent As String ' strLastSentに入れる前の仮
436
+
437
+ Dim strLastSent() As String ' 最終的に出力するものを格納
438
+
439
+
440
+
441
+ Dim intNum As Integer ' 繰り返した回数
442
+
443
+ Dim blnFlag As Boolean ' フラグ(true:繰り返す、false:条件満たして終了)
444
+
445
+ Dim i As Integer ' For文で使用
446
+
447
+
448
+
449
+ 'B列クリア
450
+
451
+ Columns("B").Clear
452
+
453
+
454
+
455
+ 'A1の長文を格納
456
+
457
+ If Cells(1, 1).Value = "" Then
458
+
459
+ MsgBox ("A1セルに文字がありません。")
460
+
461
+ Exit Sub
462
+
463
+ End If
464
+
465
+ strA1 = Cells(1, 1).Value
466
+
467
+
468
+
469
+ '改行する指定文字列
470
+
471
+ valNewLine = Split(strSplit, ",")
472
+
473
+
474
+
475
+ '指定文字列文繰り返す
476
+
477
+ strMainSent = strA1
478
+
479
+ For Each nl In valNewLine
480
+
481
+ strMainSent = Replace(strMainSent, nl, nl & strReplace)
482
+
483
+ Next nl
484
+
485
+
486
+
487
+ '---------------------------------------
488
+
489
+ ' ここまでで、指定文字列の後ろにすべて
490
+
491
+ ' 使いそうもない記号・文字が加わっている
492
+
493
+ '---------------------------------------
494
+
495
+
496
+
497
+ 'A1の文字列を区切る
498
+
499
+ valSplitA1 = Split(strMainSent, strReplace)
500
+
501
+
502
+
503
+ '色々初期化
504
+
505
+ ReDim strLastSent(0)
506
+
507
+ blnFlag = True
508
+
509
+ intNum = 0
510
+
511
+ strTempSent = ""
512
+
513
+
514
+
515
+ 'A1の文字列を整える
516
+
517
+ Do While blnFlag
518
+
519
+ If intNum <> 0 Then
520
+
521
+
522
+
523
+ '-----------------------------------------
524
+
525
+ ' 文字列の数が問題ないか確認(文字数)
526
+
527
+ ' 文字数ならLen、バイトで見るならLenBを使用
528
+
529
+ ' 今回は文字数で実施してます
530
+
531
+ '-----------------------------------------
532
+
533
+
534
+
535
+ '単体で32文字より大きかった時の処理
536
+
537
+ If Len(strTempSent) > 31 Then
538
+
539
+ ReDim Preserve strLastSent(UBound(strLastSent) + 1)
540
+
541
+ strLastSent(UBound(strLastSent)) = Left(strTempSent, 31)
542
+
543
+ strTempSent = Mid(strTempSent, 32)
544
+
545
+ End If
546
+
547
+
548
+
549
+ '組み合わせで32文字未満かどうかの処理
550
+
551
+ If Len(strTempSent + valSplitA1(intNum)) < 32 Then
552
+
553
+ strTempSent = strTempSent + valSplitA1(intNum)
554
+
555
+ Else
556
+
557
+ '格納配列を増やして最後尾に格納
558
+
559
+ ReDim Preserve strLastSent(UBound(strLastSent) + 1)
560
+
561
+ strLastSent(UBound(strLastSent)) = strTempSent
562
+
563
+ strTempSent = valSplitA1(intNum)
564
+
565
+ End If
566
+
567
+
568
+
569
+ Else
570
+
571
+ '初回のみ
572
+
573
+ strTempSent = valSplitA1(0)
574
+
575
+ End If
576
+
577
+
578
+
579
+ '最終配列か確認
580
+
581
+ If intNum = UBound(valSplitA1) Then
582
+
583
+ blnFlag = False
584
+
585
+
586
+
587
+ '最後の文字列を格納
588
+
589
+ ReDim Preserve strLastSent(UBound(strLastSent) + 1)
590
+
591
+ strLastSent(UBound(strLastSent)) = strTempSent
592
+
593
+ End If
594
+
595
+
596
+
597
+ intNum = intNum + 1
598
+
599
+ Loop
600
+
601
+
602
+
603
+ '出力処理①
604
+
605
+ For i = 1 To UBound(strLastSent)
606
+
607
+ Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
608
+
609
+ Next i
610
+
611
+
612
+
613
+ '---------------------------------------------------------
614
+
615
+ ' もし最終行「さぼらないように頑張りたいと思います。」の後に
616
+
617
+ ' 改行を入れたくなければ以下4行の先頭「'」を外して
618
+
619
+ ' 上記出力処理①のFor~Nextの3行の先頭に「'」をつけてください
620
+
621
+ '----------------------------------------------------------
622
+
623
+ '出力処理②
624
+
625
+ ' For i = 1 To UBound(strLastSent) - 1
626
+
627
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
628
+
629
+ ' Next i
630
+
631
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(UBound(strLastSent))
632
+
633
+
634
+
635
+ '-- ここから追加 --
636
+
637
+
638
+
639
+ 'B1セルにカーソルをあてる
640
+
641
+ Cells(1, 2).Select
642
+
643
+
644
+
645
+ 'コード2
646
+
647
+ Dim buf As String, buf2 As String, CB As New DataObject
648
+
649
+ buf = ActiveCell
650
+
651
+ With CB
652
+
653
+ .SetText buf ''変数のデータをDataObjectに格納する
654
+
655
+ .PutInClipboard ''DataObjectのデータをクリップボードに格納する
656
+
657
+ .GetFromClipboard ''クリップボードからDataObjectにデータを取得する
658
+
659
+ buf2 = .GetText ''DataObjectのデータを変数に取得する
660
+
661
+ End With
662
+
663
+ End Sub
664
+
665
+ ```
666
+
667
+
668
+
669
+ 変更箇所としては、B1セルにカーソルを移動させてからクリップボードにコピーをするようにしました。
670
+
671
+ 処理完了時点でクリップボードにコピーされておりますので、処理完了後に秀丸を開いて張り付ければご希望の処理になっているかと思います。ご確認くださいませ。
672
+
673
+
674
+
675
+ ボタン操作の中にほぼソースを入れてしまったのでまったくもって綺麗とはかけ離れたソースになってしまいました・・・。お好みでプロシージャ分けなどして頂ければと思います。
676
+
677
+
678
+
679
+ 参考になれば幸いです。
680
+
681
+

3

文言修正

2016/11/24 11:15

投稿

SASAHARA
SASAHARA

スコア247

test CHANGED
@@ -384,9 +384,11 @@
384
384
 
385
385
  という方法でご希望の方法が達成されるかと思います。
386
386
 
387
-
387
+ (③実行しても特にアクションとかありませんが、④の貼り付けができます)
388
-
388
+
389
+
390
+
389
- ボタン2作るのが面倒な場合は、セルをコピーするのではなく、中を選択(B1でF2を選択)してからすべてコピペしたのちに秀丸に張り付ければこの現象は回避できます。
391
+ ボタン2作るのが面倒な場合は、セルをコピーするのではなく、中を選択(B1セルでF2を選択)してからすべてコピペしたのちに秀丸に張り付ければこの現象は回避できます。
390
392
 
391
393
 
392
394
 

2

ソース追加

2016/11/24 09:44

投稿

SASAHARA
SASAHARA

スコア247

test CHANGED
@@ -306,7 +306,7 @@
306
306
 
307
307
 
308
308
 
309
- ### 追記
309
+ ### 追記
310
310
 
311
311
 
312
312
 
@@ -321,3 +321,75 @@
321
321
  以上、参考になれば幸いです。
322
322
 
323
323
 
324
+
325
+
326
+
327
+ ### 追記2
328
+
329
+
330
+
331
+ EXCELのB1セルをコピペして秀丸などに張り付けた時に先頭と最後尾に「"」が入ってしまう現象を確認いたしました。
332
+
333
+ おそらく、こちらのサイトが参考になるかと思います[エクセル術](http://excel-magic.com/double-quotation/)
334
+
335
+ こちらのサイトで色々手法が乗っておりますが、その中の「エクセルのコピー時にダイレクトにクリップボード操作するマクロ」が良いのではないかと思いました。
336
+
337
+
338
+
339
+ 上記の方法を現状に合わせるならば、今までのソースをボタン1とするならば、ボタン2を作って以下のソースをボタン2の処理とします。
340
+
341
+ ```VBA
342
+
343
+ 'ボタン2の処理
344
+
345
+ Private Sub CommandButton2_Click()
346
+
347
+ Dim buf As String, buf2 As String, CB As New DataObject
348
+
349
+ buf = ActiveCell
350
+
351
+ With CB
352
+
353
+ .SetText buf ''変数のデータをDataObjectに格納する
354
+
355
+ .PutInClipboard ''DataObjectのデータをクリップボードに格納する
356
+
357
+ .GetFromClipboard ''クリップボードからDataObjectにデータを取得する
358
+
359
+ buf2 = .GetText ''DataObjectのデータを変数に取得する
360
+
361
+ End With
362
+
363
+ End Sub
364
+
365
+
366
+
367
+ ```
368
+
369
+ (ツールの参照設定にある Microsoft Forms 2.0 Object Library を使えるようにする必要あり。私の環境では最初から使えるようになっていたのでもしかしたら設定不要かもしれません)
370
+
371
+
372
+
373
+ これを作成したのち、
374
+
375
+ ① ボタン1押下(これで「今日は、朝から天気が良く、~」の文章が改行してB1に作られる)
376
+
377
+ ② B1セルを選択
378
+
379
+ ③ ボタン2押下
380
+
381
+ ④ 秀丸などに張り付ける
382
+
383
+
384
+
385
+ という方法でご希望の方法が達成されるかと思います。
386
+
387
+
388
+
389
+ ボタン2作るのが面倒な場合は、セルをコピーするのではなく、中を選択(B1でF2を選択)してからすべてコピペしたのちに秀丸に張り付ければこの現象は回避できます。
390
+
391
+
392
+
393
+ 以上、参考になれば幸いです。
394
+
395
+

1

ソース一部修正

2016/11/24 05:45

投稿

SASAHARA
SASAHARA

スコア247

test CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
 
8
8
 
9
+ ※2016/11/24 修正
10
+
11
+
12
+
9
13
  ```VBA
10
14
 
11
15
  ' 改行する指定文字列の定義(増やしたい時は最後尾に「,追加文字列」とする)
@@ -192,22 +196,46 @@
192
196
 
193
197
  End If
194
198
 
199
+
200
+
195
201
  intNum = intNum + 1
196
202
 
197
203
  Loop
198
204
 
199
205
 
200
206
 
201
- '出力処理
207
+ '出力処理① -- 以下、変更箇所
202
208
 
203
209
  For i = 1 To UBound(strLastSent)
204
210
 
205
- Cells(i, 2) = strLastSent(i)
211
+ Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
206
212
 
207
213
  Next i
208
214
 
209
215
 
210
216
 
217
+ '---------------------------------------------------------
218
+
219
+ ' もし最終行「さぼらないように頑張りたいと思います。」の後に
220
+
221
+ ' 改行を入れたくなければ以下4行の先頭「'」を外して
222
+
223
+ ' 上記出力処理①のFor~Nextの3行の先頭に「'」をつけてください
224
+
225
+ '----------------------------------------------------------
226
+
227
+ '出力処理②
228
+
229
+ ' For i = 1 To UBound(strLastSent) - 1
230
+
231
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(i) & vbLf & vbLf
232
+
233
+ ' Next i
234
+
235
+ ' Cells(1, 2).Value = Cells(1, 2).Value & strLastSent(UBound(strLastSent))
236
+
237
+
238
+
211
239
  End Sub
212
240
 
213
241
 
@@ -226,22 +254,40 @@
226
254
 
227
255
  今日は、朝から天気が良く、真夏日になるらしいので、
228
256
 
257
+
258
+
229
259
  熱中症対策には十分気を付けたいです。(笑)
230
260
 
261
+
262
+
231
263
  庭にブールーベリーやひまわりが植えているので暑くなる前に水やり
232
264
 
265
+
266
+
233
267
  をしたいと思ます★
234
268
 
269
+
270
+
235
271
  ブルーベリーの実がなってきて色づいてきたのでもう少ししたら収穫
236
272
 
273
+
274
+
237
275
  できるのではないかと今から楽しみでなりません!?
238
276
 
277
+
278
+
239
279
  朝から水やりをした後に近所でラジオ体操をやっているので、
240
280
 
281
+
282
+
241
283
  姪っ子と甥っ子を連れて、ラジオ体操に今から行ってきます。
242
284
 
285
+
286
+
243
287
  「眠い」と思わず声にでてしまう時も多々ありますが、
244
288
 
289
+
290
+
245
291
  さぼらないように頑張りたいと思います。
246
292
 
247
293
 
@@ -255,3 +301,23 @@
255
301
 
256
302
 
257
303
  参考になれば幸いです。
304
+
305
+
306
+
307
+
308
+
309
+ ### 追記
310
+
311
+
312
+
313
+ ご希望の処理にそっておらず申し訳ございません。
314
+
315
+ 出力処理箇所を修正いたしましたので、お試し頂ければと思います。
316
+
317
+ 出力箇所①、②は最終行の出力に合わせてどちらかを選んで頂ければと思います。
318
+
319
+
320
+
321
+ 以上、参考になれば幸いです。
322
+
323
+