2 macros inopérantes après insertion de nouvelles colonnes
Bonjour à tous,
Grâce à l'aide que je reçois sur le Forum, j'arrive à faire des choses incroyables avec Excel, mais mes connaissances en VBA restent très (trop) limitées.
Aujourd'hui, j'ai modifié une feuille en ajoutant des colonnes, mais ça fait beuguer (?) 2 macros qui fonctionnaient bien jusque là.
Problème pour moi : je ne sais pas modifier le code pour faire refonctionner les 2 macros. J'ai essayé un peu à tâtons, mais sans succès.
Quelques explications :
Ma feuille est destinée au suivi de la validation de documents (1 ligne = 1 version d'un document).
Problème n°1 :
Quand un nouveau document arrive, je dois créer une nouvelle ligne.
Pour ça, je clique sur le bouton jaune "nouveau doc", ce qui insère une copie des lignes 3 et 4 sous l'endroit où j'ai cliqué (en laissant une ligne vide au-dessus de la nouvelle ligne créée).
Problème : ça ne marche plus, et comme je ne comprends pas le fonctionnement du code en détail, je ne sais pas le modifier.
Problème n°2 :
Quand une nouvelle version d'un document arrive (un "nouvel indice"), je sélectionne une cellule de la ligne correspondante (grisée), puis je clique sur le bouton jaune "nouvel indice", ce qui insère une copie de la ligne 3 immédiatement en dessous (cette nouvelle ligne se retrouve groupée avec sa voisine du dessus).
Très important : la formule dans la colonne F doit rester inchangée, de sorte qu'elle affiche un "x" seulement pour la dernière version d'un document.
Dans le fichier joint, le bouton "nouvel indice" ne marche pas ou pas à tous les coups, et la formule de la colonne F change.
De plus, le groupement de lignes se fait bizarrement.
Trois bugs qui nécessitent de modifier le code, mais c'est au-delà de mes capacités.
J'espère qu'il se trouvera une bonne âme sur le Forum pour m'aider !!!
Bonjour,
Tu n'es pas un nouveau sur le site et malgré tes 300 interventions, tu ne sembles pas avoir encore lu la charte de ce forum.
Merci d'éditer le sujet de ta demande et relire ce lien pt 3 surtout ! --> https://forum.excel-pratique.com/annonces/explications-et-regles-a-respecter-t13.html
Cordialement
Je donne toujours des titres explicites à mes posts.
Mais là, franchement, je ne voyais pas comment résumer mon problème en 64 signes...
Voilà, j'ai renommé le sujet.
La tonalité reste la même : à l'aide !!!
Bonjour,
Problème 1
J'aimerais que tu me donnes un exemple concret en sélectionnant une ligne.
J'ai fait le tes d'ajout sur la ligne 40. Il y a effectivement un bug qui se produit parce que certaines lignes ne sont pas groupées
essaie en modifiant le code de la sub Nouveau doc.
Dans cette partie de macro :
If LgFin > LgDeb Then
Range("A" & LgDeb & ":A" & LgFin).EntireRow.Ungroup
End IfAjoute avant le IF --> On Error Resume Next
Après le END IG --> On Error GoTo 0
A te relire
Merci pour ta réponse.
Je croyais t'avoir répondu mais apparemment ma réponse n'est pas passée.
J'ai fait les modifs que tu m'as proposées, mais il reste 2 bugs "aléatoires" (du moins je n'en comprends pas la logique) :
la macro fonctionne bien sur la plupart des lignes, càd que quand je clique sur le bouton "NOUVEL INDICE", une nouvelle ligne s'ajoute et se groupe.
Mais si, au moment de lancer la macro, la cellule active est située ligne 40, 41, 45, 46, 48, 49, 50, 52, 56 ou 57, alors la ligne vient s'ajouter sous la dernière ligne, et les lignes 40 à 61 se retrouvent groupées en 1 seul ensemble.
Entre temps, j'ai réfléchi au fonctionnement et à l'évolution de ma feuille, et je me suis dit que le groupage n'était pas nécessaire.
J'ai essayé de neutraliser les lignes de la macro qui portent sur le groupage et le dégroupage, mais sans succès.
Au bout du compte, cette macro pourrait donc se contenter d'insérer une copie de la ligne 3 à la place de la 1ère ligne vide sous la cellule active.
La difficulté est que ça détraque les formules, il faudrait donc :
- insérer une copie de la ligne 4 sous la 1ère ligne vide située sous la cellule active
- remplacer la ligne au-dessus de cette ligne nouvellement créée par une copie de la ligne 3
Je ne sais pas si je suis clair. Si non, je peux poster un fichier qui expliquer les opérations pas à pas.
En tous cas, si quelqu'un pouvait m'aider ça serait cool, car je n'y arrive pas tout seul.
Bonsoir
En faisant des tests je me suis aperçu que si on se positionne en ligne 56 et en pas-à-pas de n'importe quelle macro
Le calcul de LgDeb et de LgFin était erroné
LgDeb = Range("A" & Lg).CurrentRegion.Row
LgFin = Range("A" & Lg).CurrentRegion.Rows.Count + LgDeb - 1Renvoie LgDeb = 40 et LgFin = 60
Why ?
I don't know
J'ai changé la méthode pour calculer ces 2 valeurs
Il y a peut-être mieux
Option Explicit
Sub SUIVI_VISAS_NOUVEL_INDICE()
'si on crée une nouvelle colonne, il faut modifier la ligne
'Range("G" & LgFin + 1).Copy Range("G" & LgFin) en Range("H" & LgFin + 1).Copy Range("H" & LgFin)
Dim Lg As Long
Dim LgDeb As Long
Dim LgFin As Long
Dim Lgder As Long
Application.ScreenUpdating = False
Lg = ActiveCell.Row
Lgder = Range("A" & Rows.Count).End(xlUp).Row
If Lg > Lgder Or Range("A" & Lg) = "" Then Exit Sub
LgDeb = Lg
While Range("A" & LgDeb - 1) <> ""
LgDeb = LgDeb - 1
Wend
LgFin = Lg
While Range("A" & LgFin + 1) <> ""
LgFin = LgFin + 1
Wend
On Error Resume Next
If LgFin > LgDeb Then
Range("A" & LgDeb & ":A" & LgFin).EntireRow.Ungroup
End If
On Error GoTo 0
Rows(3).Copy
With Rows(LgFin + 1)
.Rows.Insert
.Offset(-1, 0).Hidden = False
End With
Range("A" & LgFin + 1).Copy Range("A" & LgFin)
Range("F" & LgFin + 1).Copy Range("F" & LgFin)
Range("A" & LgDeb & ":A" & LgFin).EntireRow.Group
ActiveCell.Offset(1, 0).Select
End Sub
Sub SUIVI_VISAS_NOUVEAU_DOC()
Dim Lg As Long
Dim LgDeb As Long
Dim LgFin As Long
Dim Lgder As Long
Application.ScreenUpdating = False
Lg = ActiveCell.Row
Lgder = Range("A" & Rows.Count).End(xlUp).Row
If Lg > Lgder Then
Rows("2:3").Copy Rows(Lgder + 1)
Range("A" & Lgder + 1).Resize(2, 1).EntireRow.Hidden = False
Else
If Range("A" & Lg) = "" Then
Lg = Lg + 1
End If
LgDeb = Lg
While Range("A" & LgDeb - 1) <> ""
LgDeb = LgDeb - 1
Wend
LgFin = Lg
While Range("A" & LgFin + 1) <> ""
LgFin = LgFin + 1
Wend
On Error Resume Next
If LgFin > LgDeb Then
Range("A" & LgDeb & ":A" & LgFin).EntireRow.Ungroup
End If
On Error GoTo 0
Rows("3:4").Copy
With Rows(LgDeb)
.Rows.Insert
.Offset(-2, 0).Hidden = False
.Offset(-1, 0).Hidden = False
End With
If LgFin > LgDeb Then
Range("A" & LgDeb + 2 & ":A" & LgFin + 1).EntireRow.Group
End If
End If
End Sub
Merci beaucoup Banzai_64, ça marche très bien !!!
Deux questions subsidiaires :
1 - Les documents que je consigne dans ma feuille sont de plus en plus nombreux (à terme j'en aurai sans doute des dizaines, avec chacun jusqu'à 6 ou 7 versions). J'ai donc modifié le groupage des lignes : maintenant, elles sont groupées par thème (voir fichier joint). J'ai donc supprimé le groupage des lignes 3 et 4 (celles qui sont insérées par la macro).
Du coup, lorsque les 2 macros insèrent des lignes, le plan se trouve modifié (le groupage s'interrompt au niveau de la ligne récemment insérée).
J'ai essayé de bidouiller un truc, du genre :
Rows(ActiveCell.Row).Select
Selection.Rows.GroupMais ça ne donne pas les résultats escomptés...
2 - Comment faire pour que les lignes créées par la macro " SUIVI_VISAS_NOUVEAU_DOC () " s'insèrent après la cellule active, plutôt qu'avant ?
En tous cas, merci pour ton aide, précieuse, comme toujours.
J'ai testé, et ça marche parfaitement !
Merci Banzai64, ton aide est inestimable.
Je n'aurai qu'un mot : " BANZAÏ !!! "
Beaucoup apprécié aussi tes commentaires dans le code, qui permettent de comprendre (un peu) comment ça fonctionne.