测试VBA中是否存在范围

Col*_*Nye 10 excel vba range offset

我在excel ss中有一个动态定义的命名范围,它根据开始日期和结束日期从表中获取数据

=OFFSET(Time!$A$1,IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),1,MATCH(Date_Range_End,AllDates)-IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),4)
Run Code Online (Sandbox Code Playgroud)

但是如果日期范围在表中没有数据,则范围不存在(或者某些东西,idk).如何在VBA中编写代码以测试此范围是否存在?

我尝试过类似的东西

If Not Range("DateRangeData") Is Nothing Then
Run Code Online (Sandbox Code Playgroud)

但我得到"运行时错误1004,对象'_Global'的方法'范围'失败了."

Ste*_*ric 25

这是一个函数我敲了回来是否存在命名范围.它可能会帮助你.

Function RangeExists(R As String) As Boolean
    Dim Test As Range
    On Error Resume Next
    Set Test = ActiveSheet.Range(R)
    RangeExists = Err.Number = 0
End Function
Run Code Online (Sandbox Code Playgroud)

  • 嗨阿基米德.根据这里的文档https://msdn.microsoft.com/en-us/library/aa266173(v=vs.60).aspx每个过程都有自己独立的错误处理程序.当控制传递回父级时,先前的错误处理程序应该再次激活.虽然它有点模棱两可,所以如果它让你觉得更安全就把它放进去. (4认同)
  • 我必须将函数中的最后一行更改为“RangeExists = (Err.Number=0)”以返回正确的布尔值。否则它总是返回“false”。使用 Excel 365。 (2认同)
  • 或者,我使用“Set Test = ThisWorkbook.Names(R).RefersToRange”。这适用于整个工作簿中的所有命名范围。请注意,在这种情况下,具有工作表范围(而不是工作簿范围)的命名范围必须使用前面的工作表名称编写,例如“R =“SheetName!RangeName”;具有工作簿范围的命名范围(命名范围的默认值)必须在没有前面的工作表名称的情况下编写。 (2认同)

nut*_*sch 16

您可以在使用范围之前复制VBA中的匹配进行计数,也可以使用错误处理:

On Error Resume Next

Debug.Print range("DateRangeData").Rows.Count

If Err = 1004 Then
    MsgBox "Range Empty"
    Exit Sub
Else
    MsgBox "Range full"
End If

Err.Clear
On Error GoTo 0
Run Code Online (Sandbox Code Playgroud)