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")
等等。