Excel / VBA: seleziona le celle tra 2 parole chiave
![](http://img.brin-designs.com/img/games/713/excel-vba-select-cells-between-2-keywords.png)
- Problema
- Soluzione
Problema
Sto provando a scrivere una macro che inizia dalla cella attiva - sale la colonna selezionando diciamo 20 celle e cerca la parola di ricerca "A" - la seleziona. Quindi guarda indietro nella colonna per la successiva parola di ricerca "B" (che in questo caso è la prima istanza di qualsiasi cosa con un valore $) e seleziona tutte le celle tra le 2 parole di ricerca ed elimina tutte le righe. Ecco cosa ho ottenuto finora (la prima parte in cui è in cerca di "N" è proprio quella di andare sul record giusto che vogliamo eliminare.Esempio di codice:
Fallo mentre è veroSet Cell = Columns (11) .Find (What: = "N", _
Dopo: = Celle (11, 11), _
LookIn: = xlFormulas, _
LookAt: = xlPart, _
SearchOrder: = xlByRows, _
SearchDirection: = xlNext, _
MatchCase: = False, _
SearchFormat: = false)
Se la cella non è nulla, quindi esci
Cell.Select
ActiveCell.Select
ActiveCell.EntireRow.Range ( "A1"). Selezionare
Intervallo (Selezione, Selezione.Offset (-20, 0)). Seleziona
Ma il codice non funziona correttamente.
Soluzione
Dovresti scoprire dove si trova la prima cella. e quindi è necessario trovare nuovamente dove si trova la seconda cella. Usa la funzione qui sottoSub MyOrigSubDefHere ()Dim lFirstHit As Long
Dim lSecondHit As Long
Fallo mentre è vero
lFirstHit = getItemLocation ("N", Columns (11),, False)
Se (lFirstHit = 0), quindi Esci
lSecondHit = getItemLocation ("B", Range (Cells (lFirstHit + 1, 11), Cells (Rows.Count, 11)),, False)
If (lSecondHit = 0) Quindi Exit Do
Rows (lFirstHit & ":" & lSecondHit). Elimina
Ciclo continuo
End Sub
GetItemLocation Funzione pubblica (sLookFor As String, _
rngSearch As Range, _
Opzionale bFullString As Boolean = True, _
Optional bLastOccurance As Boolean = True, _
Opzionale bFindRow As Boolean = True) As Long
'trova la prima / ultima riga / colonna all'interno di un intervallo per una stringa specifica
Dim cella come intervallo
Dim iLookAt As Integer
Dim iSearchDir As Integer
Dim iSearchOdr As Integer
Se (bFullString) _
Poi
iLookAt = xlWhole
Altro
iLookAt = xlPart
Finisci se
Se (bLastOccurance) _
Poi
iSearchDir = xlPrevious
Altro
iSearchDir = xlNext
Finisci se
Se non (bFindRow) _
Poi
iSearchOdr = xlByColumns
Altro
iSearchOdr = xlByRows
Finisci se
Con rngSearch
Se (bLastOccurance) _
Poi
Imposta Cell = .Find (sLookFor, .Cells (1, 1), xlValues, iLookAt, iSearchOdr, iSearchDir)
Altro
Imposta Cell = .Find (sLookFor, .Cells (.Rows.Count, .Columns.Count), xlValues, iLookAt, iSearchOdr, iSearchDir)
Finisci se
Fine con
Se la cella non è nulla allora
getItemLocation = 0
ElseIf Not (bFindRow) _
Poi
getItemLocation = Cell.Column
Altro
getItemLocation = Cell.Row
Finisci se
Imposta cella = niente
Fine Funzione
Grazie a rizvisa1 per questo suggerimento.