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

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

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

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

Q&A

解決済

1回答

2890閲覧

半角スペース区切りを認識して必要なデータを出力したい

pro-poke5

総合スコア46

VBA

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

0グッド

0クリップ

投稿2018/08/09 06:23

こんにちわ

Excelでマクロ(VBA)をかいています。

・やりたいこと
テキストファイルを読み込んで、必要なデータのみを出力したい

テキストファイルにはある程度法則性のある文字があります

txt

1 ああ いい うううう ええええ おおおお 2123456789012   あいうえお   2018/08/09 日本 日本 3                000000000 4終了

このようなテキストファイルがあります。
スペースがあるのですがわかりやすくすると下のような形です。

txt

1****ああ□いい*****うううう*ええええ***おおおお*** 2123456789012***あいうえお***2018/08/09***日本□日本 3************************000000000 4終了 5

この4行が、「ああ」や「いい」の中身だけかえて、同じ形で4行ずつたくさん存在しています。
*が半角スペース、□が全角スペースです。
スペースの数は必ず同じですが、「ああ」や「いい」は必ずしも2文字ではありません。
(「うううう」「ええええ」などは必ず4文字ですが)

これらを最終的にCSVで

ああ□いい,123456789012,あいうえお,日本□日本

の4項目だけ抽出したいです。
また、txtの4行が中身を変えてたくさんあるイメージなので、

出力の最終イメージは

ああ□いい,123456789012,あいうえお,日本□日本
なな□にに,987654321098,なにぬねの,中国□中国
は□ひひひ,5432109876543,はひふへほ,露西亜□露西亜
…more

のいうイメージです。(ループさせる)
半角スペース何個分、というのをCSV出力時の区切りとしてするには
どうしたらいいでしょうか。

アドバイスお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Split関数で連続空白も1つとして処理してくれるといいのですが、そうはいかないみたいですね。
やり方は色々あると思いますが、以下のサンプルでは連続した空白を1文字の空白に置き換えてから、Splitで分割してみました。
難しいことはしていないので解説はしませんが、わからなければ質問してください。

VBA

1Sub sample() 2 Dim a(3) As String 3 a(0) = " ああ□いい うううう ええええ おおおお " 4 a(1) = "123456789012 あいうえお 2018/08/09 日本□日本" 5 a(2) = " 000000000" 6 a(3) = "終了" 7 8 result = "" 9 10 ' 1行目の連続空白を削除 11 a(0) = DeleteMultiSpace(a(0)) 12 ' 2行目の連続空白を削除 13 a(1) = DeleteMultiSpace(a(1)) 14 15 ' 1行目から必要な情報抽出 16 cols = Split(a(0), " ") 17 result = result & cols(1) & "," 18 19 ' 2行目から必要な情報抽出 20 cols = Split(a(1), " ") 21 result = result & cols(0) & "," & cols(1) & "," & cols(3) 22 23 ' 結果 24 Debug.Print result 25 26End Sub 27 28Function DeleteMultiSpace(str As String) As String 29 DeleteMultiSpace = str 30 While InStr(DeleteMultiSpace, " ") > 0 31 DeleteMultiSpace = Replace(DeleteMultiSpace, " ", " ") 32 Wend 33End Function 34

投稿2018/08/09 07:05

ttyp03

総合スコア16996

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

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

pro-poke5

2018/08/09 07:21

回答ありがとうございます。 テキストファイルは、このマクロと同じフォルダにある.txtファイルをダイヤログで選択しファイルを取り込みます。その場合、a(0) = …の部分はどうかけばよいのでしょうか…。+
ttyp03

2018/08/09 07:26

それはこの質問とは関係ないのでノーコメントとしておきます。 あくまでも「連続した空白を含む文字列から値を切り出す方法」の回答になります。 ファイルから読み込む方法がわからないのであれば、別途質問をあげてください。
pro-poke5

2018/08/09 09:00

ありがとうございます。1つききたいのが、最初のほうにある result ="" はなぜ必要なのでしょうか。 またcolsは一時的な変数という認識でだいじょうぶでしょうか?
ttyp03

2018/08/09 09:05

>result ="" はなぜ必要なのでしょうか 明示的に初期化しています。 VBAの場合、必ず初期化されているので実質不要ですが、初期値というのはコンピューター任せにせず、極力見てわかる形で書いておいたほうがわかりやすいです。 >またcolsは一時的な変数という認識でだいじょうぶでしょうか? 一時的な変数の認識で大丈夫ですが、おそらく変数宣言をしていないことを気にしていられるのだと思います。 サンプルなので宣言を端折りましたが、きちんと書くなら宣言したほうが余計なバグが防げます。 あわせてコード内冒頭で Option Explicit を宣言しておきましょう。
pro-poke5

2018/08/09 09:18

ありがとうございます。 1つ疑問なのですが、DeleteMultiSpaceでスペースを削除しており、 そのあとのcols = Split(a(0), " ")でスペースで区切っていると思うのですが DeleteMultiSpaceは連続しているスペースだけ削除し、スペースを一つだけ残してくれるものなのでしょうか? DeleteMultiSpaceで調べたのですがいまいちよくわからなくて… すみません。
ttyp03

2018/08/09 09:20

DeleteMultiSpaceは独自に関数を作成しています。 回答したコードの下の方にありますので確認してみてください。
pro-poke5

2018/08/10 03:28 編集

ありがとうございます。関数を独自に作っていたのですね、気づかずすみません。 そして、たびたびすみません、 colsという変数を使い、スペースで区切られた配列の1つめ2つめというのはわかるのですが、 cols = Split(a(1), " ")というのはcols(0)~(3)すべてに適用させたいという意図で大丈夫でしょうか?そこが、配列には割り当てられませんというエラーが出てうまくいきません。 何が原因でしょうか…? 配列ひとつひとつに定義をさせる必要があるのでしょうか
pro-poke5

2018/08/10 03:53

colsをstring型にしていたのが原因でした。Variant型にしましたら解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問