• 締切済み

エクセルVBA でセルの結合

久しぶりに質問したいことがあります。 初歩的なVBA操作しかできない者です。 以下のようなマクロを組みたいのですがどのようにしたらよいでしょうか?      A       B         C 1   東京 2   東京 3   京都 4   京都 5   京都 6   埼玉 7   埼玉 ・   ・ ・   ・ ・   ・ 上の状態から下のようにしたい     A        B        C   -------- 1    東京 2   --------  3 4  京都 5    -------- 6    埼玉 7   -------- ・   ・ ・   ・ ・   ・ (最終行は任意) B列で同じ項目名のセルを結合したいです。 B列は名前順に並び替えられていて、1~10行ぐらいで同じ項目名があり行数は共に任意です。 なおイメージ図の「------」はセル結合のイメージですので、実際には 実践で囲います。 分かりづらし説明で申し訳ありませんがよろしくお願いします。

みんなの回答

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.7

#6です。 間違いがあったので、改めて投稿します。 Sub test9999()   Dim myLastRow As Long   Dim i As Long      myLastRow = Cells(Rows.Count, "B").End(xlUp).Row      Application.ScreenUpdating = False   For i = 1 To myLastRow     With Cells(i + 1, "B")       If Cells(i, "B").Value <> .Value Then         With .Borders(xlEdgeTop)           .LineStyle = xlContinuous           .Weight = xlThin           .ColorIndex = xlAutomatic         End With       Else         .Borders(xlEdgeTop).LineStyle = xlNone         .Font.ColorIndex = 2 '白       End If     End With   Next i   Range("B1:B" & myLastRow).BorderAround _     LineStyle:=xlContinuous, _     Weight:=xlThin, _     ColorIndex:=xlAutomatic   Application.ScreenUpdating = True End Sub

urbt86703
質問者

お礼

お返事ありがとうございます。 わざわざ他の方と違う記述をしていただき、 また画像を添付していただきありがとうございました。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.6

多数の回答が出ているので、 あえて別の視点で回答します。 私はセルの結合を行うことは極力避けるようにしています。 というのも、フィルターや並べ替えといった操作上の不都合が 多いからです。 以下は、セル結合せずに同じ項目名のセルのフォントを白色に 設定する例です。 Sub test999()   Dim myLastRow As Long   Dim i As Long   Dim mySide As Variant      myLastRow = Cells(Rows.Count, "B").End(xlUp).Row      Application.ScreenUpdating = False   For i = 1 To myLastRow     If Cells(i, "B").Value <> Cells(i + 1, "B").Value Then       With Cells(i + 1, "B").Borders(xlEdgeTop)         .LineStyle = xlContinuous         .Weight = xlThin         .ColorIndex = xlAutomatic       End With     Else       Cells(i + 1, "B").Font.ColorIndex = 2 '白     End If   Next i   With Range("B1:B" & myLastRow)     For Each mySide In Array(xlEdgeTop, xlEdgeLeft, _                   xlEdgeBottom, xlEdgeRight)       With .Borders(mySide)         .LineStyle = xlContinuous         .Weight = xlThin         .ColorIndex = xlAutomatic       End With     Next mySide   End With   Application.ScreenUpdating = True End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 >実践で囲います。 実践で囲うというのは、罫線で囲うことと解釈しました。 ご質問の中で、B列と書いてありましたので、Cells(n,2) というように、列数は2になっています。 '------------------------------------------- Sub MergeTest1() Dim n As Long Dim m As Long Dim k As Variant   n = 1: m = n + 1   'B列で比較   Do Until Cells(n, 2).Value = "" And Cells(m, 2).Value = ""     If Not Cells(n, 2).Value Like Cells(m, 2).Value Then       With Cells(n, 2).Resize(m - n)       Application.DisplayAlerts = False         .Merge '結合       Application.DisplayAlerts = True         '罫線で囲う         For Each k In Array(7, 8, 9, 10)           With .Borders(k)             .LineStyle = xlContinuous             .Weight = xlThin             .ColorIndex = 1 '黒           End With         Next       End With       n = m     Else       m = m + 1     End If   Loop End Sub '-------------------------------------------

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

Sub test() Dim i As Long Dim ii As Long i = 1 For ii = 1 To Range("a65536").End(xlUp).Row + 1 If Cells(i, 2).Value <> Cells(ii, 2).Value Then Application.DisplayAlerts = False Cells(i, 2).Resize(ii - i, 1).Merge Application.DisplayAlerts = True i = ii End If Next ii End Sub 参考まで

urbt86703
質問者

お礼

ご回答ありがとうございます。 列については表示の誤りがあり失礼しました。 自分が作ろうとしたものに近いです。 勉強させていただきます。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.3

