いくつかの結合セルがあり、結合セルのままにしておく必要がある状況にあります。セルの結合が VBA で発生する問題は認識していますが、この状況ではやむを得ません。
ワークブック内のすべてのシートを保護するコードを書いていますが、特定の塗りつぶしのセルをロック解除したままにしています。もちろん、結合されたセルは、セルのロックを解除しようとすると問題を引き起こします。
したがって、私のコードは、セルに正しい塗りつぶしがあるかどうかを確認してから、セルが結合されているかどうかを確認します。結合された場合、MergeArea アドレスは文字列配列に格納され、結合されたセルは結合解除されてからロック解除されます。
これらの塗りつぶされたセルのシートの関連領域をチェックした後、配列に格納されているすべてのセル領域を再マージするようにループを設定しました。
ワークブック内の任意の 1 つのシートに対して実行すると (つまり、ActiveWorkbook.Worksheets の For Each WS なしで)、これはすべて正常に機能します。ただし、For Each WS ループを追加すると、シート上のセルが誤って結合され始めます。
コードは次のとおりです。
Sub ProtectSheets()
Application.ScreenUpdating = False
Dim LRow As Integer, count As Integer
Dim reMerge() As String
Dim WS As Worksheet
For Each WS In ActiveWorkbook.Worksheets
count = 0
Erase reMerge
With WS
LRow = .Range("h" & .Rows.count).End(xlUp).Row
For Each c In Range("A1:AF" & LRow)
If c.Interior.Color = RGB(253, 233, 217) Then '~~ Check for cell fill
If c.MergeCells = True Then '~~ Check to see if merged
ReDim Preserve reMerge(count)
reMerge(count) = c.MergeArea.Address '~~Store mergearea address in array
count = count + 1
c.MergeCells = False
End If
c.Locked = False
End If
Next c
For i = LBound(reMerge) To UBound(reMerge) '~~ Remerge all cells that were originally merged
.Range(reMerge(i)).Merge
Next i
End With
WS.Protect Password:="xxxx", userinterfaceonly:=True
Next WS
Application.ScreenUpdating = True
End Sub