Excel 使用字符串值在VBA中创建Bucket
我试图从国家代码的字符串值创建一个戏剧桶。我已经编写了一个代码,使用for循环和嵌套if条件,如下所示: 数据: 代码: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
我只是想检查一下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