清除受保护工作表中未受保护的特定范围的内容

时间:2016-07-24 13:21:36

标签: excel vba excel-vba union

我想清除特定范围内受保护工作表的未受保护内容。例如,当我运行VBA时,它将清除A1002:F1301和G1002:AZ1301的内容。上述范围不受保护。我只希望这些范围之间的单元格清晰,但不能格式化或任何其他更改。

2 个答案:

答案 0 :(得分:0)

  

由于您的示例范围(例如A1002:F1301和G1002:AZ1301)实际上没有任何未引用的列或行,我将更改您的示例为A1002:F1301和H1002:AZ1301离开列G在不连续的范围内与两个Areas无关。

使用类似于以下前两种方法之一的东西。

with worksheets("Sheet1")
    .range("A1002:F1301, H1002:AZ1301").clearcontents
    'alternative with Union
    union(.range("A1002:F1301"), .range("H1002:AZ1301")).clearcontents
    'do NOT use the following - it includes all the cells in between
    .range("A1002:F1301", "H1002:AZ1301").clearcontents
end with

第一种方法是第二种方法Union method的简写。注意第一个和第三个之间的区别。第三种不建议用于您的目的,因为它包括两个范围之间的所有单元格(例如A1002:AZ1301)。

Range.ClearContents method仅清除值,而不像Range.Clear清除值和格式。

答案 1 :(得分:0)

这就是我用的。我从不同的答案中得到了满足我需要的各种代码。在第一个示例中,我希望它仅清除特定工作表上的未锁定单元。

Sub ClearProgressNotes_JAN()

 With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

Dim ws As Worksheet
Dim Rng As Range
Set ws = Worksheets("JAN")
Set Rng = ws.Range("b9:ay109")
Dim OutRng As Range
On Error Resume Next
Application.ScreenUpdating = False
For Each Rng In Rng
    If Rng.Locked = False Then
        If OutRng.Count = 0 Then
            Set OutRng = Rng
        Else
            Set OutRng = Union(OutRng, Rng)
        End If
    End If
Next
If OutRng.Count > 0 Then OutRng.ClearContents
End Sub

下面的代码对我来说有效。

Sub ClearUnlockedCells()

With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

Dim WorkRng As Range
Dim OutRng As Range
Dim Rng As Range
On Error Resume Next
Set WorkRng = Application.ActiveSheet.UsedRange
Application.ScreenUpdating = False
For Each Rng In WorkRng
    If Rng.Locked = False Then
        If OutRng.Count = 0 Then
            Set OutRng = Rng
        Else
            Set OutRng = Union(OutRng, Rng)
        End If
    End If
Next
If OutRng.Count > 0 Then OutRng.ClearContents

End Sub

编辑:谨记,这里的代码有助于清除表上未受保护的单元格,即使它们与受保护的单元格混合也是如此。您不必专门识别不受保护的单元。