如果字符串包含 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 语句并删除该行

不需要

  1. 遍历每一行以删除 - 更快 AutoFilter
  2. 或者在您不使用变量 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