在VBA中引用多表命名范围

时间:2016-01-18 06:15:50

标签: excel vba excel-vba

我在Excel中有一个命名区域,我试图使用VBA清除。

范围的问题是横跨多个工作表,我不知道如何正确引用VBA中的命名范围,因为它涵盖了多个工作表。

命名范围“计数”设置为工作簿范围,包含以下单元格引用:

=Sheet1!$A$1, Sheet2!$A$1, Sheet3!$A$1

当清除一个只在一张纸上引用过单元格的命名范围时,我使用以下内容:

ThisWorkbook.Sheets("Sheet1").Range("Counts").ClearContents

我尝试过以下但似乎都没有效果。

ThisWorkbook.Range("Counts").ClearContents

Range("Counts").ClearContents

最后一次给我一个全局错误。

3 个答案:

答案 0 :(得分:2)

您需要在每个工作表中使用工作表范围范围,而不是跨越多个工作表的范围(无法正常工作)。

定义范围名称时,可以将其范围设置为工作簿或当前工作表。这样,您可以在许多工作表中使用相同的范围名称。

使用VBA遍历所有工作表,访问当前工作表上的ws.Range(“TheRangeName”)并清除其内容。

这是一种更清洁的方法。

答案 1 :(得分:1)

我会写一些显示名称的东西,你可以用它来删除它......

在即时窗口中:

For i = 1 to names.count:Debug.print i, Names(i).RefersTo, Names(i).name:next

然后,您可以使用名称或索引删除所需的特定名称。

希望有所帮助。

答案 2 :(得分:0)

Rory Archibald是Microsoft MVP

在他的website post about named ranges上他声明:一个Range对象只能引用一个工作表上的单元格。您不能使用一个Range对象引用不同工作表上的单元格。

所以我无法完成我想要的东西但是我应该能够创建多个命名范围并且一次只清除它们。

我能够从teylyn

获得灵感,完成以下代码
Public Sub ClearRanges()
'Checks if named Range exists on sheet if it does then clear contents

    Dim ws As Worksheet

    Application.DisplayAlerts = False

    For Each ws In ThisWorkbook.Worksheets
        If Len(ws.Range("Counts").Name) <> 0 Then
            ws.Range("Counts").ClearContents
        End If
    Next ws

    Application.DisplayAlerts = True
End Sub