Excel / VBA - Wählen Sie Zellen zwischen 2 Schlüsselwörtern aus
- Problem
- Lösung
Problem
Ich versuche, ein Makro zu schreiben, das von der aktiven Zelle ausgeht - gehe die Spalte hoch und wähle etwa 20 Zellen aus und suche nach dem Suchwort "A" - wähle es aus. Dann sucht er in der Spalte nach dem nächsten Suchwort "B" (in diesem Fall die erste Instanz von irgendetwas mit einem $ -Wert) und wählt alle Zellen zwischen den beiden Suchwörtern aus und löscht alle Zeilen. Hier ist, was ich bisher habe (der erste Teil, in dem nach "N" gesucht wird, besteht darin, es auf den richtigen Datensatz zu bringen, den wir löschen möchten.Codebeispiel:
Do While TrueSet Cell = Columns (11) .Find (What: = "N", _
Nach: = Zellen (11, 11), _
LookIn: = xlFormulas, _
LookAt: = xlPart, _
SearchOrder: = xlByRows, _
Suchrichtung: = xlNext, _
MatchCase: = False, _
SearchFormat: = False)
Wenn die Zelle nichts ist, beenden Sie Do
Cell.Select
ActiveCell.Select
ActiveCell.EntireRow.Range ("A1")
Bereich (Auswahl, Auswahl.Offset (-20, 0))
Aber der Code funktioniert nicht richtig.
Lösung
Sie müssten herausfinden, wo sich die erste Zelle befindet. und dann müssen Sie wieder herausfinden, wo sich die zweite Zelle befindet. Verwenden Sie die folgende FunktionSub MyOrigSubDefHere ()Verdunkeln Sie den ersten Treffer so lange wie möglich
LSecondHit As Long dimmen
Do While True
lFirstHit = getItemLocation ("N", Spalten (11),, False)
If (lFirstHit = 0) Dann Exit Do
lSecondHit = getItemLocation ("B", Range (Zellen (lFirstHit + 1, 11), Zellen (Rows.Count, 11)),, False)
If (lSecondHit = 0) Dann Exit Do
Zeilen (lFirstHit & ":" & lSecondHit) .Delete
Schleife
End Sub
Öffentliche Funktion getItemLocation (sLookFor As String, _
rngSearch As Range, _
Optional bFullString As Boolean = True, _
Optional bLastOccurance As Boolean = True, _
Optional bFindRow As Boolean = True) As Long
'finde die erste / letzte Zeile / Spalte innerhalb eines Bereichs für eine bestimmte Zeichenkette
Zelle als Bereich abdunkeln
ILookAt als Ganzzahl dimmen
ISearchDir als Ganzzahl dimmen
ISearchOdr als Ganzzahl dimmen
If (bFullString) _
Dann
iLookAt = xlWhole
Sonst
iLookAt = xlPart
End If
If (bLastOccurance) _
Dann
iSearchDir = xlPrevious
Sonst
iSearchDir = xlNext
End If
Wenn nicht (bFindRow) _
Dann
iSearchOdr = xlByColumns
Sonst
iSearchOdr = xlByRows
End If
Mit rngSearch
If (bLastOccurance) _
Dann
Set Cell = .Find (sLookFor, .Cells (1, 1), xlValues, iLookAt, iSearchOdr, iSearchDir)
Sonst
Set Cell = .Find (sLookFor, .Cells (.Rows.Count, .Columns.Count), xlValues, iLookAt, iSearchOdr, iSearchDir)
End If
Ende mit
Wenn Zelle dann nichts ist
getItemLocation = 0
Sonst nicht (bFindRow) _
Dann
getItemLocation = Cell.Column
Sonst
getItemLocation = Cell.Row
End If
Setze Zelle = Nichts
Funktion beenden
Danke an rizvisa1 für diesen Tipp.