2015-07-21 2 views
1

В настоящее время мой код проходит через первый столбец и находит определенное ключевое слово. Я хочу выполнить другой поиск в следующем столбце с другим ключевым словом, но только для строк, в которых это слово было найдено в первом столбце. Мне было интересно, как я могу это сделать.как установить диапазон для определенных ячеек

Вот мой код до сих пор:

Set aCell = oRange.Find(What:=firstInput, LookIn:=xlValues, _ 
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
        MatchCase:=False, SearchFormat:=False) 

If Not aCell Is Nothing Then 

    Set bCell = aCell 
    FoundAt = aCell.Address 

    Do 

     Set aCell = oRange.FindNext(After:=aCell) 

     If Not aCell Is Nothing Then 

     If aCell.Address = bCell.Address Then 
      Exit Do 

     FoundAt = FoundAt & ", " & aCell.Address 

     Else 

     Exit Do 

     End If 

    Loop 

Else 

    MsgBox SearchString & " not Found" 

    Exit Sub 

End If 

MsgBox "The Search String has been found these locations: " & FoundAt 

Exit Sub 

В основном все места вернулись в FoundAt стал диапазон поиска для следующего столбца.

+0

Это хороший вопрос, но ответ не очевиден. Я рекомендую вам прочитать это: http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/ У меня немного отличающаяся версия, сильно вдохновленная Сидом, которую я могу вам дать , но я не уверен, понял ли я первое предложение вашего вопроса. Если вы это разъясните, это поможет! (О порядке, в котором вы хотите найти) –

+0

@DavidGM эта ссылка очень помогла. Я внес соответствующее изменение в свой код, но теперь я застрял на чем-то другом. Было бы проще связаться с вами через прямое сообщение или мне просто переписать мой пост здесь? – user3242614

+0

Переделайте, возможно, кто-то еще может вам помочь! Если это не связано, тогда задайте новый вопрос. –

ответ

0

Я не уверен, где именно вы сидите на решении этого, поскольку похоже, что вопрос со временем изменился. Исходя из того, что я понимаю, вопрос должен быть, вы хотите найти все строки в столбце A, соответствующие вашему поисковому запросу, а затем ТОЛЬКО искать эти строки в столбце B для другого поискового запроса. Так, например:

A   B 
Apple  Cobbler 
Cherry Cobbler 
Peach  Pie 
Apple  Pie 
Apple  iPad 

Если 2 условия поиска были «Apple» и «пирог», он будет возвращать Row 4.

Я бы сделать это с помощью объекта Collection.

Dim myCol As New Collection 
Dim r As Integer 
Dim FirstSearchTerm As String 
Dim SecondSearchTerm As String 

For r = 1 To Sheet1.UsedRange.Rows.Count 
    If Sheet1.Cells(r, 1) = FirstSearchTerm Then 
    myCol.Add r, Sheet1.Cells(r, 2) 
    End If 
Next 
MsgBox myCol.Item(SecondSearchTerm) 'Returns 4 

Конечно, это также предполагает, что Apple Pie не появляется дважды. Например:

A   B 
Apple  Cobbler 
Cherry Cobbler 
Peach  Pie 
Apple  Pie 
Apple  iPad 
Apple  Pie 

Нарушение этого кода.


Edit: Ответ на комментарий

Итак, теперь вы хотите найти что-то вроде этого?

A   B  C  D 
Apple  Cobbler Joe  Blow 
Cherry Cobbler Joe  DiMaggio 
Peach  Pie  Sally Sparrow 
Apple  Pie  Jane Goodall 
Apple  iPad  Ivan Terrible 
Apple  Pie  Sally Sparrow 
Apple  Pie  Jane Seymour 

И быть в состоянии вернуть строку 4, если у вас есть 4 отдельные поисковые термины «Яблоко», «Pie», «Джейн», и «Гудолл»?

На данный момент вы можете подумать о реструктуризации ваших данных! J/K: D

Итак, вместо добавления значения ячейки в объект Collection мы добавим строку в объект Collection. Затем мы должны продолжать цикл через нашу коллекцию, пока у нас не будет Highlander (может быть только один!). По сути, мы продолжаем манипулировать назад и четвертый отсеивать плохие данные, пока мы не останемся только с хорошим. Я уверен, что есть способ сделать это рекурсивно, но его 5 часов.

Dim myFirstCol As New Collection 
Dim mySecCol As New Collection 
Dim x As Integer 'Switching to x so its not as confusing 
Dim FirstSearchTerm As String 
Dim SecondSearchTerm As String 
Dim ThirdTerm As String 
Dim FourthTerm As String 

FirstSearchTerm = "Apple" 
SecondSearchTerm = "Pie" 
ThirdTerm = "Jane" 
FourthTerm = "Seymour" 

'First, get all rows matching our first term 
For x = 1 To Sheet1.UsedRange.Rows.Count 
    If Sheet1.Cells(x, 1) = FirstSearchTerm Then 
    myFirstCol.Add x 'Just save the row number 
    End If 
Next 

