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

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

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

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

Q&A

解決済

4回答

6156閲覧

文字列と文字列の間にスペースを挿入する無駄のない方法

beginner_t

総合スコア716

VBA

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

0グッド

0クリップ

投稿2018/10/15 06:05

いつも勉強させていただいております。

表題の件ですが、
エクセルVBAにて、表に入っている文字列をつなげて、変数に入れようとしています。
文字列を繋げる際、文字列と文字列の間には半角スペースを挿入するのですが、
表には空白セルの部分もあり、その場合の処理について悩んでいます。
自分で思いついたのは下記のような方法なのですが、下記以外に効率よく簡潔な方法はないでしょうか?

[方法1]
・変数にセルの値を入れる際に、一緒に半角スペースを入れる

VBA

1Dim max_row As Long 2Dim roop As Long 3 4Dim name_sample As String 5Dim color_sample As String 6Dim type_sample As String 7Dim num_sample As String 8Dim total_sample As String 9 10max_row = Sheets("サンプル").Cells(Rows.Count, "A").End(xlUp).Row 11 12For roop = 2 To max_row 13    name_sample = Sheets("サンプル").Cells(roop, 1) & " " 14 type_sample = Sheets("サンプル").Cells(roop, 2) & " " 15 num_sample = Sheets("サンプル").Cells(roop, 3) & " " 16    color_sample = Sheets("サンプル").Cells(roop, 4) 17 18 total_sample = name_sample & type_sample & num_sample & color_sample 19 20    Sheets("サンプル").Cells(roop, 5) = total_sample 21 22next roop

上記の場合、& " "がついている変数に代入しているセルが空欄の場合、半角スペースから始まってしまったり、半角スペースが連続していまいます。
最終的に置換をかける必要があり、余計なコードが増えてしまいます

[方法2]
・変数の代入を条件で振り分ける

VBA

1Dim max_row As Long 2Dim roop As Long 3 4Dim name_sample As String 5Dim type_sample As String 6Dim num_sample As String 7Dim total_sample As String 8 9 10max_row = Sheets("サンプル").Cells(Rows.Count, "A").End(xlUp).Row 11 12For roop = 2 To max_row 13     if Sheets("サンプル").Cells(roop, 1) <> "" then 14 name_sample = Sheets("サンプル").Cells(roop, 1) & " " 15 else 16 name_sample = "" 17 endif 18 19 if Sheets("サンプル").Cells(roop, 2) <> "" then 20 type_sample = Sheets("サンプル").Cells(roop, 1) & " " 21 else 22 type_sample = "" 23 endif 24 25 if Sheets("サンプル").Cells(roop, 3) <> "" then 26 num_sample = Sheets("サンプル").Cells(roop, 1) & " " 27 else 28 num_sample = "" 29 endif 30 31 color_sample = Sheets("サンプル").Cells(roop, 4) 32 33 34 35 total_sample = name_sample & type_sample & num_sample & color_sample 36 37    Sheets("サンプル").Cells(roop, 4) = total_sample 38 39next roop 40上記の場合、サンプルのように変数が少ないとよいが、変数が10や20と増えた場合にコードが煩雑になり読みにくくなる。 41

このような方法以外で簡潔にわかりやすい考え方がないでしょうか?
初心者で稚拙な質問ですが、よろしくお願いいたします。

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

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

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

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

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

tabuu

2018/10/15 06:22

VBAだと逆にやりにくいかもだけど、配列に文字列を格納して、最後に展開するときにスペースを入れる、とか。
guest

回答4

0

自己解決

Join関数を利用し区切り文字を半角スペースにする。
配列内が空の場合、質問欄と同様に連続して半角スペースが存在してしまうので、
その対処としてApplication.WorksheetFunction.Trim(変数名)を利用することによって、
文字列間に連続して存在している半角スペースが1つにまとめられる。

自己解決になりましたが、ご回答ありがとうございました。

投稿2018/10/16 02:30

beginner_t

総合スコア716

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

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

ttyp03

2018/10/16 02:41

ワークシート関数のTrimだと間のスペースも処理してくれるんですね。知らなかった…。 逆に勉強になりました。 じゃあ2ステップくらいで処理できてしまいますね。
beginner_t

2018/10/16 02:52

私も全く知りませんでした。 より簡単な方法が見つかってよかったです。
sazi

2018/10/16 03:04 編集

TEXTJOIN(" ", TRUE, A1:G2 ) というように範囲が指定でき、 また、TRUE :文字列が空欄の場合、区切り文字をつけない とすることで、Trimは不要にできます
beginner_t

2018/10/16 04:47

TEXTJOINはVBAで使用できますか?コードをいれてみたのですが、構文エラーで使えないです。。。
sazi

2018/10/16 05:18

WorksheetFunction.TextJoinで使用できませんか?
sazi

2018/10/16 05:35 編集

>ttyp03 さん 混同するからReplace()の方が良いんじゃないでしょうか。
beginner_t

2018/10/16 06:22

使用できないようです。
sazi

2018/10/16 06:50

試してみました。確かに実行時にエラーになりますね。クイックヒントは表示されるので、認識はされていると思うのですが・・・
guest

0

確実に処理するのであれば方法2でしょうか。
但し列ごとに処理するのは効率が悪いので、横方向もループさせるとよいでしょう。

VBA

1For roop = 2 To max_row 2 total_sample = "" 3 For roop2 = 1 To 4 4 If Trim(Cells(roop, roop2)) <> "" Then 5 total_sample = total_sample & Trim(Cells(roop, roop2)) & " " 6 End If 7 Next 8 Debug.Print Trim(total_sample) 9Next

投稿2018/10/15 07:09

ttyp03

総合スコア16996

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

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

beginner_t

2018/10/15 12:27

ご回答ありがとうございます。
guest

0

2016以降なら、TEXTJOIN関数が使用できます。

2013以前なら下記で自作関数を紹介されています。
textjoin関数の使い方とExcel2013以前の古いエクセルで使う方法

投稿2018/10/15 06:55

sazi

総合スコア25138

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

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

beginner_t

2018/10/15 12:24

ご回答ありがとうございます。 教えていただいた関数を調べてみたいと思います。
guest

0

自己解決したならしたで、どのようなコードになったか提示していただくと、いろいろ考えていたであろう人の参考になると思います。

遅ればせながら参考まで

Excel

1Sub test() 2 Dim rng As Range 3 Dim r As Range 4 Dim vResult As Variant 5 6 With Sheets("Sheet1").Range("A1").CurrentRegion 7 Set rng = Intersect(.Cells, .Offset(1)) 8 End With 9 10 For Each r In rng.Rows 11 With WorksheetFunction 12 vResult = .Trim(Join((.Transpose(.Transpose(r))), " ")) 13 End With 14 With r 15 .Cells(1).Offset(, .Columns.Count).Value = vResult 16 End With 17 Next 18End Sub

投稿2018/10/16 10:32

mattuwan

総合スコア2136

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問