- ベストアンサー
Excel: 複数セルの内容を一つに連結するマクロ
複数セルの内容を一つに連結するマクロの書き方を教えてください。例えば、セルの内容が以下で、 A1:apple A2:orange A3:banana A1からA3を選んだ状態でマクロを実行すると、 先頭のセル(ここではA1)に連結された内容が 以下のように代入され、先頭セル以外はクリア されるようにします。 apple<改行> orange<改行> banana<改行> 選択範囲の行(横方向)の大きさは可変 ですが、列(縦方向)は1列のみです。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1列の場合は下に、2列以上選択している場合(A1:C2 等)は A1→B1→C1→A2→B2→C2 のように繋ぎます。 Sub Test() Dim r As Range, s As String For Each r In Selection s = s & r.Text & vbLf r.Clear Next r Selection.Cells(1, 1).Value = Left(s, Len(s) - 1) End Sub
その他の回答 (2)
- papayuka
- ベストアンサー率45% (1388/3066)
ヒントはこの行 → Selection.EntireRow.Delete EntireRow.Delete はご自分で補足に書かれたものですし、ヘルプを見るなどして意味を確認しましょう。 VBE画面で EntireRow の中にカーソルを入れて F1キーを押すとExcel VBAヘルプが起動します。 (標準ではVBAヘルプはインストールされないかも。Office のCDから追加インストール可能) あと、行全体を削除する動作と、特定セルだけを削除する動作をマクロ記録して違いを理解しましょう。
補足
回答ありがとうございます。 ヘルプをインストールして、コードを考えてみました。 結局、Selection範囲の最初のセル以外をDeleteする というのが分からず、以下のようなあまり美しくない コードになってしまいました。 とりあえず目的は達しました。いろいろ教えて頂き ありがとうございます。これを機にVBをもっと勉強 したいと思います。 Sub comb() Dim r As Range, s As String, title As String For Each r In Selection s = s & r.Text & vbLf Next r title = ActiveCell.Offset(0, -1).Value Selection.EntireRow.Delete Selection.Cells(1, 1).Value = Left(s, Len(s) - 1) Selection.Cells(1, 1).Select ActiveCell.Offset(0, -1).Value = title End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
こんな感じ? Sub comb() Dim r As Range, s As String For Each r In Selection s = s & r.Text & vbLf Next r Selection.EntireRow.Delete Selection.Cells(1, 1).Value = Left(s, Len(s) - 1) Selection.Cells(1, 1).Select End Sub
補足
再度の回答ありがとうございます。 試してみました。一つだけ問題がありました。 例えば、B1:B3の範囲を選んだ場合に、文字列の 連結結果がB1に入りますが、現在のコードでは A1の内容もDeleteされています。 A1の位置にはB1:B4の内容のタイトルが書かれている ので、A1はそのまま残しておきたいです。 そのようなコードを教えてください。 重ね重ねの質問で申しわけありませんが、 よろしくお願いします。 --------------------------- A1:TITLE B1:apple --------------------------- B2:orange --------------------------- B3:banana --------------------------- ↓マクロ実行 --------------------------- A1:TITLE B1: apple orange banana ---------------------------
補足
回答ありがとうございます。 さっそくやってみたら、うまく行きました。 さらに、不要になったセルを「クリアする」のでは なくて、「そのセルの属する行全体を消す」ように したいと思いました。また、最後には結果のセル ひとつだけが選択された状態にしたいと思います。 以下の様なコードを書いてみたのですが、うまく いきません。正しい書き方を教えていただけないでしょうか。 よろしくお願いします。 Sub comb() Dim r As Range, s As String For Each r In Selection s = s & r.Text & vbLf Next r For Each r In Selection r.EntireRow.Delete Next r Selection.Cells(1, 1).Value = Left(s, Len(s) - 1) <結果セルのみを選択状態にする> End Sub