VBA Excel:使用多个工作表时合并单元格的代码

我处于这种情况,我有一些合并单元格,他们必须保持合并单元格。 我意识到合并单元格与VBA引起的问题,但在这种情况下是不可避免的。

我正在编写一些代码来保护工作簿中的所有工作表,但保留一定数量的单元格以解锁。 当尝试解锁单元格时,合并的单元格当然会导致问题。

所以,我的代码检查是否有一个单元格有正确的填充,然后检查单元格是否合并。 如果合并,MergeArea地址存储在一个string数组中,并且合并的单元格被取消合并,然后解锁。

检查完这些填充单元格的相关区域后,我设置了一个循环来重新合并存储在数组中的所有单元格区域。

这一切工作正常,如果我运行它的工作簿中的任何一张(即:没有在ActiveWorkbook.Worksheets中的每个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 

For Each c In .Range("A1:AF" & LRow)

对于未来可能面临类似问题的人来说,

没有限定Range参数,Excel假定您引用ActiveSheet上的范围对象。 因为你正在一个With块( With WS ),添加. 将该Range限定为WS工作表上的对象,用于循环的每次迭代。

如果你不在With块内工作,你需要完全限定Range对象,例如WS.Range("A1")Sheets(1).Range("B52")等等。