VBA 范围为空

VBA Range is Nothing

运行使用下面的代码以及我希望看到的结果是隐藏第 27 行上所有带有 0 的列 - 但取决于数据的频率,这些列的范围要隐藏的列是不同的。基本上 sheet 中以 Daily/monthly/weekly 开头的任何内容都必须隐藏列,所有其余的 sheet 都应该保留。 它使用 if 语句(sheets 以 X 与所有其他语句开头)在一个简单的工作簿上工作,但是当我添加 case 语句时它坏了...

粗体标记的行是我收到错误的地方: 运行-时间错误'1004' 应用程序定义或对象定义错误

我是新手,所以请随时推荐好的 vba 教程 website/book。

Sub Hide_Zero_Columns()

    Dim WS As Worksheet
    Dim Col_to_hide As Range
    Dim Range_to_hide As Range
    Dim X As Integer

    For Each WS In ThisWorkbook.Sheets
        Worksheets(WS.Name).Activate
        With WS
        Select Case Data_Frequency_Sheets
        Case Left(WS.Name, 5) = "Daily"
            Set Range_to_hide = Range("BDV:CWH")
        Case Left(WS.Name, 5) = "Month"
            Set Range_to_hide = Range("AY:CO")
        Case Left(WS.Name, 5) = "Weekl"
            Set Range_to_hide = Range("HF:NN")
        Case Else
            Set Range_to_hide = Range("A1:B1")
        End Select
        Select Case Data_Condition
        Case Left(WS.Name, 5) = "Daily"
            X = 1
        Case Left(WS.Name, 5) = "Month"
            X = 30
        Case Left(WS.Name, 5) = "Weekl"
            X = 7
        Case Else
            X = 999
        End Select
        If X <> 999 Then
                For Each Col_to_hide In ActiveSheet.Range(Range_to_hide) '<-- Error here
                    If UCase(Col_to_hide) = 0 Then
                        Col_to_hide.EntireColumn.Hidden = True
                    Else: Col_to_hide.EntireColumn.Hidden = False
                    End If
                Next Col_to_hide
        End If
    End With
    Next
    ActiveWorkbook.Worksheets("Registrations").Activate
End Sub

因为您已经定义了一个 Range,您的问题是您正在尝试评估:Sheet.Range(Range),这会引发您遇到的错误。

由于您似乎想要遍历列,因此您需要做的就是将行更改为:

' Iterate across the columns in the defined range.
For Each Col_to_hide In Range_to_hide.Columns
    ' Each "Col_to_hide" will represent all cells within the column.
    MsgBox Col_to_hide.Address

您遇到的错误是因为您将 Range 对象作为参数传递给 Activesheet.Range(),但由于 Range 对象的默认值,它不接受该参数。就像在立即执行此操作一样 Window

?Range(Range("A1")).Address

你会得到同样的错误。而

?Range("A1").Address

你不知道。你也可以这样做

?Range(Range("A1").Address).Address

所以问题是当你没有为对象指定 属性 时,比如 Range("A1") 而不是 Range("A1").Address,然后使用默认的 属性 . Range 对象有点奇怪,但在本例中它的默认 属性 是 Value 属性。所以 Activesheet.Range(Range_to_hide)Activesheet.Range(Range_to_hide.Value) 相同。如果 Range_to_hide 是一个多单元格范围,那么它的值 属性 returns 是一个数组,你绝对不能将其传递给范围的参数。

就是这个解释,简答就是简单的用Range_to_hide,比如

For Each Col_to_hide in Range_to_hide.Columns

为什么 .Columns。记得我说过 Range 对象有点奇怪。好吧,与大多数对象不同,它有两个默认属性,具体取决于您在其中使用它的上下文。早些时候,默认值 属性 是 Value,但在 For..Each 的上下文中,默认值是 Cells .如果您没有在 For..Each 中指定 .Columns,那么它将遍历范围内的每个单元格。事实上,我总是指定范围是如何聚合的,即使它是默认的 Cells。