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。
运行使用下面的代码以及我希望看到的结果是隐藏第 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。