Как искать на листе по VBA Code? - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть рабочий лист с 2 столбцами «Ключ» и «Значение». по коду VBA, я хочу поиск Input_key по ключевым столбцам, если не существует, я добавлю новую строку [input-key] - [input-value]. Как мне код?

Ответы [ 2 ]

14 голосов
/ 27 февраля 2012

По комментариям вы поймете, что вопросы "пожалуйста, решите мою проблему для меня" не популярны.

Я догадываюсь, что вы не знаете, с чего начать, и даст вам некоторые начальные рекомендации.

Зайдите в Google и введите "учебник по Excel VBA".Вам будет предложено много сайтов.Все они разные, поэтому попробуйте несколько и найдите тот, который подходит именно вам.

Попробуйте макро-рекордер.Я настроил рабочий лист, соответствующий вашему описанию, включил регистратор макросов, выбрал столбец A, щелкнул Ctrl+F, чтобы открыть экран поиска, и нажал кнопку параметров, чтобы отобразить все параметры.Результат:

enter image description here

Посмотрите на варианты.Например, важен ли случай?Выберите по мере необходимости.Я поставил галочку «соответствовать всему содержимому ячейки», ввел «k» и нажал Find Next.Курсор перепрыгнул на ячейку, содержащую «k».Затем я выключил устройство записи макросов.

Сохраненный для меня код:

Sub Macro1()
'
' Macro1 Macro
' Macro recorded 27/02/2012 by Tony Dallimore
'
  Columns("A:A").Select
  Selection.Find(What:="k", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
      :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
      False, SearchFormat:=False).Activate
End Sub

Это допустимый VBA, но не очень хороший VBA.Макро-рекордер записал каждое действие, когда вы его выполняли.Он не знает ваших намерений.Поэтому нам нужно привести в порядок этот код.

Ключевые изменения:

  • Мы не хотим выбирать столбец A или активировать ячейку, содержащую найденное значение.
  • Нам нужно разрешить, чтобы значение не было найдено.

Скопируйте приведенный ниже макрос в модуль, в котором устройство записи макросов сохранило свой код.Я создал этот макрос, внеся изменения в сохраненный код, чтобы создать тестовую машину для игры.Он запрашивает значение, ищет его в столбце A и сообщает, было ли это значение найдено или нет.Это основа кода, который вам нужен.

Sub PlayMacro()

  Dim Prompt As String
  Dim RetValue As String
  Dim Rng As Range
  Dim RowCrnt As Long

  Prompt = ""

  ' The macro recorder has used the active worksheet.  This says which
  ' worksheet is to be used whether it is active or not.  Change "Sheet4"
  ' to the name of your worksheet.
  With Sheets("Sheet4")

    ' This will loop forever unless a statement within
    ' the loop exits the Do.
    Do While True

      RetValue = InputBox(Prompt & "Give me a value to look for")
      'RetValue will be empty if you click cancel
      If RetValue = "" Then
        Exit Do
      End If

      ' I do not wish to active the cell containing the required value.
      ' I want to know where it is.
      Set Rng = .Columns("A:A").Find(What:=RetValue, After:=.Range("A1"), _
                LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _
                SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

      If Rng Is Nothing Then
        ' The entered value could not be found
        Prompt = "I could not find """ & RetValue & """"
      Else
        ' The entered value was found
        RowCrnt = Rng.Row
        Prompt = "I found """ & RetValue & """ on row " & RowCrnt
      End If
      Prompt = Prompt & vbLf
    Loop

  End With

End Sub

Теперь снова включите видеорегистратор.Поместите курсор в столбец A ниже любых строк со значениями.Нажмите Ctrl+UpArrow.Курсор переместится к последнему значению в столбце A. Выключите устройство записи макросов.

Сохраненный код будет выглядеть следующим образом:

Sub Macro2()
'
' Macro2 Macro
' Macro recorded 27/02/2012 by Tony Dallimore
'

'
    Range("A64").Select
    Selection.End(xlUp).Select
    Range("A28").Select
End Sub

End(xlUp) - это VBA для Ctrl+UpArrow,Это самый простой способ найти последнюю использованную строку.

Чтобы добавить новую строку, которую вы хотите сделать, если значение не найдено:

RowCrnt = .Cells(Rows.Count, "A").End(xlUp).Row + 1
.Cells(RowCrnt,1),Value = "Key"
.Cells(RowCrnt,2),Value = "Value"

Если вы посмотрите на другиевопросы, которые вы обнаружите, что End иногда не даст ожидаемого результата.Попробуйте Ctrl+DownArrow и Ctrl+UpArrow для пустого столбца, столбца с одним, затем двумя значениями вверху, столбца с одним, затем двумя значениями внизу и столбца с несколькими значениями, разделенными пустыми строками.

Это должно помочь вам начать.Добро пожаловать в программирование Excel.Удачи.

0 голосов
/ 12 августа 2018

Вы можете использовать следующий простой код с командой InStr.

Private Sub CommandButton1_Click()
Dim RowNum As Long

RowNum = 1


Do Until Sheets("Data").Cells(RowNum, 1).Value = ""

If InStr(1, Sheets("Data").Cells(RowNum, 2).Value, TextBox1.Value, vbTextCompare) > 0 Then
On erro GoTo next1
ListBox1.AddItem Sheets("Data").Cells(RowNum, 1).Value
ListBox1.List(ListBox1.ListCount - 1, 1) = Sheets("Data").Cells(RowNum, 2).Value
End If
next1:
RowNum = RowNum + 1
Loop
End Sub

Вы можете прочитать больше и скачать файл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...