Как найти текст в столбце и сохранить номер строки, где он был впервые найден - Excel VBA

У меня есть следующий столбец (столбец A) с именем project (столбец строк только показывает номер строки):

rows    project
1       14
2       15
3       16
4       17
5       18
6       19
7       ProjTemp
8       ProjTemp
9       ProjTemp

У меня есть окно ввода сообщений, в котором пользователь записывает новое имя проекта, которое я хочу вставить сразу после последнего. Пример: проект 20 будет вставлен сразу после проекта 19 и до первого "ProjTemp".

Моя теория заключалась в том, чтобы найти номер строки первого "ProjTemp", а затем вставить новую строку, где проект равен 20.

Я пытался использовать функцию "Найти", но у меня возникает ошибка переполнения (я уверен, что получаю ее, потому что она набирает 3 строки "ProjTemp" и пытается установить ее на один параметр):

Dim FindRow as Range

with WB.Sheets("ECM Overview")
    Set FindRow = .Range("A:A").Find(What:="ProjTemp", _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        MatchCase:=False)
end with

Как мне закодировать это, поэтому я нахожу только номер строки кулака "ProjTemp"? Есть ли лучший способ сделать это, может быть, цикл?

Спасибо, любая помощь будет оценена!

Ответ 1

Я не очень хорошо знаком со всеми этими параметрами метода Find; но, сократив его, для меня работает следующее:

With WB.Sheets("ECM Overview")
    Set FindRow = .Range("A:A").Find(What:="ProjTemp", LookIn:=xlValues)
End With

И если вам нужен только номер строки, вы можете использовать его после:

Dim FindRowNumber As Long
.....
FindRowNumber = FindRow.Row

Ответ 2

Dim FindRow as Range

Set FindRow = Range("A:A").Find(What:="ProjTemp", _' This is what you are searching for
                   After:=.Cells(.Cells.Count), _ ' This is saying after the last cell in the_
                                                  ' column i.e. the first
                   LookIn:=xlValues, _ ' this says look in the values of the cell not the formula
                   LookAt:=xlWhole, _ ' This look s for EXACT ENTIRE MATCH
                   SearchOrder:=xlByRows, _ 'This look down the column row by row 
                                            'Larger Ranges with multiple columns can be set to 
                                            ' look column by column then down 
                   MatchCase:=False) ' this says that the search is not case sensitive

If Not FindRow  Is Nothing Then ' if findrow is something (Prevents Errors)
    FirstRow = FindRow.Row      ' set FirstRow to the first time a match is found
End If

Если вы хотите получить дополнительные, вы можете использовать:

Do Until FindRow Is Nothing
    Set FindRow = Range("A:A").FindNext(after:=FindRow)
    If FindRow.row = FirstRow Then
        Exit Do
    Else ' Do what you'd like with the additional rows here.

    End If
Loop

Ответ 3

В качестве альтернативы вы можете использовать цикл, сохранить номер строки (счетчик должен быть номером строки) и остановить цикл, когда вы найдете первый "ProjTemp".
Затем он должен выглядеть примерно так:

Sub find()
    Dim i As Integer
    Dim firstTime As Integer
    Dim bNotFound As Boolean

    i = 1
    bNotFound = True

      Do While bNotFound
        If Cells(i, 2).Value = "ProjTemp" Then
            firstTime = i
            bNotFound = false
        End If
        i = i + 1
    Loop
End Sub

Ответ 4

Несколько комментариев:

  • Поскольку позиция поиска важна, вы должны указать, где начать поиск. Я использую ws.[a1] и xlNext ниже, поэтому мой поиск начинается с A2 указанного листа.
  • Некоторые из аргументов Find, включая lookat, используют предыдущие параметры поиска. Поэтому вы должны всегда указывать xlWhole или xlPart для соответствия всем или части строки соответственно.
  • Вы можете делать все, что хотите, включая вставку строки и запрос пользователю нового значения (мой код предложит 20, если предыдущее значение было равно 19) без использования Select или Activate

предлагаемый код

Sub FindEm()
Dim Wb As Workbook
Dim ws As Worksheet
Dim rng1 As Range
Set Wb = ThisWorkbook
Set ws = Wb.Sheets("ECM Overview")
Set rng1 = ws.Range("A:A").Find("ProjTemp", ws.[a1], xlValues, xlWhole, , xlNext)
If Not rng1 Is Nothing Then
rng1.EntireRow.Insert
rng1.Offset(-1, 0).Value = Application.InputBox("Please enter data", "User Data Entry", rng1.Offset(-2, 0) + 1, , , , , 1)
Else
MsgBox "ProjTemp not found", vbCritical
End If
End Sub

Ответ 5

Проверьте "projtemp", а затем проверьте, является ли предыдущая цифра номером (например, 19,18..etc..), если это так, тогда получите строку no этого proj temp....

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