2010-05-11 1 views
0

Я пытаюсь настроить макрос vba для удаления всех идентификаторов пользователя из электронной таблицы, которые не начинаются с назначенных префиксов (например, US, A1, VM и т. Д.). Следующий блок кода был найден в библиотеке кодов и выглядит так, как мне нужно, но есть одна проблема: когда я вводю в префиксы UserID в поля vlist, он рассматривает их как абсолютные, а не часть строки, которую я хочу хранить.Использование «подстановочных знаков» в массиве vlist для удаления строк в Excel

Есть ли способ включить подстановочные знаки в vlist?

Sub Example1() 
    Dim vList 
    Dim lLastRow As Long, lCounter As Long 
    Dim rngToCheck As Range, rngFound As Range, rngToDelete As Range 

    Application.ScreenUpdating = False 

    With Sheet1 
     lLastRow = Get_Last_Row(.Cells) 

     If lLastRow > 1 Then 

      vList = Array("US", "A1", "EG", "VM") 

      'we don't want to delete our header row 
      With .Range("A2:A" & lLastRow) 

       For lCounter = LBound(vList) To UBound(vList) 

        Set rngFound = .Find(_ 
             what:=vList(lCounter), _ 
             lookat:=xlWhole, _ 
             searchorder:=xlByRows, _ 
             searchdirection:=xlNext, _ 
             MatchCase:=True) 

        'check if we found a value we want to keep 
        If rngFound Is Nothing Then 

         'there are no cells to keep with this value 
         If rngToDelete Is Nothing Then Set rngToDelete = .Cells 

        Else 

         'if there are no cells with a different value then 
         'we will get an error 
         On Error Resume Next 
         If rngToDelete Is Nothing Then 
          Set rngToDelete = .ColumnDifferences(Comparison:=rngFound) 

         Else 
          Set rngToDelete = Intersect(rngToDelete, .ColumnDifferences(Comparison:=rngFound)) 
         End If 
         On Error GoTo 0 

        End If 

       Next lCounter 
      End With 

      If Not rngToDelete Is Nothing Then rngToDelete.EntireRow.Delete 

     End If 
    End With 

    Application.ScreenUpdating = True 
End Sub 

ответ

0

Интересно. Я никогда не замечал метод ColumnDifferences, поэтому спасибо за это.

Будучи незнакомым с ним, я не мог понять, что вы пытаетесь сделать с этим макросом.

Если вы проверяете содержимое столбца A, чтобы увидеть, соответствуют ли первые два символа в каждой ячейке значениям в вашем массиве, и если вы удаляете всю строку, вы можете выполнить это с помощью цикла следующим образом:

Sub Example2() 

    Dim lLastRow As Long 
    Dim lCounter As Long 

    Application.ScreenUpdating = False 

    With Sheet1 

     lLastRow = Get_Last_Row(.Cells) 

     If lLastRow > 1 Then 

      For lCounter = lLastRow To 2 Step -1 

       Select Case Left(.Cells(lCounter, 1).Value, 2) 
        Case "US", "A1", "EG", "VM" 
         .Cells(lCounter, 1).EntireRow.Delete 
       End Select 

      Next lCounter 

     End If 

    End With 

    Application.ScreenUpdating = True 

End Sub 

Обратите внимание, что когда вы выполняете цикл и удаляете строки, вам нужно начинать с последней строки и перемещаться вверх.

Если это не совсем то, что вы пытаетесь сделать, сообщите мне, и я попробую еще раз :)

 Смежные вопросы

  • Нет связанных вопросов^_^