webentwicklung-frage-antwort-db.com.de

So finden Sie Text in einer Spalte und speichern die Zeilennummer dort, wo sie zuerst gefunden wurde - Excel VBA

Ich habe die folgende Spalte (Spalte A) benanntes Projekt (Reihenspalte zeigt nur die Zeilennummer an):

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

Ich habe ein Eingabemeldungsfeld, in das der Benutzer den neuen Projektnamen schreibt, den ich direkt hinter dem letzten einfügen möchte. Beispiel: Projekt 20 wird direkt nach Projekt 19 und vor dem ersten "ProjTemp" eingefügt.

Meine Theorie war, die Zeilennummer des ersten "ProjTemp" zu finden und dann eine neue Zeile einzufügen, in der das Projekt 20 ist.

Ich habe versucht, die Suchfunktion zu verwenden, erhalte jedoch einen Überlauffehler (ich bin mir sicher, dass ich ihn bekomme, weil er 3 "ProjTemp" -Strings findet und versucht, ihn auf einen Parameter zu setzen):

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

Wie kann ich das programmieren, damit ich nur die Zeilennummer der ersten "ProjTemp" finde? Gibt es einen besseren Weg, dies zu tun, vielleicht eine Schleife?

Danke, jede Hilfe wird dankbar sein!

11
Kristina

Ich bin nicht wirklich mit all diesen Parametern der Find-Methode vertraut. aber nach der Verkürzung funktioniert Folgendes für mich:

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

Und wenn Sie nur die Zeilennummer benötigen, können Sie diese nach verwenden:

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

Wenn Sie zusätzliche erhalten möchten, können Sie Folgendes verwenden: 

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
7
user2140261

Alternativ können Sie eine Schleife verwenden, die Zeilennummer beibehalten (Zähler sollte die Zeilennummer sein) und die Schleife anhalten, wenn Sie das erste "ProjTemp" ..__ finden.
Dann sollte es ungefähr so ​​aussehen: 

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
2
j0chn

Ein paar Anmerkungen: 

  1. Da die Suchposition wichtig ist, sollten Sie angeben, wo Sie die Suche starten. Ich verwende unten ws.[a1] und xlNext, sodass meine Suche in A2 des angegebenen Arbeitsblatts beginnt. 
  2. Einige Finds-Argumente - einschließlich lookat - verwenden die vorherigen Sucheinstellungen. Daher sollten Sie immer xlWhole oder xlPart angeben, um einen String ganz oder teilweise zu finden.
  3. Sie können alles tun, was Sie möchten - einschließlich dem Einfügen einer Zeile und der Aufforderung des Benutzers nach einem neuen Wert (mein Code schlägt 20 vor, wenn der vorherige Wert 19 war), ohne Select oder Activate zu verwenden.

vorgeschlagener Code

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
1
brettdj

Prüfen Sie auf "projtemp" und prüfen Sie dann, ob der vorherige Eintrag ein Zahleneintrag ist (wie 19,18..etc ..).

und wenn das nicht so ist .. dann überprüfen Sie, ob der vorherige Eintrag ein Projtemp oder ein Zahleneintrag ist ...

0
sonny