Excel / VBA - Sélectionnez des cellules entre 2 mots-clés
- Problème
- Solution
Problème
J'essaie d'écrire une macro qui commence à partir de la cellule active - monte dans la colonne en sélectionnant par exemple 20 cellules et recherche le mot de recherche "A" - la sélectionne. Puis, dans la colonne, recherche le mot de recherche suivant "B" (qui dans ce cas est la première instance de tout ce qui a une valeur $), sélectionne toutes les cellules entre les 2 mots de recherche et supprime toutes les lignes. Voici ce que j’ai eu jusqu’à présent (la première partie où il est question de "N" consiste simplement à le placer sur le bon enregistrement que nous voulons supprimer.Exemple de code:
Faire tant que vraiSet Cell = Columns (11) .Find (Quoi: = "N", _
Après: = Cellules (11, 11), _
LookIn: = xlFormulas, _
LookAt: = xlPart, _
SearchOrder: = xlByRows, _
SearchDirection: = xlNext, _
MatchCase: = False, _
SearchFormat: = False)
Si la cellule n'est rien, alors quittez
Cell.Select
ActiveCell.Select
ActiveCell.EntireRow.Range ("A1"). Sélectionnez
Plage (Sélection, Sélection.Offset (-20, 0)). Sélectionnez
Mais le code ne fonctionne pas correctement.
Solution
Vous devez savoir où se trouve la première cellule. et vous devez à nouveau trouver où se trouve la deuxième cellule. Utilisez la fonction ci-dessousSous MyOrigSubDefHere ()Dim lFirstHit As Long
Dim lSecondHit As Long
Faire tant que vrai
lFirstHit = getItemLocation ("N", Colonnes (11),, False)
Si (lFirstHit = 0), puis quitter, puis
lSecondHit = getItemLocation ("B", Range (Cellules (lFirstHit + 1, 11), Cellules (Rows.Count, 11)),, False)
Si (lSecondHit = 0) puis quittez Do
Lignes (lFirstHit & ":" & lSecondHit) .Supprimez
Boucle
End Sub
Fonction publique getItemLocation (sLookFor As String, _
rngSearch As Range, _
Facultatif bFullString As Boolean = True, _
Facultatif bLastOccurance As Boolean = True, _
Facultatif bFindRow As Boolean = True) As Long
'trouve la première / dernière ligne / colonne dans une plage pour une chaîne spécifique
Dim Cell As Range
Dim iLookAt As Integer
Dim iSearchDir As Integer
Dim iSearchOdr As Integer
Si (bFullString) _
ensuite
iLookAt = xlWhole
Autre
iLookAt = xlPart
Fin si
Si (bLastOccurance) _
ensuite
iSearchDir = xlPrevious
Autre
iSearchDir = xlNext
Fin si
Si non (bFindRow) _
ensuite
iSearchOdr = xlByColumns
Autre
iSearchOdr = xlByRows
Fin si
Avec rngSearch
Si (bLastOccurance) _
ensuite
Définir Cell = .Find (sLookFor, .Cells (1, 1), xlValues, iLookAt, iSearchOdr, iSearchDir)
Autre
Définir Cell = .Find (sLookFor, .Cells (.Rows.Count, .Columns.Count), xlValues, iLookAt, iSearchOdr, iSearchDir)
Fin si
Terminer par
Si la cellule n'est rien alors
getItemLocation = 0
ElseIf Not (bFindRow) _
ensuite
getItemLocation = Cell.Column
Autre
getItemLocation = Cell.Row
Fin si
Set Cell = Nothing
Fonction de fin
Merci à rizvisa1 pour cette astuce.