Как найти текст в столбце и сохранить номер строки, где он был впервые найден - 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 или номером...