dポイントプレゼントキャンペーン実施中!

EXCELの文字列連結について教えてください。

【表】
 A      B     C
あいうえ  ×××   ≫お
くもり   △△△
スカイツ  ○○〇   ≫リー
やまのて  ◆◆◆   ≫せん
オレンジ  ×××

【条件】
・表中、A列の続きがC列に記載されている場合と、記載されていない場合がある。
・記載されている場合、C列の ≫ 以降の文字列を取得し、同じ行にあるA列の文字列最後に連結させたい。
・上記の表におけるA列の文字数は25文字と決まっているが、C列の文字数は決まっていない。
・文字列連結後にA列の文字数が増える(25文字以上になる)のは問題ない。

【質問】
C列で ≫ を検索語、≫ 以降の文字をコピーし、同じ行にあるA列最後の文字と連結させる方法を教えていただけないでしょうか。
C列コピー時に、Len関数とLeft関数を使う or ≫ を検索後、≫を削除してコピーしたらいいのかなと思いましたが、いまいち方法が思いつきません…。
膨大な量があるため、VBAで自動化させたいと思っています。
よろしくお願いいたします。

A 回答 (7件)

こんなのはいかがでしょうか?


-------------------------------------------------------------------------
Sub Sample()
Dim 行 As Long
For 行 = 1 To Cells(Rows.Count, 3).End(xlUp).Row
If Left(Cells(行, 3).Value, 1) = "≫" Then
Cells(行, 1).Value = Cells(行, 1).Value & Mid(Cells(行, 3).Value, 2)
Cells(行, 3).ClearContents
End If
Next
End Sub
-------------------------------------------------------------------------
※ 連結後C列の文字を消去させていますが、残したいのならば「Cells(行, 3).ClearContents」を削除して下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます!
最終行までカウントして繰り返す方法、こんなにすっきりできるんですね。
まだまだ学ばないといけないことが沢山ありますが、ここで皆さんに教えていただいて
本当に助かります。

お礼日時:2016/10/19 13:26

No.4です。


補足します。

>最後の255はどういう事を表しているのでしょう?

この255は、MID関数の3番目の引数で、下式の文字数に該当します。
 MID(文字列,開始位置,文字数)
指定した文字数(=255) ≧ 実際の文字数 の場合、実際の文字数が得られますので、エクセルの仕様から1セルに入力可能な最大文字数の255としました。
しかし、自分の記憶が古く、エクセル95以前は最大255文字だったのですが、エクセル97以降は最大32767文字となるエクセルの仕様変更があったようです。

ということで、『255』を『LEN(C1)』に置き換えるのがよいかもしれません。必要に応じて修正ください。

ちなみに、"≫"をCHAR(8804)に置き換えているのは、マクロからセルに式を入れる場合"(ダブルクォーテーション)が入力できないためです
    • good
    • 0
この回答へのお礼

随分お礼が遅れて申し訳ありません。
1つのセルに入力できる文字数上限もあるんですね!初めて知りました。
ありがとうございます。

お礼日時:2016/11/22 09:35

こんばんは!



すでに回答は出ていますので、参考程度で・・・

Sub Sample1()
Dim i As Long
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
If InStr(Cells(i, "C"), "≫") > 0 Then
With Cells(i, "A")
.Value = .Value & Mid(Cells(i, "C"), InStr(Cells(i, "C"), "≫") + 1, Len(Cells(i, "C")))
End With
End If
Next i
Range("A:A").Columns.AutoFit
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

随分お礼が遅れてしまい申し訳ありません。
ありがとうございます。

お礼日時:2016/11/22 09:35

No.4です。


