首页 > 解决方案 > 数组中多个 if 语句的 VBA 代码

问题描述

我正在尝试将 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 类别
131 生产
124 生产、开发、登台、测试、培训、UserAcceptanceTest
283 开发、测试
1138 空的。

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

  1. 空 - 否
  2. 开发 - 开发
  3. 生产 - 产品
  4. 测试一下
  5. 分期 - 分期
  6. 培训 - 培训
  7. UserAcceptanceTest - UAT
  8. 开发、测试和生产或任何其他类别 - 全部
  9. 开发和测试或任何其他类别(生产除外)- 开发/测试
  10. 测试和生产或任何其他类别(开发除外)- 开发/测试
  11. 开发和任何其他类别(生产和测试除外) - 开发
  12. 生产和任何其他类别(开发和测试除外)- 产品
  13. 测试和任何其他类别(开发和生产除外)- 测试
  14. 任何其他场景 - 未定义

标签: arraysexcelvbasplitselect-case

解决方案


使用此答案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

推荐阅读