数组中多个 if 语句的 VBA 代码

Posted

技术标签:

【中文标题】数组中多个 if 语句的 VBA 代码【英文标题】:VBA code for multiple if statements within an Array 【发布时间】:2020-12-14 06:03:16 【问题描述】:

我正在尝试拆分 B 列中的数组,该列用逗号分隔,然后查找每个项目,如果满足条件,则在 C 列中发布一些内容。

我有很多结合 AND/OR 条件的场景。 最后,如果不满足任何场景,则在“C”列中应为“未定义”。

Dim Cl As Range
Dim Dic As Object
Dim Sp As Variant
Dim i As Long
  
Set Dic = CreateObject("Scripting.dictionary")
With Sheets("Analysis")
    For Each Cl In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
        Sp = Split(Cl.Offset(, 1).Value, ",")
        Select Case Cl.Offset(, 1).Value
            Case Is = " "
                C1.Offset(, 2).Value = " "
            Case Is = "Production"
                C1.Offset(, 2).Value = "Prod"
            Case Is = "Production" And "Development" Or "Training"
                C1.Offset(, 2).Value = "Dev/Prod"
        End Select
    Next Cl
End With
End Sub

A 列具有 Id 且 B 列具有类别的示例数据。

ID CATEGORY
131 Production
124 Production, Development, Staging, Test, Training, UserAcceptanceTest
283 Development, Test
1138 empty.

我正在为以下提到的场景在“C”列中寻找以下结果。 如果类别列如下,则列“C”值应为“-”之后的值。

    空 - 否 开发 - 开发 生产 - 产品 测试 - 测试 分期 - 分期 培训 - 培训 UserAcceptanceTest - UAT 开发、测试和生产或任何其他类别 - 全部 开发和测试或任何其他类别(生产除外)- 开发/测试 测试和生产或任何其他类别(开发除外)- 开发/测试 开发和任何其他类别(生产和测试除外)- 开发 生产和任何其他类别(开发和测试除外)- 生产 测试和任何其他类别(开发和生产除外)- 测试 任何其他场景 - 未定义

【问题讨论】:

真的会帮助您的问题显示一些示例输入数据和预期输出。 您可以编辑您的问题,并按照工作表上的格式设置数据格式。 看看this Answer 嗨,horst,这似乎是在数组中搜索单个字符串,但我必须查找具有 AND 和 OR 条件的多个字符串,我发现这很难做到。 是的,只需在Ifcase 语句中多次使用IsInArrayFunction。喜欢If IsInArray("Foo", arr) And IsInArray("Bar", arr) Then... 【参考方案1】:

使用来自This Answer的函数IsInArray

我用一些示例来填充它,让你知道如何去做。

Sub Category()

For Each cl In Range("A2:A" & Range("A2").End(xlDown).Row)

    Sp = Split(tempString , ", ")

    Select Case True    
        Case UBound(Sp) = -1
            cl.Offset(0, 2).Value = "No"
        Case UBound(Sp) = 0 And Sp(0) = " "
            cl.Offset(0, 2).Value = "No"
        Case UBound(Sp) = 0 And Sp(0) = "Development"
            cl.Offset(0, 2).Value = "Dev"
        Case IsInArray("Development", Sp) And IsInArray("Test", Sp) And IsInArray("Production", Sp)
            cl.Offset(0, 2).Value = "All"
        Case IsInArray("Development", Sp) And Not IsInArray("Production", Sp) And Not IsInArray("Test", Sp)
            cl.Offset(0, 2).Value = "Dev"
        Case Else
            cl.Offset(0, 2).Value = "Not Defined"
    End Select

Next cl
End Sub


Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function

【讨论】:

嗨,horst,除了行之外,它就像一个 gem - Case UBound(Sp) = 0 And Sp(0) = " " 它抛出 Run-tume error '9': Subscript out of范围 。在找到类别中的第一个空单元格之前,它运行良好。 我为空单元格添加了一个案例ubound(Sp) = -1

以上是关于数组中多个 if 语句的 VBA 代码的主要内容,如果未能解决你的问题,请参考以下文章

VBA if语句

excel VBA用户定义函数中是不是可以有多个if语句

VBA:具有多个操作的单行 if 语句

使用多个“For”和“if”语句加速 VBA 宏

VBA if...elseif...else语句

VBA if...else语句