1

我的情况是我有一些合并的单元格,它们必须保留为合并的单元格。我知道合并单元格会导致 VBA 出现问题,但在这种情况下这是不可避免的。

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

因此,我的代码检查单元格是否具有正确的填充,然后检查单元格是否被合并。如果合并,则 MergeArea 地址存储在字符串数组中,合并后的单元格未合并然后解锁。

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

如果我为工作簿中的任何一张工作表运行它,这一切都很好(即:在 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
4

1 回答 1

2

尝试排位For Each c In Range("A1:AF" & LRow)For Each c In .Range("A1:AF" & LRow)

解释一下,对于那些将来可能会遇到类似问题的人:

在不限定Range参数的情况下,Excel 假定您引用ActiveSheet. 因为您在With块 ( ) 内工作,所以对于循环的每次迭代With WS,添加 将.this 限定Range为工作表上的对象。WS

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

于 2013-04-29T14:10:23.860 回答