2016-01-17 2 views
1

Я пытаюсь сделать оператор case case, где его основанный на строке, которую я сохранил в переменной, содержит определенные слова. Из того, что я видел повсюду, я смотрел, что все правильно, но оно не работает. Я продолжаю получать «Compile Error: Invalid Qualifier» в моей переменной «Model», в случае case, например Case Model.Contains («GR CHER»).Оператор case, если строка содержит

Кто-нибудь видит что-то, что здесь отсутствует?

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 
+0

так что вы лечите модели в качестве текстовой переменной и поэтому вы хотели бы использовать что-то вроде этого вместо. 'Instr (« GR CHER », Model)' –

+0

Почему вы оцениваете модель только для ее удаления? – brettdj

ответ

2

Ваш код не похож на VBA.

Кроме того, я не думаю, что вы можете сделать что-нибудь, что приравнивает «содержит» является 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 
+0

по какой-либо причине он выполняет инструкцию else в каждой строке (удаляет каждую строку после строки заголовка), даже если требуются значения, которые они ищут.Даже когда я перехожу к нему и смотрю на значение для модели, это будет, например, GR CHER, но код все равно удалит строку. – user1787114

+0

Прекрасно работает для меня. внимательно посмотрите на орфографию и проверьте специальные символы, например, nbs –

+0

похоже, что его работа ищет точные соответствия. Если у меня есть «AVENGER (3.6L)» в ячейке, и код говорит ElseIf Model Like «* AVENGER *» Затем Model = «Avenger» Удалено = False это не будет ловить на этом elseif-заявлении и спустится до else и удалите строку – user1787114

0

Как уже упоминалось Крис, вы не может использовать «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 
0

Похоже, что его работа ищет точные соответствия. Если у меня есть «Avenger (3.6L)» в ячейке и код говорит:

If Model Like "*AVENGER*" Then 
    Model = "Avenger" 
    Deleted = False 

или если я попробовать:

If Model Like "AVENGER" Then 
    Model = "Avenger" 
    Deleted = False 

это обыкновение ловить на том, что если заявление и пойдет вниз пока заявление еще и удалить строку

1

нет необходимости

  1. Петля через каждый ряд удалить - быстрее AutoFilter
  2. Или получить и сохранить переменную Модель на каждом шагу, как вы надеваете `t использовать его

Вы можете попробовать ниже подход, который является эквивалентом 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 
Смежные вопросы