运行下面的代码以及我希望看到的结果是第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
答案 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中的每个单元格。实际上,我总是指定范围的聚合方式,即使它是默认的单元格。