- ベストアンサー
VBAで結合行を削除した際に値を残す方法
- VBAで商品タイプの結合行を削除する際に、セルの内容を保持する方法について教えてください。
- 質問者は、商品タイプが結合されたセルに商品名が入力されている表を作成し、特定の商品の行を別のシートにコピーしたいと考えています。
- しかし、結合行を削除すると結合されたセルの1行目が削除され、新しいシート上で商品タイプが空欄になってしまいます。解決策はありますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! >特定商品の行だけを別のシートにコピーしたい。 すなわちB列の「特定商品」のみを別Sheetに表示したい! というコトでしょうか? 一例です。 ↓の画像のように左側がSheet1で右側のSheet2に表示するようにしてみました。 (画像ではSheet1のB列の「あ」という商品のみを表示するようにしています) マクロでインプットボックスに「特定商品」を入力するようにしました。 標準モジュールです。 Sub Sample1() Dim i As Long, lastRow As Long, str As String, wS As Worksheet Set wS = Worksheets("Sheet2") Application.ScreenUpdating = False wS.Cells.Clear With Worksheets("Sheet1") lastRow = .Cells(Rows.Count, "B").End(xlUp).Row str = Application.InputBox("検索商品名を入力") .Range("A:A").Insert .Range("A1") = .Range("B1") With Range(.Cells(2, "A"), .Cells(lastRow, "A")) .Formula = "=IF(B2="""",A1,B2)" .Value = .Value End With .Columns("B:B").Hidden = True .Range("A1").AutoFilter field:=3, Criteria1:=str .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy wS.Range("A1") Application.DisplayAlerts = False For i = wS.Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1 If wS.Cells(i, "A") = wS.Cells(i - 1, "A") Then wS.Cells(i - 1, "A").Resize(2).Merge End If Next i Application.DisplayAlerts = True wS.Range("A:A").HorizontalAlignment = xlCenter wS.Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous .AutoFilterMode = False .Columns.Hidden = False .Range("A:A").Delete End With Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m
その他の回答 (1)
- eden3616
- ベストアンサー率65% (267/405)
添付画像のようなテストデータで行っています。 アクティブシートを隣へコピーし、結合セル解除後の空欄を各先頭項目で埋めてから、 偶数行を削除(ここは目的の削除方法に置き換えてください)して、同じ項目を再結合しています。 コード内の「'値の設定」項目で変数「strow」と「mycol」を適切に修正してからマクロ「sample」を実行してください。 ■VBAコード Sub sample() Dim i As Long Dim tar As Range Dim row_max As Long Dim key As String Dim strow As Long Dim mycol As String '値の設定 strow = 2 'データの開始行 mycol = "A" '結合セルの列記号 '画面更新停止 Application.ScreenUpdating = False 'シートコピー ActiveSheet.Copy after:=ActiveSheet '結合セル解除 Columns(mycol).UnMerge '最大行数取得 row_max = Cells(Rows.Count, mycol).Offset(0, 1).End(xlUp).Row '初期値セット Set tar = Cells(strow, mycol) '空白を埋める Do Set tar = Range(tar, tar.End(xlDown).Offset(-1, 0)) If tar(tar.Count).Row > row_max Then Set tar = tar.Resize(row_max - tar(1).Row + 1, 1) tar = tar(1) Exit Do End If tar = tar(1) Set tar = tar.End(xlDown) Loop '偶数行を削除(この処理を目的の削除処理内容と置き換えてください) For i = row_max To 1 Step -1 If i Mod 2 = 0 Then Rows(i).Delete Next i 'セルを再結合 Set tar = Nothing Application.DisplayAlerts = False For i = Cells(Rows.Count, mycol).End(xlUp).Row To strow Step -1 If WorksheetFunction.CountIf(Range(Cells(strow, mycol), Cells(i, mycol)), Cells(i, mycol)) > 1 Then If key <> Cells(i, mycol) Then Set tar = Cells(i, mycol) key = Cells(i, mycol).Value End If Else Range(Cells(i, mycol), tar).Merge key = Cells(i, mycol).Value End If Next i Application.DisplayAlerts = True '画面更新再開 Application.ScreenUpdating = True End Sub
お礼
早速のご回答感謝します。 ベストアンサーは最初の方に差し上げましたが、 大変参考になりました。 ありがとうございました。
お礼
早速のご回答感謝します。 知りたかったことはまさしくこれです。 ありがとうございました。