- ベストアンサー
エクセルマクロでセル結合処理を行いたい
- エクセル2003で、指定の条件でセル結合処理を行いたいです。E列の値を比較し、同じ値の場合はセルを結合し、値が違う場合は結合しないという処理を最終行まで行いたいです。
- 結合した行と同じ行数のF列とG列を結合し、さらに結合した行と同じ行数のA列に結合回数を記入します。ただし、4行以上の行結合では結合回数が3になってしまう問題が発生しています。
- 修正方法がわからず困っています。どのような方法がありますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ポイント Range("(A:A,E:E,F:F,G:G) 4:5").Merge という記述で、 A4:A5 E4:E5 F4:F5 G4:G5 の4領域を一息にマージできます。 これを実際のコードでは Range("(A:A,E:E,F:F,G:G) " & 比較行 & ":" & 処理行 - 1).Merge のように記しています。 確認値 = 比較値、を切っ掛けにするのではなくて 確認値 <> 比較値、の時に、処理行 と 比較行 の差が2以上なら、 マージします。 (そして、既に同じ大きさのマージが済んでいれば不要なので、 マージエリアの行数が処理行と比較行差と異なる場合だけ) For 処理行 = 3 To 最終行 + 1 1行余計にループするのは最終行を含むマージを実行するのは 処理行 = 最終行 + 1、のタイミングになるからです。 E3がもし空セルだと、E2:E3を基準にマージしてしまいます。 それを避けたいならば、ループの直前の行で、 比較値を、E3とは確実に異なる値に設定しておきます。 比較値 = Cells(3, 5) & "開始値" とか 比較値 = "Hoge" とか。 説明コメントについては、すみませんが、語調を合わせて書くのも失礼かと思うので 殆ど書いていません。 動作は確認しましたが、厳しく検証した訳ではないので、 何か不足がある場合や、望みと異なる場合は、補足してみてください。 Sub セル結合8327309() Dim 最終行 As Integer Dim 処理行 As Integer Dim 比較行 As Integer Dim 確認値 As Variant Dim 比較値 As Variant ' Dim 結合回数 ' Dim 戻行 Application.ScreenUpdating = False Application.DisplayAlerts = False ThisWorkbook.Sheets("Sheet1").Select 最終行 = Cells(Rows.Count, 5).End(xlUp).Row 'E列の最終行を求めます。 比較行 = 2 ' 比較行の初期値を(ループ開始行 - 1 に)設定 For 処理行 = 3 To 最終行 + 1 '3行目から最終行の次まで繰り返します。 ' 'チェックする値を、確認値に代入します。 確認値 = Cells(処理行, 5).MergeArea(1, 1).Value If 確認値 <> 比較値 Then If 処理行 - 比較行 > 1 Then If Cells(比較行, 5).MergeArea.Count <> 処理行 - 比較行 Then Range("(A:A,E:E,F:F,G:G) " & 比較行 & ":" & 処理行 - 1).Merge End If Cells(比較行, 1) = 処理行 - 比較行 End If 比較行 = 処理行 比較値 = 確認値 '比較する値を、比較値に代入します。 End If Next 処理行 Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox "終了しました" End Sub
その他の回答 (1)
- kagakusuki
- ベストアンサー率51% (2610/5101)
回答No.1様の方法以外にも、次の様な方法も御座います。 Sub Macro() Dim I As Long '繰り返し処理用の変数 Dim H As Long 'E列において同じ値が連続している回数 Dim LR As Long '最終行 '最終行を求める際に、「End(xlUp).Row」を用いますと、関数等で空欄になっているセルの行番号や、現在は空欄でも過去においてデータが入っていた事のあるセルの行番号等の、本当の最終行よりも下の行の行番号を求めてしまう場合があるため、次の方法を用います。 LR = Application.Evaluate("MAX(IF(COUNT(E3:INDEX(E:E,ROWS(E:E))),MATCH(9E+307,E:E),0),IF(COUNTIF(E3:INDEX(E:E,ROWS(E:E)),""*?""),MATCH(""*?"",E:E,-1),0))") If LR = 0 Then Exit Sub Application.DisplayAlerts = False For I = 3 To LR H = 0 Do H = H + 1 Loop While Range("E" & I + H) = Range("E" & I) Range("A" & I).Resize(H, 1).Merge Range("E" & I).Resize(H, 1).Merge Range("F" & I).Resize(H, 1).Merge Range("G" & I).Resize(H, 1).Merge Range("A" & I).Value = H I = I + H - 1 Next I Application.DisplayAlerts = True End Sub
お礼
返事が遅れました。 ありがとうございます。
お礼
返事がおくれました。 ありがとうございます。 すでにこの回答を利用して 運用hしております。