No.4の回答では結果をD列に書いていましたが、連結した結果はA列に上書きしたい。になっていましたね。
ということで、修正版です。
---------------
Sub 結合()
Dim t0
t0 = Time
start_rw = 1
end_rw = Cells(Rows.Count, 1).End(xlUp).Row
Cells(start_rw, 4) = "=CONCATENATE(A1,MID(C1,IF(ISERROR(FIND(CHAR(8804),C1,1)),0,FIND(CHAR(8804),C1,1))+1,255))"
Range(Cells(start_rw, 4), Cells(start_rw, 4)).Copy Destination:=Range(Cells(start_rw, 4), Cells(end_rw, 4))
Range(Cells(start_rw, 1), Cells(end_rw, 1)).Value = Range(Cells(start_rw, 4), Cells(end_rw, 4)).Value
'D列に式を残す場合は下の1行をリマークにする(消去する)
Range(Cells(start_rw, 4), Cells(end_rw, 4)).Clear
MsgBox ("開始" & t0 & Chr(13) & "終了" & Time)
End Sub
    • good
    • 0

これでいけると思います。


結果をD列に書き込みます。

◆ご参考
・データ開始行は1行目で作っていますが、start_rw により変更できます。
・結果は値(文字列)にしていますが、このマクロはエクセル関数で計算していますので、式を残したい場合はマクロの下から3行目をリマークに変えてください。(消去してもよい)
・『≫』 を CHAR(8804) に置き換えています。うまくいかない場合は、エクセルで使われている『≫』とこの質問で使われた『≫』の文字コードが異なる可能性(似た文字がある)があります。エクセルの関数で『=CODE("≫")』を入力して違っていたら8804をその数字に書き換えてください。

------------------
Sub 結合()
Dim t0
t0 = Time
start_rw = 1
end_rw = Cells(Rows.Count, 1).End(xlUp).Row
Cells(start_rw, 4) = "=CONCATENATE(A1,MID(C1,IF(ISERROR(FIND(CHAR(8804),C1,1)),0,FIND(CHAR(8804),C1,1))+1,255))"
Range(Cells(start_rw, 4), Cells(start_rw, 4)).Copy Destination:=Range(Cells(start_rw, 4), Cells(end_rw, 4))
'セルに式を残す場合は下の1行を消去する(リマークにする)
Range(Cells(start_rw, 4), Cells(end_rw, 4)).Value = Range(Cells(start_rw, 4), Cells(end_rw, 4)).Value
MsgBox ("開始" & t0 & Chr(13) & "終了" & Time)
End Sub
「【EXCEL・VBA】文字列の連結につい」の回答画像4
    • good
    • 0
この回答へのお礼

ありがとうございます!
エクセル関数も使えばいいですね。
エクセルもVBAも苦手で、知識が不足していることを痛感しました。

もしよろしければ教えていただきたいのですが、
=CONCATENATE(A1,MID(C1,IF(ISERROR(FIND(CHAR(8804),C1,1)),0,FIND(CHAR(8804),C1,1))+1,255))
の最後の255はどういう事を表しているのでしょう?

お礼日時:2016/10/19 13:28

あらっ!


ちょいと抜けてしまったようなので訂正です。(汗)

 If Left(Cells(r, 3).Text, 1) = "≫" Then
  str = Cells(r, 1).Text & Mid(Cells(r, 3).Text, 2)
    • good
    • 0

こんにちは


考え方のみですが・・・

C列に文字がある場合は必ず「≫」で始まることが保証されているなら、C列に文字があるか否か(<>"")で判断できますね。
「≫」以外で始まる文字がある可能性もあって、その場合は処理しないのであれば、文字列の1文字目が「≫」かどうかで処理を分岐すればよいでしょう。
また、文字列の連結は2文字目以降を取り出して、普通に行えば良いので、例えば、変数rが行数を示しているとして…

 If Left(Cells(r, 3).Text) = "≫" Then
  str = Cells(r, 1).Text & Mid(Cells(r, 3).Text, 2)
  ~~~ 

のような感じで処理をなされば宜しいのではないでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます!
恥ずかしながら、&で連結できるとは、全く思いつきませんでした!
勉強を初めたばかりですが、こういう類いの考え方が元々苦手なのもあり、とても勉強になります。

お礼日時:2016/10/19 13:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A