'now loop through that collection search for our second term 
'Item(x) contains the row number for rows that matched our search terms 
For x = 1 To myFirstCol.Count 
    If Sheet1.Cells(myFirstCol.Item(x), 2) = SecondSearchTerm Then 
     mySecCol.Add myFirstCol.Item(x) 
    End If 
Next 

'And loop through again for the 3rd term 
Set myFirstCol = New Collection 'Reuse it 
For x = 1 To mySecCol.Count 
    If Sheet1.Cells(mySecCol.Item(x), 3) = ThirdTerm Then 
     myFirstCol.Add mySecCol.Item(x) 
    End If 
Next 

'And fourth 
Set mySecCol = New Collection 'Reuse it 
For x = 1 To myFirstCol.Count 
    If Sheet1.Cells(myFirstCol.Item(x), 4) = FourthTerm Then 
     mySecCol.Add myFirstCol.Item(x) 
    End If 
Next 
msgbox mySecCol.Item(1) 'Which is the row number matching all our terms 
+0

Привет, мне было интересно, можете ли вы помочь мне с другой проблемой. У меня есть «Cherry Cobbler Joe Anna». Как я мог вставить эту строку данных в строку 2. Поэтому я сохранил каждый из первых трех столбцов в коллекции, но я не уверен, какую проверку я могу сделать в последнем столбце, чтобы определить, как вставить его над строкой 2. – user3242614

1

Как это:

Sub test2() 
Dim firstInput As String 
Dim i As Integer, col As Integer 
Dim Rng As Range 
Dim check1 As Boolean 

firstInput = "cat" 
col = 1 ' this will start us off in column 1 ("A") 

With Sheets("New") ' using this sheet 
    ' There's no reason to loop through ALL columns in Excel, let's just use the columns that are actually in use (.usedrange.columns.count) 
    For i = 1 To .UsedRange.Columns.Count 
     Do While Rng Is Nothing 'This will loop until a match is found, or not found 
      If col > .UsedRange.Columns.Count Then Exit Do ' if we exceed the used columns, you can stop looking through them 
      Set Rng = .Columns(col).Find(what:=firstInput, LookIn:=xlValues, lookat:=xlWhole, searchOrder:=xlByRows) 
      col = col + 1 
     Loop 
    Next i 


    If Rng Is Nothing Then 
     MsgBox ("Nothing found in this sheet") 
    Else   ' When there is a match, do below code 
     MsgBox (firstInput & " found in cell " & Rng.address) 
     Application.Goto Rng, True 
     RowNum = Rng.row 
     MsgBox RowNum 
     check1 = True 
    End If 
End With 

End Sub 

Это может быть обманка или два, в зависимости от того, как лист настроен. Просто дайте мне знать, если это работает, или какие ошибки вы получите, если нет. Кроме того, любые вопросы просто спрашивают!

Редактировать: Bah - Я вижу, что вы ищете по строкам. Вам нужно, чтобы это было так, или это все в порядке?

+0

привет, я немного изменил свой вопрос, когда выяснил, что этот вопрос разобрался. Я решил использовать функцию find в excel – user3242614

0

@ user3242614 сказал:

Привет, мне было интересно, если вы могли бы мне помочь с другой проблемой. У меня есть «Cherry Cobbler Joe Anna».Как я мог вставить эту строку данных в строку 2. Итак, i сохранил каждый из первых трех столбцов в коллекции, но я не уверен , какую проверку я могу выполнить в последнем столбце, чтобы определить, как вставить его над строкой 2 .

Так что если у вас есть набор данных:

A   B  C  D 
Apple  Cobbler Joe  Blow 
Cherry Cobbler Joe  DiMaggio 
Peach  Pie  Sally Sparrow 
Apple  Pie  Jane Goodall 
Apple  iPad  Ivan Terrible 
Apple  Pie  Sally Sparrow 
Apple  Pie  Jane Seymour 

а кто-то входит:

Cherry Cobbler Joe  Anna 

вы хотите, чтобы найти его и ввести его в алфавитном порядке?

Если это так, то после каждого цикла For x = 1 to collection.Count .... Next проверьте значение коллекции. Если его ноль, они «искали» что-то, чего не существует, и поэтому его следует добавить.

Таким образом, после первой коллекции собраны, мы бы вставить этот код:

If myFirstCol.Count = 0 Then 'No values matched 
    For r = 1 To Sheet1.UsedRange.Rows.Count 
    'But for subsequent loops you need to loop through the Collection Like this: 
    ' For r = 1 To myFirstCol.Count 
     If Sheet1.Cells(r, 1) > FirstSearchTerm Then 
      r = r - 1 ' The Row the data should be inserted into. 
      Rows(r).Insert 
      Cells(r, 1) = FirstSearchTerm 
      Cells(r, 2) = SecondSearchTerm 
      Cells(r, 3) = ThirdTerm 
      Cells(r, 4) = FourthTerm 
      Exit For 'Jump out..no sense doing more comparisons 
     End If 
    Next 
End If 

HTH

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