如果字符串包含 case 语句
Case statement if string contains
我正在尝试做一个 select case 语句,它基于我存储在变量中的字符串包含某些单词。从我到处看到的情况来看,我看起来是对的,但它不起作用。在 case 语句中,我的变量 "Model" 不断得到 "Compile Error: Invalid Qualifier",即 Case Model.Contains("GR CHER").
有人看到我在这里遗漏的东西吗?
i = 2
Model = Sheets("Data").Cells(i, 8)
While Not IsEmpty(Cells(i, 1))
Select Case True
Case Model.Contains("GR CHER")
Model = "Grand Cherokee"
Case Model.Contains("CHRGR")
Model = "Charger"
Case Model.Contains("HLLCT")
Model = "HellCat"
Case Model.Contains("R1500")
Model = "Ram 1500"
Case Else
Rows([i]).EntireRow.Delete
i = i - 1
End Select
Sheets("Data").Cells(i, 8).Value = Model
i = i + 1
Wend
您的代码看起来不像 VBA。
此外,我不认为你可以做任何等于 "contains" 的事情是 Select Case
您的代码已重构,还修复了其他一些问题
Sub zx()
Dim i As Long
Dim Model As Variant
Dim Deleted As Boolean
i = 2
With Sheets("Data")
Do While Not IsEmpty(Sheets("Data").Cells(i, 1))
Model = Sheets("Data").Cells(i, 8)
Deleted = False
If Model Like "*GR CHER*" Then
Model = "Grand Cherokee"
ElseIf Model Like "*CHRGR*" Then
Model = "Charger"
ElseIf Model Like "*HLLCT*" Then
Model = "HellCat"
ElseIf Model Like "*R1500*" Then
Model = "Ram 1500"
Else
Rows(i).EntireRow.Delete
Deleted = True
End If
If Not Deleted Then
.Cells(i, 8).Value = Model
i = i + 1
End If
Loop
End With
End Sub
正如 Chris 提到的,您不能使用 "contains",该函数将是 "InStr",但我很确定以下方法可以完成工作。
Sub Models()
Dim i As Long: i = 2
With ThisWorkbook.Sheets("Data")
While i <= .Cells(.Rows.Count, "A").End(xlUp).Row
If .Cells(i, 8) Like "*GR CHER*" Then
.Cells(i, 8) = "Grand Cherokee"
i = i + 1
ElseIf .Cells(i, 8) Like "*CHRGR*" Then
.Cells(i, 8) = "Charger"
i = i + 1
ElseIf .Cells(i, 8) Like "*HLLCT*" Then
.Cells(i, 8) = "HellCat"
i = i + 1
ElseIf .Cells(i, 8) Like "*R1500*" Then
.Cells(i, 8) = "Ram 1500"
i = i + 1
Else
.Rows(i).EntireRow.Delete
End If
Wend
End With
End Sub
看起来它正在做的是寻找完全匹配。如果我有
"AVENGER (3.6L)" 在一个单元格中
代码说:
If Model Like "*AVENGER*" Then
Model = "Avenger"
Deleted = False
或者如果我尝试:
If Model Like "AVENGER" Then
Model = "Avenger"
Deleted = False
它不会捕捉到该 If 语句,并且会下降直到 else 语句并删除该行
不需要
- 遍历每一行以删除 - 更快
AutoFilter
- 或者在您不使用变量 Model 的每一步导出并存储它
您可以尝试下面的方法,这是 VBA
等效的方法
- 在工作列中输入公式以重新调整 TRUE 或 FALSE 以测试列 H 中的每个字符串
- 过滤掉 False 结果
=COUNT(SEARCH({"*GR CHER*","*CHRGR*","*HLLC*","*R1500*"},I2))=1
代码
Sub QuickCull()
Dim ws As Worksheet
Dim rng1 As Range
Set ws = Sheets("Data")
Set rng1 = ws.Range(ws.[b2], ws.Cells(Rows.Count, "B").End(xlUp))
Application.ScreenUpdating = False
With rng1.Offset(0, 1)
.EntireColumn.Insert
.FormulaR1C1 = "=COUNT(SEARCH({""*GR CHER*"",""*CHRGR*"",""*HLLC*"",""*R1500*""},RC[5]))=1"
.AutoFilter Field:=1, Criteria1:="False"
.Offset(1, 0).EntireRow.Delete
.EntireColumn.Delete
End With
Application.ScreenUpdating = True
End Sub
我正在尝试做一个 select case 语句,它基于我存储在变量中的字符串包含某些单词。从我到处看到的情况来看,我看起来是对的,但它不起作用。在 case 语句中,我的变量 "Model" 不断得到 "Compile Error: Invalid Qualifier",即 Case Model.Contains("GR CHER").
有人看到我在这里遗漏的东西吗?
i = 2
Model = Sheets("Data").Cells(i, 8)
While Not IsEmpty(Cells(i, 1))
Select Case True
Case Model.Contains("GR CHER")
Model = "Grand Cherokee"
Case Model.Contains("CHRGR")
Model = "Charger"
Case Model.Contains("HLLCT")
Model = "HellCat"
Case Model.Contains("R1500")
Model = "Ram 1500"
Case Else
Rows([i]).EntireRow.Delete
i = i - 1
End Select
Sheets("Data").Cells(i, 8).Value = Model
i = i + 1
Wend
您的代码看起来不像 VBA。
此外,我不认为你可以做任何等于 "contains" 的事情是 Select Case
您的代码已重构,还修复了其他一些问题
Sub zx()
Dim i As Long
Dim Model As Variant
Dim Deleted As Boolean
i = 2
With Sheets("Data")
Do While Not IsEmpty(Sheets("Data").Cells(i, 1))
Model = Sheets("Data").Cells(i, 8)
Deleted = False
If Model Like "*GR CHER*" Then
Model = "Grand Cherokee"
ElseIf Model Like "*CHRGR*" Then
Model = "Charger"
ElseIf Model Like "*HLLCT*" Then
Model = "HellCat"
ElseIf Model Like "*R1500*" Then
Model = "Ram 1500"
Else
Rows(i).EntireRow.Delete
Deleted = True
End If
If Not Deleted Then
.Cells(i, 8).Value = Model
i = i + 1
End If
Loop
End With
End Sub
正如 Chris 提到的,您不能使用 "contains",该函数将是 "InStr",但我很确定以下方法可以完成工作。
Sub Models()
Dim i As Long: i = 2
With ThisWorkbook.Sheets("Data")
While i <= .Cells(.Rows.Count, "A").End(xlUp).Row
If .Cells(i, 8) Like "*GR CHER*" Then
.Cells(i, 8) = "Grand Cherokee"
i = i + 1
ElseIf .Cells(i, 8) Like "*CHRGR*" Then
.Cells(i, 8) = "Charger"
i = i + 1
ElseIf .Cells(i, 8) Like "*HLLCT*" Then
.Cells(i, 8) = "HellCat"
i = i + 1
ElseIf .Cells(i, 8) Like "*R1500*" Then
.Cells(i, 8) = "Ram 1500"
i = i + 1
Else
.Rows(i).EntireRow.Delete
End If
Wend
End With
End Sub
看起来它正在做的是寻找完全匹配。如果我有 "AVENGER (3.6L)" 在一个单元格中 代码说:
If Model Like "*AVENGER*" Then
Model = "Avenger"
Deleted = False
或者如果我尝试:
If Model Like "AVENGER" Then
Model = "Avenger"
Deleted = False
它不会捕捉到该 If 语句,并且会下降直到 else 语句并删除该行
不需要
- 遍历每一行以删除 - 更快
AutoFilter
- 或者在您不使用变量 Model 的每一步导出并存储它
您可以尝试下面的方法,这是 VBA
等效的方法
- 在工作列中输入公式以重新调整 TRUE 或 FALSE 以测试列 H 中的每个字符串
- 过滤掉 False 结果
=COUNT(SEARCH({"*GR CHER*","*CHRGR*","*HLLC*","*R1500*"},I2))=1
代码
Sub QuickCull()
Dim ws As Worksheet
Dim rng1 As Range
Set ws = Sheets("Data")
Set rng1 = ws.Range(ws.[b2], ws.Cells(Rows.Count, "B").End(xlUp))
Application.ScreenUpdating = False
With rng1.Offset(0, 1)
.EntireColumn.Insert
.FormulaR1C1 = "=COUNT(SEARCH({""*GR CHER*"",""*CHRGR*"",""*HLLC*"",""*R1500*""},RC[5]))=1"
.AutoFilter Field:=1, Criteria1:="False"
.Offset(1, 0).EntireRow.Delete
.EntireColumn.Delete
End With
Application.ScreenUpdating = True
End Sub