Traduction d'une macro VBA pour m'initier et comprendre cette pratique
Bonjour à tous,
j'espère que vs allez tous bien!
j'aimerais obtenir la traduction de la macro suivante pour developper mes connaissances ds ce domaine
merci par avance de l'aide que vs m'apporteriez, cordialement
Paul
Sub defusion()
Application.ScreenUpdating = False
Set plage = Range("A2:H" & Range("H" & Rows.Count).End(xlUp).Row)
For Each c In plage
If c.MergeCells Then c.UnMerge
Next c
For i = 2 To Range("H" & Rows.Count).End(xlUp).Row
For j = 1 To 7
If Cells(i, j) = "" Then Cells(i, j) = Cells(i - 1, j)
Next j
Next i
Range("B:B").Delete
Range("A:A").NumberFormat = "m/d/yyyy h:mm"
End Sub
bonjour,
je me suis plié à l'exercice: (les commentaires se rapportent à la ligne qui suit le commentaire
Sub defusion()
' ne pas faire de mise à jour de l'écran durant l'exécution de la macro (performance)
Application.ScreenUpdating = False
' on définit une plage de cellules de A2 à Hx, x étant la dernière ligne utilisée en colonne H
Set plage = Range("A2:H" & Range("H" & Rows.Count).End(xlUp).Row)
' pour chaque cellule de la plage
For Each c In plage
' si cellule fusionnée on défusionne
If c.MergeCells Then c.UnMerge
'cellule suivante
Next c
'pour chaque ligne dans l'intervalle 2 à x (x étant la dernière ligne utilisée en colonne H
For i = 2 To Range("H" & Rows.Count).End(xlUp).Row
' pour chaque colonne de l'intervalle A à G (1 à 7)
For j = 1 To 7
' si la cellule en ligne i, colonne j est vide on copie le contenu de la cellule du dessus
If Cells(i, j) = "" Then Cells(i, j) = Cells(i - 1, j)
'colonne suivante
Next j
'ligne suivante
Next i
'suppression de la colonne B
Range("B:B").Delete
'format de la colonne A date (mois/jour/année) et heure (heures:minutes)
Range("A:A").NumberFormat = "m/d/yyyy h:mm"
End SubBonjour ! Idem.
Deux remarques, l'auteur de cette macro a commis le tort (à mon avis) de ne pas déclarer ses variables et de ne pas indenter son code. Je le reformule donc avec ces 2 points corrigés :
Option Explicit
Sub defusion()
1 Dim c As Range, plage As Range
2 Dim i As Long, j As Long
3 Application.ScreenUpdating = False
4 Set plage = Range("A2:H" & Range("H" & Rows.Count).End(xlUp).Row)
5 For Each c In plage
6 If c.MergeCells Then c.UnMerge
7 Next c
8 For i = 2 To Range("H" & Rows.Count).End(xlUp).Row
9 For j = 1 To 7
10 If Cells(i, j) = "" Then Cells(i, j) = Cells(i - 1, j)
11 Next j
12 Next i
13 Range("B:B").Delete
14 Range("A:A").NumberFormat = "m/d/yyyy h:mm"
End SubOption Explicit en tête de code impose de devoir déclarer ses variables pour pouvoir les utiliser. C'est une sécurité indispensable. On la paramètre dans les options de l'éditeur VBE.
L'identation d'un programme et les sauts de ligne entre les blocs d'instructions en facilite la lecture, donc la maintenance.
Lignes 1 et 2 : déclaration des variables avec leurs types
Ligne 3 : cette instruction demande au système de ne pas rafraîchir l'écran avant la fin du traitement, ce qui l'accélère. Ici l'auteur a oublié de le remettre à True en fin d'exécution.
Ligne 4 : Range("H" & Rows.Count).End(xlUp).Row) correspond au n° de la dernière cellule occupée de la colonne "H". On appellera cette valeur n. Donc on boucle de la ligne 2 à n.
Ligne 5 à 7 : si certaine cellules sont fusionnées , on supprime la fusion de la plage H2:Hn
Ligne 8 à 12 : Dans la plage A2:Gn (2 à n et 1 à 7) si une cellule est vide, on lui affecte le contenu de la cellule juste au-dessus. La colonne "H" n'est pas concernée puisqu'elle est la 8e. Si l'auteur avait voulu remplir les espaces vides laissés par la suppression des fusions, c'est For j = 1 to 8 (et non pas 7) qu'il aurait dû mettre.
Ligne 13 : On supprime la colonne B
Ligne 14 : on met les valeurs de la colonne A dans un format date court.
merci à vs deux pour votre réponse ! :)
je vais potasser ça,
bon WE