programing

열에서 텍스트를 찾는 방법 및 처음 찾은 행 번호 저장 - Excel VBA

telecom 2023. 10. 2. 10:59
반응형

열에서 텍스트를 찾는 방법 및 처음 찾은 행 번호 저장 - Excel VBA

프로젝트라는 이름의 다음 열(A 열)이 있습니다(행 열에는 행 번호만 표시됩니다).

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

사용자가 마지막 프로젝트 이름 바로 뒤에 제가 삽입하고 싶은 새로운 프로젝트 이름을 적는 입력 메시지 상자가 있습니다.Ex: 프로젝트 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" 행 번호만 찾도록 코드화하려면 어떻게 해야 합니까?더 나은 방법이 없을까요? 어쩌면 루프?

감사합니다, 어떤 도움이든 감사히 받겠습니다!

저는 그 모든 변수에 대해 잘 알지 못합니다.Findmethod; 그러나 단축하면 다음이 제게 효과가 있습니다.

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

행 번호만 필요한 경우 다음과 같이 사용할 수 있습니다.

Dim FindRowNumber As Long
.....
FindRowNumber = FindRow.Row
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

또는 루프를 사용하여 행 번호(카운터는 행 번호여야 함)를 유지하고 첫 번째 "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

몇 가지 의견:

  1. 검색 위치가 중요하므로 검색을 시작할 위치를 지정해야 합니다.사용합니다.ws.[a1]그리고.xlNext아래에서 검색을 시작합니다.A2지정된 시트의
  2. 중 일부Finds 인수 - 포함lookat사전 검색 설정을 사용합니다.그래서 당신은 항상 특정해야 합니다.xlWhole아니면xlPart각각 스트링의 전부 또는 일부를 일치시킵니다.
  3. 사용하지 않고 행을 삽입하고 사용자에게 새 값을 요구하는 것을 포함하여 원하는 모든 것을 할 수 있습니다(이전 값이 19인 경우 내 코드는 20을 제안합니다).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

"projecttemp"를 확인한 다음 이전 항목이 번호 입력(예: 19,18 등)인지 확인한 다음 해당 projtemp의 행 번호를 가져옵니다.

만약 그렇지 않다면..그런 다음 이전 항목이 프로젝트템 또는 번호 입력인지 다시 확인합니다.

언급URL : https://stackoverflow.com/questions/15910913/how-to-find-text-in-a-column-and-saving-the-row-number-where-it-is-first-found

반응형