下記のマクロでどうでしょうか Sub macro() Dim C As Range Dim R As Range Set R = Range("A1") For Each C In Range("A1", Range("A" & Rows.Count).End(xlUp)) If C.Value <> C.Offset(1).Value Then Application.DisplayAlerts = False 'セルの結合 Range(R, C).Merge Application.DisplayAlerts = True '罫線を引く Range(R, C).Borders.Weight = xlThin Set R = C.Offset(1) End If Next C End Sub

urbt86703
質問者

お礼

早速の回答ありがとうございます。 列については表示の誤りがあり失礼しました。 なるほど、こういう記述もあるのですね。 参考にさせていただきます。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

#1 訂正 最後 Application.DisplayAlerts = False ↓ Application.DisplayAlerts = True

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

質問では、A列に「東京」とか入っているが、B列に入っているのか。 A列はそのままで、B列に結合したデータを作りたいのかはっきりしない。 下記は、B列に元データが入っていて、それを結合するようになっているから、自分で意図するように修正してください。 Sub test() Application.DisplayAlerts = False re = Cells(65536, 2).End(xlUp).Row For r = 1 To re r1 = r cl1 = Cells(r1, 2).Value cl2 = Cells(r + 1, 2).Value While cl1 = cl2 r = r + 1 cl2 = Cells(r + 1, 2).Value Wend Range(Cells(r1, 2), Cells(r, 2)).Merge Next Application.DisplayAlerts = False End Sub

urbt86703
質問者

お礼

早速の回答ありがとうございます。 列については説明誤りがあり失礼しました。 早速試してみたいと思います。

