J'ai une question qui je l'espère, sera p-e simple pour vous.
J'ai besoin d'une macro qui me permet d'agir sur une plage de cellule d'une même ligne que dans la feuille active, mais dans une autre feuille.
Pour être plus précis :
- En supposant que je suis sur cellule F5 la feuil1.
- Je veux agir sur les colonnes B et C de la même ligne de la feuil 2. Comme par exemple, en effacer le contenu.
Je me suis créé une variable qui mémorise l'adresse de la ligne sur laquelle je me trouve sur la Feuil1. Je peux ensuite aller effacer le contenu d'une cellule de cette ligne sur la Feuil2 mais avec un code comme celui-ci :
VB:
Sub test()
Dim rng1 As Range
Set rng1 = Cells(ActiveCell.Row, 1)
Sheets("Feuil2").Range(rng1.Address).Offset(0, 2).ClearContents
End Sub
là où ça se gâte, c'est si je veux agir sur une plage de cellule à partir de cette référence qu'est ma variable rng1
Par exemple, si je veux fusionner les cellules des colonnes G et H de cette même ligne. J'ai essayé un code du type :
Code:
Sub test()
Dim rng1 As Range
Set rng1 = Cells(ActiveCell.Row, 1)
Sheets("Feuil2").Range(rng1.Address).Offset(0, 6):Range(rng1.Address).Offset(0, 7).Merge
End Sub
Naturellement ça ne fonctionne pas mais je me dis qu'il y a sans doute un moyen facile.
Merci beaucoup Robert. Puisque dans ma variable, j'avais défini la ligne et la colonne, je n'avais pas réalisé que je pouvais redéfinir la ligne avec Row. Très logique. De plus, je ne connaissais pas la fonction Resize.
* sur "Feuil2", note qu'il y a "test" en B5:C5 (ce que tu avais déjà fait)
* fais Alt F8, et lance la macro test_clear ; lis le message (B5 et C5 sont inchangés)
* clique sur le bouton OK de la boîte de dialogue ; B5 et C5 sont effacés
* ça aurait fait pareil si tu avais lancé la macro depuis "Feuil1"
* sur "Feuil2", fais Alt F8 et lance la macro "test_merge" ; ça fait la fusion
des cellules B5 et C5 ; va dessus pour mieux le voir.
* si tu lances cette macro depuis "Feuil1", ça ne fait rien ! (c'est normal)
code VBA :
VB:
Option Explicit
Dim lig&
'cette sub peut être lancée à partir de "Feuil1" ou "Feuil2" (au choix).
Sub test_clear()
Application.ScreenUpdating = 0
With Worksheets("Feuil1")
.Select: lig = ActiveCell.Row
End With
Worksheets("Feuil2").Select: Cells(lig, "B").Resize(, 2).ClearContents
MsgBox "sur ""Feuil1"", la ligne de la cellule active est : " & lig
End Sub
'cette sub ne peut être lancée qu'à partir de "Feuil2", et APRÈS avoir exécuté
'la sub test_clear() ! car il faut que lig contienne le n° de la ligne active.
Sub test_merge()
If ActiveSheet.Name <> "Feuil2" Then Exit Sub 'il faut être sur "Feuil2"
If lig = 0 Then Exit Sub 'lig doit contenir un n° de ligne ; sortie si 0
Cells(lig, "B").Resize(, 2).Merge
End Sub
* sur "Feuil2", note qu'il y a "test" en B5:C5 (ce que tu avais déjà fait)
* fais Alt F8, et lance la macro test_clear ; lis le message (B5 et C5 sont inchangés)
* clique sur le bouton OK de la boîte de dialogue ; B5 et C5 sont effacés
* ça aurait fait pareil si tu avais lancé la macro depuis "Feuil1"
* sur "Feuil2", fais Alt F8 et lance la macro "test_merge" ; ça fait la fusion
des cellules B5 et C5 ; va dessus pour mieux le voir.
* si tu lances cette macro depuis "Feuil1", ça ne fait rien ! (c'est normal)
code VBA :
VB:
Option Explicit
Dim lig&
'cette sub peut être lancée à partir de "Feuil1" ou "Feuil2" (au choix).
Sub test_clear()
Application.ScreenUpdating = 0
With Worksheets("Feuil1")
.Select: lig = ActiveCell.Row
End With
Worksheets("Feuil2").Select: Cells(lig, "B").Resize(, 2).ClearContents
MsgBox "sur ""Feuil1"", la ligne de la cellule active est : " & lig
End Sub
'cette sub ne peut être lancée qu'à partir de "Feuil2", et APRÈS avoir exécuté
'la sub test_clear() ! car il faut que lig contienne le n° de la ligne active.
Sub test_merge()
If ActiveSheet.Name <> "Feuil2" Then Exit Sub 'il faut être sur "Feuil2"
If lig = 0 Then Exit Sub 'lig doit contenir un n° de ligne ; sortie si 0
Cells(lig, "B").Resize(, 2).Merge
End Sub