Retrouver et Déplacer des données
Voyons comment retrouver une donnée dans excel et à partir de cette dernière copier ou déplacer d'autres cellules
Il faut d'abord déterminer une plage de recherche. L'action sur cette zone sera une boucle.
Cela s'indique en VBA dans une simple procédure For...Next
Sub recherche()
'on détermine une variable de type cellule
Dim cel As Range
'on détermine une boucle sur une plage de cellule,
'ici de la cellule A1 jusque la dernière cellule remplie adjacente à A1
'il ne peut pas y avoir d'interruption entre les données
'sinon la boucle s'arrête
For Each cel In Range("A1", Range("A1").End(xlDown))
'on détermine maintenant une ou des actions à prendre
'ces actions peuvent être soumises à condition(s)
If cel = "A" Then
MsgBox "Vous avez trouvé une cellule qui contient la lettre A dans la cellule " & cel.Address
End If
'on passe à la cellule suivante
Next
End Sub
Notez que la plage de recherche peut prendre différentes formes :
- une colonne entière : Range("A:A")
- des cellules en ligne : Range("A3:AC3")
- une zone : Range("I7:U20")
Sub recherche()
For rwIndex = 2 to 4
For colIndex = 2 to 10
If Cells(rwIndex, colIndex) < .001 Then
Cells(rwIndex, colIndex).Value = 0
End If
Next colIndex
Next rwIndex
End Sub
On peut aussi référencer la plage de recherche avec une instruction Cells, par exemple Cells(2,2) que l'on peut faire varier aussi
Bref, cela devient une question de syntaxe Bien souvent, on se servira d'une fonction recherche pour copier ou déplacer des données situées dans l'environnement immédiat de notre "trouvaille". Et ici, un concept bien pratique peut être utilisé : OFFSET L'offset est un déplacement fictif du focus ou étant sur la cellule sélectionnée par notre boucle, c'est comme si cette cellule étendait ses petits bras musclés vers la donnée pointée par l'offset. Un exemple cel.Offset(3,-2) signifie que je désire traiter avec la cellule située 3 lignes plus bas et deux colonnes avant ma variable "cel" Je peux bien sûr appliquer n'importe quel traitement à cette cellule comme si mon curseur était sur elle, comme par exemple la recopier ailleurs comme ceci par exemple cel.Offset(0, 6) = cel.Offset(3, -2). Comme vous le voyez, excel travaille sur deux cellules sans quitter sa "sélection" en cours. Ici les déplacements de l'offset sont relatifs et donc lors de la prochaine boucle, excel travaillera sur d'autres cellules. Pensez à faire un pas à pas avec la touche F8 dans une phase de débogage pour vérifier que votre fonction remplit son rôle revoici notre fonction du début pour tester
Sub recherche()
'on détermine une variable de type cellule
Dim cel As Range
'on détermine une boucle sur une plage de cellule,
'dans la colonne D puisque l'on va faire -2 colonnes
'cela ne pourrait pas fonctionner en colonne A,B
'ici de la cellule D1 jusque la dernière cellule remplie adjacente à D1
'il ne peut pas y avoir d'interruption entre les données
'sinon la boucle s'arrête
For Each cel In Range("D1", Range("D1").End(xlDown))
'on détermine maintenant une ou des actions à prendre
'ces actions peuvent être soumises à condition(s)
If cel = "A" AND cel.Offset(0,1) = "b" Then
MsgBox "Vous avez trouvé une cellule qui contient la lettre A dans la cellule " & cel.Address
MsgBox cel.Offset(3, -2).Address
'On copie des cellules ailleurs
cel.Offset(0, 6) = cel.Offset(3, -2)
cel.Offset(0, 7) = cel.Offset(4, -2)
End If
'on passe à la cellule suivante
Next
End Sub