関連するQ&A

  • エクセルVBAで、一部のセルの結合をしたい

    エクセルの表で、同じ内容の行を結合したいのですが、一か所の列のみ結合をせずそのままにしておく必要があります。どなたかVBAを教えていただけないでしょうか? イメージとしては次のようになります。 a b c d e 1 g a b c d e 2 g a b c d e 3 g これを下記のようにしたい a b c d e 1 g       2       3 社内システムに入力されているデータをCSVにて抽出しそれをエクセルで加工しているのですが、 aを物件番号とするとb~e,gは物件1件につき一個の項目が入っているのに対し、数字の部分のみ1件につき複数の内容が選択されているのです。そのため、データを抽出すると数字のセル部分以外もすべての行でデータが落ちてくるのです。 そこで、見やすくするために、1~3の内容以外の部分はセルを結合させたいのです。 ここでは3行にしていますが、1行のときもあれば7行くらいになっていることもあります。 列はすべて同じ数になりますが現段階では何列か覚えておりません。すみません。 説明が下手で申し訳ないのですが、わかっていただけるでしょうか? 私はVBAを習い始めたばかりでまったくわからず、自分で作成することができませんでした。ネットで探したものをコピペしてみたりしたのですが、どうもうまくいかず・・・ でもなんとかしたいのです! みなさんのお力をお借りしたいと思います。よろしくお願いします。

  • Excel マクロ 条件によるセルの結合

    テキストだとわかり辛いと思い、 画像を添付させていただきました。 3列の表があり、 A列に1~10までの数字(グループ名)を入力します。 これを、A列の数字が同じ場合、 B列とC列をセル結合したいのですが、 マクロで実現できるでしょうか? (行数は15行くらいあり毎日変わります) (最終行の次の行は空白です) (A列は結合してもしなくても問題ありません) Excel 2007 Windows10を使用しています。 おわかりの方がいらっしゃいましたら、 どうぞよろしくお願い致します。

  • 【エクセル:セル内の文書結合】 右に並んだ全てを結合するには?

    既出でしたら申し訳ございません。 エクセルで下記「サンプルイメージ」での記載状況の際 1行A列のセルに、1行目B列からZZ列に記入された 全ての文書を、結合する方法があれば教えて頂けないでしょうか? 尚、1行A列のセル内の表示方法は、結合するセル毎に改行され、 結合するセルが未記入の場合は、そのセルは結合対象から外したいと 考えています。 以上、わかりにくければ補足いたしますのでご指摘下さい。 ご回答頂ければ幸いです。 サンプルイメージ 下記の通り入力されているものを・・・   <A><B><C><D>・・・・<ZZ> 1)     あ   い   う        わ 2)     あ       う        わ 3)     あ   い   う 4)     あ        このように表示したい   <A><B><C><D>・・・・<ZZ> 1) あ   あ   い   う        わ    い    う    わ 2) あ   あ       う        わ    う    わ 3) あ   あ   い   う    い    う 4) あ   あ        

  • Excelのセルの結合

    ExcelでA1からA8までセルの結合をして、 同じようにB1からB8、C1からC8・・・・とセルの結合をしたいのですが、何か簡単な方法は無いでしょうか? 行数がかなりあるので、「繰り返し」ですときつい感じです。 よろしくお願いします。

  • 結合されたセルの一覧出力 VBA

    お世話になります。 結合されたファイルの一覧を出力したいと思っています。 (できれば、変数に出力したいです) 表があり、ばらばらな範囲で結合されています。 結合した部分には、日付が入っています。 日付が入っている列は、B列とH列で、 その中で「AA」「BB」と入力されている結合セル以外の 結合セル範囲?行?を取得したいと思っております。 B列とH列の結合セル行が同じではありません。 B列は、B5:B13、B18:B25、B30:37 (それ以外のセルは結合してあっても、「AA,BB]と書いてある H列は、H6:H13,H18:H25、H30::H35,H36:H40(上と同じ) ということになっております。 できれば、 1.セル結合範囲を検索(行数取得?) 2.セルの内容が日付かどうか確認 3.日付なら、セル行数を取得 ということがしたいです。 日付の形式は、3/1などのように入っています。 このフォームが結構変わるため、 結合しているセルの中身が日付かどうかを確認し、 日付なら行数取得→色んなプログラムでその行数を使用 したいと思っています。 分かりにくい部分が多いかと思いますが、 回答お願い致します。

  • エクセルでセル結合関数

    以下のことをしたいのですが、 難しくてできません。 どなたか教えてください。 a1 b1 c1 a2 b2 c2 a3 a2 a3 (1)a列に「あ」と入力すると b1とc1セルが結合し、結合したセルに「-」が入る (2)a列に「い」と入力すると b列には自由に文字を入れられる c列には「う」が入る (3)a列にそれ以外がはいるとブランク (1)かつ(2)かつ(3)のことをしたいです。 おそらくc列に =if(a="あ",[b列セルとc列セルを結合した後、-を入力],if(a="い","う","")) だと思うのですが、 [b列セルとc列セルを結合した後、-を入力] がわかりません。 よろしくおねがいします。

  • Wordの表(セルの結合あり。)に貼り付けると、左右凸凹に貼り付く

    質問自体は、実際に見れば簡単なことなんですが、 言葉で書くので煩わしくなってしまいます。 Wordで作っている文章の中に表があります。 ただし、その表は単純な表ではなくて、 セルの分割や結合が行われています。 表自体は長方形をしていますが、セルの結合によって、行によりセルの数が違います。 詳しく書くと、 表は4列で、 列をエクセルのように假に左からA、B、C、Dとすると、 D列はどの行も結合されていません。 1行目は、A1・B1・C1が結合されている状態。 2行目と3行目は、A2とA3が結合されていて、 B2とC2、B3とC3が結合されている。 4・5・6行目は、A4・A5・A6が結合されていて、 B4・C4が結合、B5・B6が結合。 7行目は、(1行目と同じく)A7・B7・C7が結合。 (多分、表を作るときは分割も使ったと思いますが、 説明が面倒になるので、分割という言葉は使いませんでした。) さて、結合がされていないD列に、 エクセルのある列のデータを貼り付けたいと思います。 貼り付けたいデータをコピーして、 上記のWordの表のD列を選んで貼り付けます。 すると、意図に反して、うまくD列に貼り付きません。 どの行でも、必ず、左から2つめのセルに貼り付いてしまいます。 上記のようにセルの結合が行われているために、 左右に凸凹に貼り付いてしまいます。 例えば、 3列になっている2行目や3行目は、結合されている (左から)2つめのセル(B2・C2、B3・C3)に、 4列になっている5行目や6行目は2つめのセル(B列)に貼り付いてしまいます。 このように、行のセルの数にしたがって凸凹に貼りつくのではなく、 行のセルの数にかかわらず縦一直線に貼り付けたいのですが、 どうすればよいでしょうか。 Wordは2000

  • エクセルマクロでセルの結合をしたい

    エクセル2003です。 E列の値は昇順で並んでいます。 先頭E3行から下の行の値と比較し 同じ値の場合はセルを結合し 値が違う場合は結合しないで次の行を比較という処理を 最終行まで行いたいです。 (添付画像参照) 例えば E3-AA E4-BB E5-BB E6-CC E7-DD E8-EE E9-EE E10-EE E11-FF セルE4とE5を結合します セルE8とE9とE10を結合します。 次に結合した行と同じ行数のF列を結合します。 さらに結合した行と同じ行数のG列を結合します。 上記の場合 セルF4とF5を結合、 セルF8とF9とF10を結合します。 セルG4とG5を結合、 セルG8とG9とG10を結合します。 さらに結合した行と同じ行数のA列を結合します。 上記の場合 セルA4とA5を結合、 セルA8とA9とA10を結合します。 さらに結合したA列に数字を入力します A4とA5を結合したA4、A5セルには 2行を結合したので2と入力 セルA8とA9とA10を結合したA8、A9、A10セルには 3行を結合したので3と入力。 とりあえず、E列の結合を完成させてそのE列を 3行目から最終行までコピーして、 「形式を選択して貼付」の「書式」で 書式のみをF,G,A列にコピーすれば出来るのではと 以下の構文を作成しました。 セルの結合時は結合するセルの先頭の行の値が結合済セルの値に なるので最初にE列を結合していく時に A列に結合回数を記入しようと考えました。 ただ2行の結合は、A列に2と入力されたのですが 3行連結した時も2と入力されてしまったので改造しました。 テストデータでは期待しているようになったのですが 本番データでは結合される行が4行、5行等それ以上の行数が 結合する場合が有りこの構文ではなるべくしてなっているのですが 4行以上の行結合はA列の値はいずれも3になってしまいます。 (添付画像参照) どう修正すればいいか手段が考え付きません。 どのような方法がありますでしょうか? よろしくお願いします。 Sub セル結合2() '2013年10月25日 Dim 最終行 As Integer Dim 処理行 As Integer Dim 比較行 As Integer Dim 確認値 As Variant Dim 比較値 As Variant Dim 結合回数 Dim 戻行 Application.ScreenUpdating = False ThisWorkbook.Sheets("Sheet1").Select 最終行 = Cells(Rows.Count, 5).End(xlUp).Row 'F列の最終行を求めます。 Application.DisplayAlerts = False For 処理行 = 3 To 最終行 '3行目から最終行の前まで繰り返します。 比較行 = 処理行 + 1 '処理行の一つ下の行と比較します。→比較行とします。 確認値 = Cells(処理行, 5).MergeArea(1, 1).Value 'チェックする値を、確認値に代入します。 比較値 = Cells(比較行, 5) '比較する値を、比較値に代入します。 If 確認値 = 比較値 Then '値が同じかどうか Range(Cells(比較行, 5), Cells(処理行, 5)).MergeCells = True 結合回数 = Cells(処理行, 1) + 1 'セルを結合した回数 戻行 = 処理行 - 1 '処理行の1行上の行数を戻行とする Cells(処理行, 1) = 結合回数 '処理行のA列に結合回数を記入 Cells(比較行, 1) = 結合回数 '比較理行のA列に結合回数を記入 If Cells(処理行, 1) >= 3 Then 'もしも処理行のA列が3以上の場合 Cells(戻行, 1) = 結合回数 '戻り行のA列に結合回数をセット End If '同じでない場合は以下へ End If '同じでない場合は以下へ Next 処理行 Application.DisplayAlerts = True Application.ScreenUpdating = True Range(Cells(3, 5), Cells(最終行, 5)).Copy Range(Cells(3, 6), Cells(最終行, 6)).PasteSpecial Paste:=xlPasteFormats Range(Cells(3, 7), Cells(最終行, 7)).PasteSpecial Paste:=xlPasteFormats Range(Cells(3, 1), Cells(最終行, 1)).PasteSpecial Paste:=xlPasteFormats Application.CutCopyMode = False MsgBox "終了しました" End Sub

  • エクセルでセルの結合について

    Excel2000を使用してます。 A列B列C列に入力した文字をD列に全て表示させたく、 下記のようにしました。   A列  B列  C列   D列     あ   い    う    あいう(計算式を=A1&B1&C1)   か   き    く    かきく(計算式を=A2&B2&C2)   上記のように、計算式を入れて希望通りの文字表示は 出来るんですが、それをメモ帳などにペーストすると "あいう" "かきく" のように"が入ってしまいます。 置換によって取ろうとしますが、エクセル上では該当がありませんとなります。 メモ帳に一旦ペーストして置換すると、”は取れますが、 横列も長い為エクセルにペーストし直すと、一つのセルに入らず、 複数の行に分かれてしまいます。 ””が入らずに、一つのセルに結合の値を出すには どうしたらよいのでしょうか?

  • 結合セルに結合していないセルの値を貼り付けたいです。

    結合セルに結合していないセルの値を貼り付けたいです。 シート1の1行目の[A1-B1-C1-D1]を結合しています。以下同じように[E1-F1-G1-H1]…のように4つづつ結合しています。 この行に、シート2のA1→B1→C1と続く結合していないセルのデータを貼り付けたいのですが、やりかたがわかりません。色々やってみたのですが、うまくゆきません。ご教授お願いいたします。

専門家に質問してみよう