繁体   English   中英

VBA Excel 多个 elseif 语句

[英]VBA Excel multiple elseif statement

我想为多个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

我在这里找到了一些类似的线程:

消除多个 Elseif 语句

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

不管我构建了代码,根据我的情况:

 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语句呢?

隐藏行( Match / Select Case

  • Select Case版本区分大小写,而Application.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

要消除多个 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM