VBA Excel多个elseif语句

VBA Excel多个elseif语句,excel,vba,Excel,Vba,我想为多个elseif语句编写一个较短的代码 我的代码如下所示: Sub geography() Worksheets("Social").Rows("3:165").Hidden = True Dim cell As Range For Each cell In Range("F3:F165") If cell.Value = "GIS" Then Rows(cell.Row).EntireRow

我想为多个
elseif
语句编写一个较短的代码

我的代码如下所示:

 Sub geography()
 Worksheets("Social").Rows("3:165").Hidden = True
 Dim cell As Range
  For Each cell In Range("F3:F165")
  If cell.Value = "GIS" Then
  Rows(cell.Row).EntireRow.Hidden = False
  ElseIf cell.Value = "CLIMATE" Then
  Rows(cell.Row).EntireRow.Hidden = False
  ElseIf cell.Value = "TRAVEL" Then
  Rows(cell.Row).EntireRow.Hidden = False
  ElseIf cell.Value = "TOURISM" Then
  Rows(cell.Row).EntireRow.Hidden = False
  ElseIf cell.Value = "WILDLIFE" Then
  Rows(cell.Row).EntireRow.Hidden = False
  End If
  Next
  End Sub
我在这里找到了一些类似的线索:

但它适用于范围而不是布尔值,就像我的例子一样

不管怎样,我根据自己的情况构建了代码:

 Sub geography2()
  Dim arr, res
  Dim cell As Range
  Dim Variable As Boolean

  arr = Array(Array("GIS", False), _
            Array("CLIMATE", False), _
            Array("TRAVEL", False), _
            Array("TOURISM", False), _
            Array("WILDLIFE", False))
  res = Rows(cell.Row).EntireRow.Hidden
  If Not IsError(res) Then
    Variable = res
    End If
  End Sub 
但它不起作用,因为调试器指出了这一点:

   res = Rows(cell.Row).EntireRow.Hidden
并说: 对象变量或未设置块变量


那么如何减少批量
elseif
语句呢?

要消除多个elseif或数组,请尝试将if语句与正则表达式组合起来

确保在以下位置启用正则表达式:工具>引用>复选框:“Microsoft VBScript正则表达式5.5”

该函数将查找您提到的字符串(“GIS | CLIMATE | TRAVEL | TOURISM | WILDLIFE”),如果通过正则表达式测试,则返回True,并取消隐藏单元格

请让我知道它是否有效,如果无效,让我们尝试解决它

谢谢

Option Explicit
Dim wb As Workbook

Dim cel As Range
Dim sRng As Range

Dim regex As New RegExp

Sub foo()

Set wb = ThisWorkbook
Set sRng = wb.Sheets("Social").Range("F3:F165")

wb.Sheets("Social").Rows("3:165").Hidden = True


For Each cel In sRng

    If chkexist(cel.Value, "GIS|CLIMATE|TRAVEL|TOURISM|WILDLIFE") = True Then
    
        cel.EntireRow.Hidden = False
    
    Else
    
    End If

Next cel


End Sub


Private Function chkexist(ByRef chkstr As String, ByVal patstr As String) As Boolean

'function that tests str if contains regex pattern
'returns boolean

With regex
    
    .Global = True
    .Pattern = patstr
    
End With

chkexist = regex.Test(chkstr)


End Function
隐藏行(
匹配
/
选择大小写
  • Select Case
    版本区分大小写,而
    应用程序.Match
    版本不区分大小写
代码

Option Explicit

Sub geographyMatch()
    
    Const RowNumbers As String = "3:165"
    Dim Criteria As Variant
    Criteria = Array("GIS", "CLIMATE", "TRAVEL", "TOURISM", "WILDLIFE")
    
    Worksheets("Social").Rows(RowNumbers).EntireRow.Hidden = True
    
    Dim rng As Range
    Dim cel As Range
    For Each cel In Worksheets("Social").Columns("F").Rows(RowNumbers)
        If Not IsError(Application.Match(cel.Value, Criteria, 0)) Then
            If Not rng Is Nothing Then
                Set rng = Union(rng, cel)
            Else
                Set rng = cel
            End If
        End If
    Next cel
    
    If Not rng Is Nothing Then
        rng.EntireRow.Hidden = False
    End If

End Sub

Sub geographySelectCase()
    
    Const RowNumbers As String = "3:165"
    
    Worksheets("Social").Rows(RowNumbers).EntireRow.Hidden = True
    
    Dim rng As Range
    Dim cel As Range
    For Each cel In Worksheets("Social").Columns("F").Rows(RowNumbers)
        Select Case cel.Value
            Case "GIS", "CLIMATE", "TRAVEL", "TOURISM", "WILDLIFE"
                If Not rng Is Nothing Then
                    Set rng = Union(rng, cel)
                Else
                    Set rng = cel
                End If
        End Select
    Next cel
    
    If Not rng Is Nothing Then
        rng.EntireRow.Hidden = False
    End If

End Sub

如果x=1或x=2或x=3,您可以执行
操作。
或者使用
选择大小写,这样会更整洁一些。至于最后一个错误,
单元格
从未设置过
是的,您是对的。我设置了单元格范围,但仍然不起作用。代码被执行了,但没有任何结果。代码在我这方面起作用了,你能提供一个工作文件的屏幕截图吗?我相信这是需要做的一些小调整