Excel VBA - 表达式值在真正的IF语句后丢失类型和值

时间:2015-07-06 14:21:22

标签: excel vba excel-vba

我在隐藏/取消隐藏行时遇到问题。由于某种原因,如果任何一个IF语句最终为真,那么表达式值“i”将丢失其值和类型,并且我得到类型不匹配错误。如果我没有在代码中使用直接数字,那么一切都运行得花花公子。我似乎无法弄清楚如何解决这个问题,有什么建议吗?谢谢!

以下是有问题的代码

Sub Macro1()
Dim i As Integer
Dim j As Integer

'Initial Conditions
i = 4
j = 184

If Range("A2").Value = "ONLINE" Then
ActiveSheet.Rows("i:184").EntireRow.Hidden = False
End If

If Range("A2").Value = "OFFLINE" Then
ActiveSheet.Rows("i:184").EntireRow.Hidden = True
End If

End Sub​

2 个答案:

答案 0 :(得分:1)

试试这个:

 'provide the correct Column names as per your needs
 ActiveSheet.Range("A" & i & ":C" & j).EntireRow.Hidden

ActiveSheet.Rows()属性不接受在代码中生成的字符串值参数。例如行(“i:184”),这是一个无效类型的无效参数。因此类型不匹配错误

如果活动表不再引用您最初指向的内容,则这些行(4:184)将不起作用。因此,您应始终使用工作表的Range对象的显式声明。

对于更干净的代码,您可以像这样使用它。

Option Explicit

Public Sub Hide_Seek
Dim ws As Worksheet
Dim rng As Range
Dim checkVal as String

Set ws = ActiveWorkbook.Sheets("Sheet 1") 'whatever your sheet is
Set rng = ws.Range("A4") 'whatever starting cell, in your case it's D

'assuming these values do change    
i = 4
j = 184

'this is now resizing the range to your desired range, starting from the 
'initial range you defined
'Resize(Row, Column)
Set rng = rng.Resize(i, j)

checkVal = ws.Range("A2").Value
If checkVal = "ONLINE" then
   rng.EntireRow.Hidden = False
Elseif checkVal = "OFFLINE" then
   rng.EntireRow.Hidden = True
End If

End Sub

答案 1 :(得分:0)

ActiveSheet.Rows("i:184") - 这会将字符i传递给无效的Rows

使用i 变量更改为ActiveSheet.Rows(i & ":184")ij ActiveSheet.Rows(i & ":" & j)