2015-01-16 64 views
1

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

用粗体标出的那一行是我得到的那一行错误: 运行时错误“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 
+0

excel VBA环境中的行和列也分配有数字地址。即列A是1,B是2等。如果可以用简单的case语句指定范围,请尝试设置for循环的上下边界并使用Columns(loopvar).Hidden = False – user3479671

+0

顺便说一句,这个电子表格有多大你一路进入专栏CWH?当我滚动到一个新的excel文档的最右侧时,它以“IV” – user3479671

+0

结束,感谢您的快速回复......它是20MB的数据 - 相当大,我会说 –

回答

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 
+0

不起作用:(......有什么奇怪的是如果我改变这一行:对于每个Col_to_hide在ActiveSheet.Range(Range_to_hide)'< - 这里错误对于每个Col_to_hide在ActiveSheet.Range(“AA1:AB2”) 它通过行...它必须是上面的情况声明或我声明变量的地方.. –

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,那么它将遍历范围中的每个单元格。实际上,我总是指定范围如何汇总,即使它是默认的Cells。

+0

谢谢你的解释! –