2015-05-21 6 views
1

Предположим лист Excel содержит следующие значения в случайном столбце:Как найти несколько строк в VBA

VARIABLE X 
AbbA 
AddA 
bbAA 
ccbb 
KaaC 
cccc 
ddbb 
ccdd 
BBaa 
ddbB 
Bbaa 
dbbd 
kdep 
mCca 
mblp 
ktxy 

Теперь столбец следует искать несколько слов и фраз, в то же время, например, следующее:

(1) "ВВ"

(2) "CC"

(3) "d"

Я поставил целевые строки в массиве:

Dim searchFor As String 
Dim xArr 
searchFor = "bb/cc/d" 
xArr = Split(searchFor , "/") 

предположить Также не имеет значения, если «бб» есть маленькие буквы или большие буквы (не чувствителен к регистру в данном случае). Для других случаев это чувствительно к регистру. В конце я хотел бы выбрать соответствующие целевые случаи в терминах связанных строк. Также обратите внимание, что я хотел бы включить случаи в выборку, где целевая строка (например, «bb») является частью слова (например, «dbbd»).

Если возможно, игнорировать заголовок колонки ("Variable X) для поиска/фильтрации, а также в окончательном выборе значений.

Как это может быть сделано в VBA, используя (1) фильтры и/или с использованием ? (2) регулярные циклы Какой путь вы бы порекомендовали

+1

Можете ли вы показать нам, что вы пробовали? –

+0

@ SiddharthRout Я попытался применить решение (по u): http://stackoverflow.com/questions/11631363/how-to-copy-a-line-in-excel-using-a-specific-word-and -pasting-to-another-excel-s в течение долгого времени, но я не могу заставить код работать с несколькими критериями, и я не могу найти ответ на проблему где-нибудь еще – EDC

+0

ну, вы можете попробовать добавить код ошибки;) – KKowalczyk

ответ

1

AbBa должен быть выбран или удален. Я пытаюсь ввести «неправильные случаи», применяя эту процедуру.

В дополнение к моим комментариям, здесь приведен пример использования .Find и .FindNext

Мои Предположения

  1. Мы работаем с Col A в Sheets("Sheet1")
  2. Мой Массив предопределены. Вы можете использовать свой массив.

В приведенном ниже примере я окрашиваю ячейки в красный цвет. Измените, если применимо.

Sub Sample() 
    Dim MyAr(1 To 3) As String 
    Dim ws As Worksheet 
    Dim aCell As Range, bCell As Range 
    Dim i As Long 

    Set ws = ThisWorkbook.Sheets("Sheet1") 

    MyAr(1) = "bb" 
    MyAr(2) = "cc" 
    MyAr(3) = "d" 

    With ws 
     '~~> Loop through the array 
     For i = LBound(MyAr) To UBound(MyAr) 
      Set aCell = .Columns(1).Find(What:=MyAr(i), LookIn:=xlValues, _ 
      LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
      MatchCase:=False, SearchFormat:=False) 

      If Not aCell Is Nothing Then 
       Set bCell = aCell 
       aCell.Interior.ColorIndex = 3 

       Do 
        Set aCell = .Columns(1).FindNext(After:=aCell) 

        If Not aCell Is Nothing Then 
         If aCell.Address = bCell.Address Then Exit Do 
         aCell.Interior.ColorIndex = 3 
        Else 
         Exit Do 
        End If 
       Loop 
      End If 
     Next 
    End With 
End Sub 

enter image description here

+0

Работает отлично, как ожидалось. Спасибо! – EDC

+1

Это потрясающе. Я лучше ударил мешок сейчас! это уже 4:05 утра по этой части планеты: P –

1

Начните с вашими данными в колонке , это:

Sub qwerty() 
    Dim i As Long, N As Long 
    N = Cells(Rows.Count, "A").End(xlUp).Row 

    For i = 2 To N 
     t = LCase(Cells(i, 1).Text) 
     If InStr(t, "bb") + InStr(t, "cc") + InStr(t, "d") = 0 Then 
     Cells(i, 1).EntireRow.Hidden = True 
     End If 
    Next i 
End Sub 

скроет негодяев:

enter image description here

AutoFilter может быть жестким с более чем двумя вариантами.

+0

спасибо за решение. Интересно, делает ли этот рабочий регистр чувствительным? Так, например, я могу выполнить поиск '* bb *', выполнив это? (В боковом я не хотел прятать строки, а выбирать их, но я знаю, как это исправить) – EDC

+0

Я принудительно нечувствительность к регистру с помощью * LCase() * ............. ... –

+0

Хорошо, я никогда раньше не использовал эту функцию. Тем не менее ваше решение работает неправильно, так как оно не удаляло, например, строку 4 (содержит «bb») или строку 11 (содержит «bB», который я хотел бы равным «bb»). – EDC

1

Один из способов удалить их - использовать расширенный фильтр. Конечно, вам не нужно VBA для этого, но с использованием VBA:


Option Explicit

Sub FilterByStrings() 
    Dim rData As Range 
    Dim rFiltered As Range 
    Dim rCriteria As Range 
    Dim vStrings As Variant, critStrings() As Variant 
    Dim I As Long 

vStrings = VBA.Array("bb", "cc", "d") 

Set rData = Range("a1", Cells(Rows.Count, "A").End(xlUp)) 
Set rFiltered = Range("B1") 
Set rCriteria = Range("c1") 

'Add the wild cards and the column headers 
ReDim critStrings(1 To 2, 1 To UBound(vStrings) + 1) 
For I = 0 To UBound(vStrings) 
    critStrings(1, I + 1) = rData(1, 1) 
    critStrings(2, I + 1) = "<>*" & vStrings(I) & "*" 
Next I 

'criteria range 
Set rCriteria = rCriteria.Resize(UBound(critStrings, 1), UBound(critStrings, 2)) 
rCriteria = critStrings 

rData.AdvancedFilter Action:=xlFilterCopy, criteriarange:=rCriteria, copytorange:=rFiltered 
rCriteria.EntireColumn.Clear 

End Sub 

Если вы хотите, чтобы вернуть клетки, которые соответствуют эти строки, вы должны установить диапазон критериев по-разному, удаляя <> и имеющий критерии в одном столбце, а не в соседних строках.

+0

О, очень интересно, спасибо за запись. Я не думал о расширенных фильтрах. – EDC

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