VBA范围是没有的

时间:2015-01-16 12:33:11

标签: vba loops range case

运行下面的代码以及我希望看到的结果是第27行的所有列都隐藏了 - 但是根据数据的频率,这些列的隐藏范围是不同。基本上,每日/每月/每周开始的工作表中的任何内容都必须隐藏列,所有其余的工作表应该保持不变。 它使用if语句处理一个简单的工作簿(从X开始与所有其他语句一起开始),但是当我添加case语句时它就破坏了......

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

我是新手,所以请随时建议一个好的vba教程网站/书。

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$27:CWH$27")
        Case Left(WS.Name, 5) = "Month"
            Set Range_to_hide = Range("AY$27:CO$27")
        Case Left(WS.Name, 5) = "Weekl"
            Set Range_to_hide = Range("HF$27:NN$27")
        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

2 个答案:

答案 0 :(得分:0)

由于您已经定义了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

答案 1 :(得分:0)

您获得的错误是因为您将Range对象作为参数传递给Activesheet.Range()并且由于Range对象的默认值而无法接受值。这就像在立即窗口中这样做

?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是一个多单元格范围,那么它的Value属性会返回一个数组,你肯定无法将其传递给Range的参数。

这是解释,简短的回答就是使用Range_to_hide,比如

For Each Col_to_hide in Range_to_hide.Columns

为什么.Columns。记得当我说Range对象有点奇怪时。好吧,与大多数对象不同,它有两个基于您使用它的上下文的默认属性。早期,默认属性是Value,但在For..Each的上下文中,默认值为Cells。如果你没有在For..Each中指定.Columns,那么它将循环遍历Range中的每个单元格。实际上,我总是指定范围的聚合方式,即使它是默认的单元格。