Excel 使用字符串值在VBA中创建Bucket

Excel 使用字符串值在VBA中创建Bucket,excel,vba,Excel,Vba,我试图从国家代码的字符串值创建一个戏剧桶。我已经编写了一个代码,使用for循环和嵌套if条件,如下所示: 数据: 代码: 我只是想检查一下vba中是否有其他字符串存储桶解决方案。一个更干净的替代方案是Select Case sub bucket() Dim i As Integer For i = 2 To 4321 Select Case Range("A" & i) Case "IN","CN" Range("B" & i).Val

我试图从国家代码的字符串值创建一个戏剧桶。我已经编写了一个代码,使用for循环和嵌套if条件,如下所示: 数据:

代码:


我只是想检查一下vba中是否有其他字符串存储桶解决方案。

一个更干净的替代方案是
Select Case

sub bucket()
  Dim i As Integer
  For i = 2 To 4321
    Select Case Range("A" & i)
      Case "IN","CN"
        Range("B" & i).Value = "ASIA"
      Case "UK", "GB"
        Range("B" & i).Value = "EMEA"
      Case "US", "CA"
        Range("B" & i).Value = "USAI"
      Case Else
        Range("B" & i).Value = "other"
    End Select
  Next i
End sub
或者更喜欢:

sub bucket()
  Dim i As Integer

  For i = 2 To 4321
    With Range("B" & i)
      Select Case UCase$(Range("A" & i).Value)
        Case "IN","CN"
          .Value = "ASIA"
        Case "UK", "GB"
          .Value = "EMEA"
        Case "US", "CA"
          .Value = "USAI"
        Case Else
          .Value = "other"
      End Select
    End With
  Next

End sub

这些差异使得阅读更容易,以后添加更多选项更容易,如果以后要更改列,也更容易修改。

另一种选择是使用
开关()
函数:

Sub bucket()
    Dim i As Long        
    Dim str As String
    Dim var As Variant

    For i = 2 To 4321
        str = UCase$(Cells(i, 1).Value)
        var = Switch(str = "IN", "ASIA", str = "UK", "EMEA", str = "US", "USAI", _
                     str = "CN", "ASIA", str = "GB", "EMEA", str = "CA", "USAI")
        If IsNull(var) Then var = "other"
        Cells(i, 2).Value = var
    Next
End Sub
或者另一个没有循环:

Sub bucket()
    With Range("B2:B4321")
        .FormulaR1C1 = "=IF(OR(RC[-1]=""IN"",RC[-1]=""CN""),""ASIA"",   IF(OR(RC[-1]=""UK"",RC[-1]=""GB""),""EMEA"",  IF(OR(RC[-1]=""US"",RC[-1]=""CA""),""USAI"",""other"")))"
        .Value = .Value
    End With
End Sub
也可以写如下:

Sub bucket()
    With Range("B2:B4321")
        .FormulaR1C1 = "=IF(OR(RC[-1]=""IN"",RC[-1]=""CN""),""ASIA""," & _
                        "IF(OR(RC[-1]=""UK"",RC[-1]=""GB""),""EMEA""," & _
                        "IF(OR(RC[-1]=""US"",RC[-1]=""CA""),""USAI""," & _
                        """other"")))"
        .Value = .Value
    End With
End Sub

帮助使嵌套结构看起来。。。嵌套;-)<代码>下一个i应该在
结束之后,如果
。是的…编辑过…谢谢:)第二个可能更快。将其作为UDF会更好/更快。这很酷-在IMO中更难阅读,但仍然是很好的速记。@braX,第一个和第三个代码中的缩进有精确的目标(几乎)可读性与
选择Case
一样好,对于本例来说效果很好,而且速度可能更快。如果每个案例都有多条指令,而不是返回/添加一个字符串,我猜
Switch
可能不会有帮助。我仍然认为学习像这样做的新方法是很好的。谢谢。@braX,“如果每个案例都有多个说明……我猜开关可能不会有帮助”,但这不是我要回答的OP案例……我理解。我不是说这不好,是我投票支持你的。
Sub bucket()
    With Range("B2:B4321")
        .FormulaR1C1 = "=IF(OR(RC[-1]=""IN"",RC[-1]=""CN""),""ASIA"",   IF(OR(RC[-1]=""UK"",RC[-1]=""GB""),""EMEA"",  IF(OR(RC[-1]=""US"",RC[-1]=""CA""),""USAI"",""other"")))"
        .Value = .Value
    End With
End Sub
Sub bucket()
    With Range("B2:B4321")
        .FormulaR1C1 = "=IF(OR(RC[-1]=""IN"",RC[-1]=""CN""),""ASIA""," & _
                        "IF(OR(RC[-1]=""UK"",RC[-1]=""GB""),""EMEA""," & _
                        "IF(OR(RC[-1]=""US"",RC[-1]=""CA""),""USAI""," & _
                        """other"")))"
        .Value = .Value
    End With
End Sub