Excel / VBA: seleziona le celle tra 2 parole chiave

  • 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 è vero

Set 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 sotto

 Sub 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.

Articolo Precedente Articolo Successivo

I Migliori Consigli