質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

578閲覧

VBAマクロのsplit関数で、セル内の文章を段落ごとに区切りたいです。

n2023

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2023/05/15 06:45

実現したいこと

VBAのsplit関数で、セル内の文章を段落ごとに区切りたいです。

動作前→動作後のイメージは下記の通りです。(「」は文章の塊を表しており、文章そのものには含まれていません)

(動作前)
「 初めて質問させていただきます。
初心者ですがよろしくお願いいたします。

段落間の空白行は1行だったり、2行だったり、それ以上だったりします。

split関数でなくても同じことが実現できれば大丈夫です。
その場合はコードをいただけるととても助かります。
どうぞよろしくお願いいたします。」


(動作後)

「 初めて質問させていただきます。
初心者ですがよろしくお願いいたします。」
「段落間の空白行は1行だったり、2行だったり、それ以上だったりします。」
「split関数でなくても同じことが実現できれば大丈夫です。
その場合はコードをいただけるととても助かります。
どうぞよろしくお願いいたします」

上記のように段落ごとに分割したいです。段落間の空白行は1行とは限らず、複数行の場合もあります。

前提

VBAで実現したいです。

発生している問題・エラーメッセージ

Dim I As Long Dim Buf As Variant '配列を指定します。 Buf = Split(対象セル, vbLf+) For I = 0 To UBound(Buf) '配列に分割して格納したデータを繰り返します。 MsgBox Buf(I) '分割したデータを順番にメッセージボックスへ表示します。 Next I

だと
vbLf+の表現が正しくない様で、エラーになります。
なお
vbLf+→vbLf
に修正すると
段落ごとではなく、改行ごとに区切ることには成功しています。
例文だと
「初めて質問させていただきます。」
「初心者ですがよろしくお願いいたします。」
「」
「段落間の空白行は1行だったり、2行だったり、それ以上だったりします。」
といった出力結果です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bebebe_

2023/05/15 07:05

実際にどのように使用するかによると思いますが例えば For I = 0 To UBound(Buf) '配列に分割して格納したデータを繰り返します。 If Buf(I) <> "" Then MsgBox Buf(I) '分割したデータを順番にメッセージボックスへ表示します。 End If Next I のように空じゃない場合のみ処理をするようにするのはどうでしょうか もしくは配列から空白を削除するなど
n2023

2023/05/15 07:11

bebebe_様 さっそくのご回答誠にありがとうございます。 その様な発想はありませんでしたので とても参考になったのですが、 ご回答いただいた内容ですと 空白は削除できますが 「初めて質問させていただきます。 初心者ですがよろしくお願いいたします。」 と1つのデータ(段落)で出力したいものが 「初めて質問させていただきます。」 「初心者ですがよろしくお願いいたします。」 と2つのデータ’(行)に分かれて出力されてしまう気がします。
bebebe_

2023/05/15 07:26

すみません、質問の意図を勘違いしていました。 改行のみの行を抽出するとなると改行が連続することになると思うので Buf = Split(Range("A1"), vbLf & vbLf) For I = 0 To UBound(Buf) '配列に分割して格納したデータを繰り返します。 If Buf(I) <> "" Then MsgBox Buf(I) '分割したデータを順番にメッセージボックスへ表示します。 End If Next I ならどうでしょう
n2023

2023/05/15 07:34

bebebe_様 追加のご回答誠にありがとうございます。 こちら動作させたところ、希望通りの結果が得られている様です。 改行が連続している数が、2個だけでなく、3個やそれ以上の場合も混在している場合でも、いただいたコードで対応可能なのでしょうか。(私の方でいろいろなパターンで動作させて確認しようと思っておりますが、取り急ぎご返信したく。) よろしくお願いいたします。 よろしくお願いいたします。  
bebebe_

2023/05/15 08:06

空白行が偶数行だった場合に次の文章の先頭に空白行が残ることになっていました。 hatena19さんの回答のようにする必要がありそうです。
n2023

2023/05/15 08:51

bebebe_ 様 この度は、丁寧にご回答いただき誠にありがとうございました。 とても勉強になりました。 教て頂いたように hatena19様の回答で解決できそうです。 bebebe_様にgoodを送ったりしたかったのですが コメント機能で回答いただいているのでボタンが見つからず お礼の仕方が分からず申し訳ありません。 とても感謝しております。 ありがとうございました。
guest

回答2

0

ベストアンサー

空白行1行が段落区切りとしたら、
空白行1行は、改行&改行 なので、

vba

1Dim I As Long 2Dim Buf As Variant '配列を指定します。 3 4Buf = Split(対象セル.Text, vbLf & vbLf) 5 6For I = 0 To UBound(Buf) '配列に分割して格納したデータを繰り返します。 7 MsgBox Buf(I) '分割したデータを順番にメッセージボックスへ表示します。 8Next I

空白行2行、3行、・・・も段落区切りとするなら、 連続空白行を、1行空白に変換してからSplitすればいいでょしう。

vba

1Dim I As Long 2Dim str As String 3Dim Buf As Variant '配列を指定します。 4 5str = 対象セル.Text 6Do Until InStr(str, vbLf & vbLf & vbLf) = 0 7 str = Replace(str, vbLf & vbLf & vbLf, vbLf & vbLf) 8Loop 9 10Buf = Split(str, vbLf & vbLf) 11 12For I = 0 To UBound(Buf) '配列に分割して格納したデータを繰り返します。 13 MsgBox Buf(I) '分割したデータを順番にメッセージボックスへ表示します。 14Next I

投稿2023/05/15 07:59

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

n2023

2023/05/15 08:52

hatena19様 2つのパターンそれぞれで ご回答いただき誠にありがとうございます。 そのようなやり方があるとは自分で考えたり調べてもたどり着けそうになかったので とても助かりました。 大変感謝しております。 ありがとうございました。
guest

0

質問を誤解していたので修正

VBA

1a = セルの値 2b = "" 3Do While a <> b 4 b = a 5 a = Replace(b, vbLf + vbLf + vbLf, vbLf+ vbLf) 6Loop 7Buf = Split(a, vbLf & vbLf)

で、3つ以上の改行が2つになるので、それから改行2つでsplitします。

あるいは、正規表現の置換を使うか。

VBA

1a = セルの値 2Set RE = CreateObject("VBScript.RegExp") 3RE.Pattern = vbLf & "{3,}" 4RE.Global = True 5Buf = Split(RE.Replace(a, vbLf+vbLf), vbLf & vbLf)

vbLFの連続だけでなく、途中に空白だけの行があり、それもまとめたい場合は同様の方法で出来るかと思います。

投稿2023/05/15 07:23

編集2023/05/15 10:38
otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

n2023

2023/05/15 07:43

otn様 さっそくのご回答誠にありがとうございます。 ご回答いただいたコードですと 複数の改行を単一の改行に置換することができると思うのですが、 その後、splitしても文章から段落を取り出すことができないのではと感じております。 私の解釈が間違っておりましたら申し訳ございません。 よろしくお願いいたします。
otn

2023/05/15 10:25

ああ、質問を勘違いしていました。 修正しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問