[[20180723100727]] 『複数セルの文字列を連結する方法』(にゅるん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数セルの文字列を連結する方法』(にゅるん)

よくA列にひたすらデータを入力していって、これらを「、」などで区切って1行にしたものをコピペして他のソフトに貼り付けると言った作業をするのですが、連結するのが結構手間です。

最短で作業するにはどんな方法が良いと思いますか。件数は多くても20件程度です。

データの例(型などの決まりは特にありません。)
1開始
2右に1歩
32歩
4ジャンプ
5終了

普段やっている方法は、
1.B1に「=A1&"、"」を書いてオートフィル
2.適当なセルに「=CONCATENATE(」を打ち込み
3.右手でB1クリック→左手で「,」入力→右手でB2クリック→以下略
です。

「A1:A20」という指定方法が使えれば楽になるのになぁと常々思うのですが・・・

2016ではTEXTJOIN関数なるものが増えたようですが、使えない環境です。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 B1セルに
 =A1
 B2セルに
 =B1&","&A2
 と入力しB2セルを下へフィルピー、ではどうか?
 なお、TEXTJOIN関数はOFFICE2016(買い切り)のEXCEL2016では使えず、OFFICE365(使用料を払っている期間だけ使用できる)
 のEXCEL2016でしか使用できない。
(ねむねむ) 2018/07/23(月) 10:38

シートモジュールに、以下のマクロを仕込んでおいて、範囲指定後に右クリックするとコピー、という手もあります。
 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Dim R As Range
    Dim cw As String

    If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub

    For Each R In Target
        If R.Column = 1 And R.Value <> "" Then
            If cw <> "" Then
                cw = cw & "、"
            End If
            cw = cw & R.Value
        End If
    Next R

    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText cw
        .PutInClipboard
    End With
    Cancel = True
 End Sub
(???) 2018/07/23(月) 11:09

B1に自動作成するマクロです。
ボタンか何かに登録しておけば一瞬です。
参考になれば幸いです。

Sub 回答例()

    Dim i As Long, Lr As Long
    With ThisWorkbook.Sheets("Sheet1")
        .Range("B1") = ""
        Lr = .Cells(Rows.Count, "A").End(xlUp).Row
        For i = 1 To Lr
            If .Range("B1") = "" Then
                .Range("B1") = .Cells(i, "A").Value
            Else
                .Range("B1") = .Range("B1").Value & "、" & .Cells(i, "A").Value
            End If
        Next i
    End With
End Sub

(TAKA) 2018/07/23(月) 11:20


 すまない、区切り文字は"、"だったか。
 =B1&","&A2
 を
 =B1&"、"&A2 
 に修正してくれ。
(ねむねむ) 2018/07/23(月) 11:36

すみません先ほどのコードの条件分岐は無駄ですね。
こちらのほうがスマートです。

Sub Macro2()

    Dim i As Long, Lr As Long
    With ThisWorkbook.Sheets("Sheet1")
        .Range("B1") = .Range("A1").Value
        Lr = .Cells(Rows.Count, "A").End(xlUp).Row
        For i = 2 To Lr
                .Range("B1") = .Range("B1").Value & "、" & .Cells(i, "A").Value
        Next i
    End With
End Sub

(TAKA) 2018/07/23(月) 11:48


>他のソフトに貼り付ける
>「A1:A20」という指定方法が使えれば楽になるのになぁと常々思う

要は、そのままブックを保存して取っておくんじゃ無くて、入力欄として使い捨てするんですよね。
ある程度マクロの使用に抵抗がなくて、連続するセル範囲という限定が付きますけど、ユーザー定義関数作っちゃうのはどうです?

    Function TEXTJOINもどき(セル範囲 As Range, 区切文字 As String)
        Dim buf As String
        Dim tmp As Variant

        For Each tmp In セル範囲
            buf = buf & tmp.Value & 区切文字
        Next tmp

        TEXTJOINもどき = Left(buf, Len(buf) - 1)
    End Function

マクロに全然抵抗がないなら???さんのように取り込みたい(複数可(というか元々複数セル希望ですよね)、連続して無くてもok)セルを選択してから右クリックすると、クリップボードにデータを送り込むようにしてしまえば手間が無くていいとおもいますが。。。

(もこな2) 2018/07/23(月) 12:47


ねむねむ様
> B1セルに
> =A1
> B2セルに
> =B1&","&A2
> と入力しB2セルを下へフィルピー、ではどうか?
言われてみればそのとおりです!

他の回答者の方々
質問文作成中に消してしまっていたのですが、様々な環境で使う場合にささっと作る方法がしりたかったので、標準関数のみでの実現を求めていました。
お手数掛けまして申し訳ございませんでした。

以上、ありがとうございました。
(にゅるん) 2018/07/23(月) 13:07


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.