- ベストアンサー
条件によってセルの結合を実行する方法
- セル結合を行う際に条件を設けることで、特定の階層のみの結合や、階層ごとに条件を設けて結合することが可能です。
- 同じビジネステーマであっても、一つ上の階層の名称が異なる場合は別々に結合されるように条件を設定することが重要です。
- セル結合を実行する際には注意が必要であり、正しい条件を設けることで最適な結果が得られます。
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
Sub FinalAnswer() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long Application.ScreenUpdating = False For c = 1 To 6 '1列から最終列の6列までループ 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value If c = 1 Then For r = 2 To 23 '2行~最終行の23行までループ If Cells(r, c).MergeArea.Item(1).Value <> LevelName Then 終 = r - 1 LevelName = Cells(r, c).MergeArea.Item(1).Value Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r ElseIf r = 23 Then '※23は最終行の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True End If Next Else pLevelName = Cells(2, c - 1).MergeArea.Item(1).Value For r = 2 To 23 If Cells(r, c).MergeArea.Item(1).Value <> LevelName Or _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value 始 = r ElseIf r = 23 Then '※23は最終行の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True End If Next End If Next Application.ScreenUpdating = True End Sub
その他の回答 (12)
- watabe007
- ベストアンサー率62% (476/760)
>マックのエラーの出る原因はこれのようです。 >Range(Cells(始, c), Cells(終, c)).Merge 結合する前に、一旦、解除すればどうなるでしょうか? Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).UnMerge Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True
- watabe007
- ベストアンサー率62% (476/760)
>すみませんが、最後尾は「ここまで」を判断に加えたいのですが。 LastRow-1 で最終行を検出しました。 >上の階層の名称が別なら今の階層の名称が同じでも結合しない、 上の階層の名称が変わる、もしくは今の階層の名称が変われば 「始」から始まった行から変わる直前の行までを結合します。 Sub FinalAnswer() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long, LastRow As Long Application.ScreenUpdating = False LastRow = Cells(Rows.Count, "A").End(xlUp).Row - 1 For c = 1 To 6 '1列から最終列の6列までループ 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value If c = 1 Then For r = 2 To LastRow If Cells(r, c).MergeArea.Item(1).Value <> LevelName Then 終 = r - 1 LevelName = Cells(r, c).MergeArea.Item(1).Value Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r ElseIf r = LastRow Then 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True End If Next Else pLevelName = Cells(2, c - 1).MergeArea.Item(1).Value For r = 2 To LastRow If Cells(r, c).MergeArea.Item(1).Value <> LevelName Or _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value 始 = r ElseIf r = LastRow Then 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True End If Next End If Next Application.ScreenUpdating = True End Sub
お礼
ありがとうございます。 おかげさまでうまく動作できました。
- watabe007
- ベストアンサー率62% (476/760)
最後です Sub Test6() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long Application.ScreenUpdating = False For c = 1 To 6 '1列から最終列の6列までループ 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value If c = 1 Then For r = 2 To 23 '2行~最終行の23行までループ If Cells(r, c).MergeArea.Item(1).Value <> LevelName Then 終 = r - 1 LevelName = Cells(r, c).MergeArea.Item(1).Value Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r ElseIf r = 23 Then '※23は最終行の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = 2 End If Next Else 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value pLevelName = Cells(2, c - 1).MergeArea.Item(1).Value For r = 2 To 23 If Cells(r, c).MergeArea.Item(1).Value <> LevelName Or _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value 始 = r ElseIf r = 23 Then '※23は最終行の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = 2 End If Next End If Next Application.ScreenUpdating = True End Sub
お礼
ありがとうございます。 マックの方はエラーは出ますが、終了ボタンをクリックすると結合がうまく完了しています。エラーメッセージがちょっと残念ですが、ウィンの方は知り合いの人に確認してみましたところ、問題なく、うまく動作できたとのことでした。 すみませんが、最後尾は「ここまで」を判断に加えたいのですが。 それと、そのコードはどんな流れでしょうか? 上の階層の名称が別なら今の階層の名称が同じでも結合しない、といった流れでしょうか?
補足
マックのエラーの出る原因はこれのようです。 Range(Cells(始, c), Cells(終, c)).Merge
- watabe007
- ベストアンサー率62% (476/760)
Sub Test5() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long Application.ScreenUpdating = False For c = 1 To 6 '1列から最終列の6列までループ 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value If c = 1 Then For r = 2 To 23 '2行~最終行の23行までループ If Cells(r, c).MergeArea.Item(1).Value <> LevelName Then 終 = r - 1 LevelName = Cells(r, c).MergeArea.Item(1).Value Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r ElseIf r = 23 Then '※最終行の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = 2 End If Next Else 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value pLevelName = Cells(2, c - 1).MergeArea.Item(1).Value For r = 2 To 23 If Cells(r, c).MergeArea.Item(1).Value <> LevelName And _ Cells(r, c - 1).MergeArea.Item(1).Value = pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value 始 = r ElseIf r = 23 And (Cells(r, c).MergeArea.Item(1).Value <> LevelName Or _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName) Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = 2 ElseIf r = 23 Then '※最終行の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = 2 ElseIf Cells(r, c).MergeArea.Item(1).Value <> LevelName And _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value ElseIf Cells(r, c).MergeArea.Item(1).Value = LevelName And _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value End If Next End If Next Application.ScreenUpdating = True End Sub
- watabe007
- ベストアンサー率62% (476/760)
訂正 >ElseIf r = 23 Then '※最終列の数字 ElseIf r = 23 Then '※23は最終行の数字
- watabe007
- ベストアンサー率62% (476/760)
さてさて、どうでしょうか? Sub Test4() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long Application.ScreenUpdating = False For c = 1 To 6 '1列から最終列の6列までループ 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value If c = 1 Then For r = 2 To 23 '2行~最終行の23行までループ If Cells(r, c).MergeArea.Item(1).Value <> LevelName Then 終 = r - 1 LevelName = Cells(r, c).MergeArea.Item(1).Value Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r ElseIf r = 23 Then '※最終列の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = 2 End If Next Else 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value pLevelName = Cells(2, c - 1).MergeArea.Item(1).Value For r = 2 To 23 If Cells(r, c).MergeArea.Item(1).Value <> LevelName And _ Cells(r, c - 1).MergeArea.Item(1).Value = pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value 始 = r ElseIf r = 23 Then '※最終列の数字 終 = r Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = 2 ElseIf Cells(r, c).MergeArea.Item(1).Value <> LevelName And _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value ElseIf Cells(r, c).MergeArea.Item(1).Value = LevelName And _ Cells(r, c - 1).MergeArea.Item(1).Value <> pLevelName Then 終 = r - 1 Application.DisplayAlerts = False Range(Cells(始, c), Cells(終, c)).Merge Application.DisplayAlerts = True 始 = r pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value End If Next End If Next Application.ScreenUpdating = True End Sub
- watabe007
- ベストアンサー率62% (476/760)
>Range(Cells(2, 1), Cells(3, 1)).Merge いえ書き換えるのではなく単独で試してもらいたかったのです。 Sub Test() Range(Cells(2, 1), Cells(3, 1)).Merge End Sub 結合セル内で結合してるのですがWin7 Excel2010ではエラーは出ないのですが マックでは出たのですね、う~ん、周りにマックの環境が無いので今のところ対策は???です。 On Error Resume Next を入れたら、どの様になりますか? Sub Test3() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long On Error Resume Next Application.ScreenUpdating = False
お礼
Sub Test() Range(Cells(2, 1), Cells(3, 1)).Merge End Sub で実行しましたところエラーもなく、結合もなく、何も起こりませんでした。 あと、下記のコードも同様に何も変わりませんでした。 Sub Test3() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long On Error Resume Next Application.ScreenUpdating = False
- watabe007
- ベストアンサー率62% (476/760)
一列目の場合 「ビジネステーマ」が続く限り Application.DisplayAlerts = False Range(Cells(2, 1), Cells(3, 1)).Merge Application.DisplayAlerts = True ↓ ↓ Application.DisplayAlerts = False Range(Cells(2, 1), Cells(15, 1)).Merge Application.DisplayAlerts = False 15行まで繰り返して処理しています マック、エクセル2011では Application.DisplayAlerts = False Range(Cells(2, 1), Cells(3, 1)).Merge Application.DisplayAlerts = True でエラーは出ますか? こちらは、Win7(64) Excel2010です。
お礼
Range(Cells(2, 1), Cells(3, 1)).Merge に書き換えたところ、エラーがでました。 コードを見ましたら、もう一つありましたので、2つとも Range(Cells(2, 1), Cells(3, 1)).Merge に書き換えました。エラーは出なかったのですが、結合する動作はしなかったのでした。
- watabe007
- ベストアンサー率62% (476/760)
- watabe007
- ベストアンサー率62% (476/760)
修正、第2弾!!(^_^;) Sub Test3() Dim c As Long, r As Long Dim LevelName As String, pLevelName As String Dim 始 As Long, 終 As Long Application.ScreenUpdating = False For c = 1 To 6 '1列から最終列の6列までループ 始 = 2 LevelName = Cells(2, c).MergeArea.Item(1).Value If c = 1 Then For r = 2 To 23 '2行~最終行の23行までループ If Cells(r, c).MergeArea.Item(1).Value = LevelName Then LevelName = Cells(r, c).MergeArea.Item(1).Value Application.DisplayAlerts = False Range(Cells(始, c), Cells(r, c)).Merge Application.DisplayAlerts = True Else 始 = r LevelName = Cells(r, c).MergeArea.Item(1).Value End If Next Else 始 = 2 pLevelName = Cells(2, c - 1).MergeArea.Item(1).Value For r = 2 To 23 If Cells(r, c).MergeArea.Item(1).Value = LevelName And _ Cells(r, c - 1).MergeArea.Item(1).Value = pLevelName Then Application.DisplayAlerts = False Range(Cells(始, c), Cells(r, c)).Merge Application.DisplayAlerts = True pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value Else 始 = r pLevelName = Cells(r, c - 1).MergeArea.Item(1).Value LevelName = Cells(r, c).MergeArea.Item(1).Value End If Next End If Next Application.ScreenUpdating = True End Sub
お礼
ありがとうございます。 マクロ実行してみましたところエラーが出ました。
- 1
- 2
お礼
ありがとうございます。 結果は変わりませんでした。 マックはともかく、ウィンで問題なく動作できましたので、これにで終了させてください。