Comment annuler cette macro Excel VBA ?

cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009 - 28 nov. 2009 à 15:32
cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009 - 29 nov. 2009 à 15:23
Bonjour,
Je voudrais créer deux modes grâce à deux boutons "Mode saisie" et "Mode impression".
En mode impression, je supprime les lignes vides qui existent avant mon total de bas de page.
J'utilise cette macro sous mon bouton "Mode impression".
Voir bas de page.
Je voudrais une macro sous mon bouton "Mode Saisie" qui me remette les lignes vides qui viennent d'être supprimées.
Merci d'avance

Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 28/11/2009 par ygail
'
Dim myCtrl, dernLigne, I

'détermine le numéro de la dernière ligne utilisée
dernLigne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Count - 1
'désactive la mise à jour de l'écran afin d'accélérer les traitements
Application.ScreenUpdating = False

'Pour toutes les lignes en partant de la dernière
For I = dernLigne To 1 Step -1
nn = Range("b" & I).Formula 'donne à la variable nn le contenu de la
'formule. Si elle n'en contient pas nn prend la valeur null

If Left(nn, 4) = "=SUM" Then GoTo suivant
'si la formule commence par =SUM on ne supprime pas la ligne et on passe à la valeur suivante de I
'La fonction Excel CountA correspond à =NBVAL
If Application.WorksheetFunction.CountA(Range("A" & I & ":b" & I)) = 0 Then
Rows(I).Delete Shift:=xlUp
End If
suivant:
Next I
End Sub

14 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 nov. 2009 à 18:03
Salut
A mon avis, tu as pris le problème à l'envers.
Pourquoi ne pas recopier les données intéressantes pour l'impression dans une feuille temporaire avant de les bricoler ?
Cela te permettra de ne jamais toucher aux données originales.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009
28 nov. 2009 à 19:16
Merci Jack,
Mais avez vous une idée pour annuler une macro (celle de mon exemple ou une autre) avec un bouton qui ferait la même chose que revenir en arrière (ctrl+Z)?
J'avais une piste en faisant une sauvegarde avant au début de la macro :
ActiveWorkbook.Save
ça me permettrait de récupérer le dernier état sauvegardé car la commande : Application.Undo ne permet que d'annuler une frappe mais ps l'effet d'une macro ?
Non pas que je sois borné mais je suis curieux.
Merci d'avance pour votre aide ...
PS je suis un grand amateur en code !!!
Merci
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 nov. 2009 à 19:28
Re
Quand on veut récupérer des données, elles ont obligatoirement été sauvées ailleurs.
Si le Undo ne permet pas d'annuler l'action faite, où penses-tu que ces données soient parties ?
Si le logiciel ne s'en est pas occupé et toi non plus dans ton programme, je ne vois pas.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009
28 nov. 2009 à 19:32
En fait je voulais que ma macro de suppression des lignes enregistre avant de se lancer (fichier avec les lignes qui seront supprimées) et je voudrais simplement que ma macro "annuler" puisse permettre de revenir à la sauvegarde effectuée au début de la macro de suppression des lignes;
J'espère que je suis assez clair.
Merci pour votre aide
Yohann
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 nov. 2009 à 09:46
Bonjour,

Au lieu de supprimer les lignes, il suffit de les masquer ! ... ainsi tu perds rien, et tu auras ce que tu veux pour l'impression... ensuite tu peux encore revenir en arrière...

Amicalement,
Us.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 nov. 2009 à 11:59
Oui, c'est une excellente idée.
En jouant sur la hauteur de la ligne ?
Suffit ensuite de refaire la boucle et de remettre une hauteur 'standard' à chaque ligne.

Détail : Evite les Goto, c'est démodé.
Utilise plutôt un If-Then supplémentaire, en inversant le sens du test, bien sûr :
For I = dernLigne To 1 Step -1 
  nn = Range("b" & I).Formula 'donne à la variable nn le contenu de la 
  'formule. Si elle n'en contient pas nn prend la valeur null 

  If Left(nn, 4) <> "=SUM" Then
    'si la formule ne commence pas par =SUM 
    'La fonction Excel CountA correspond à =NBVAL 
    If Application.WorksheetFunction.CountA(Range("A" & I & ":b" & I)) = 0 Then 
      Rows(I).Delete Shift:=xlUp 
    End If 
  End If 
Next I


PS : Pour ton code, la prochaine fois, utilise la coloration syntaxique avec la 3ème icone à partir de la droite = plus facile à lire, non ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009
29 nov. 2009 à 12:16
Merci beaucoup à tous,
C'est bien la solution.
Je suis en train de me mettre aux macros et je recherche un livre ou un site pour débutant. Je m'aide de morceaux de codes trouvé et j'ai un peu de mal même à bien déclarer mes variables. Avez-vous un livre ou un site à me conseiller ?
Je profite de votre compétence pour vous demander une petite traduction sur les deux lignes suivantes du code
dernLigne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Count - 1

je voudrais comprendre le "+ " et le ".count -1" je sais que je part de la dernière ligne non vide et que je remonte avec un step -1 mais pourquoi le faire compter à ce moment ?
Autre chose :
For I = dernLigne To 1 Step -1

à quoi sert le "To 1" c'est pour le faire aller jusqu'à 1 en remontant ? Pourtant je n'ai aucune variable égale à 1.
Enfin pour la coloration, je sélectionne mon code et dans la liste déroulante je choisi VB ou VB sript ?
Merci d'avance
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 nov. 2009 à 13:33
Bonjour,

Je vais répondre qu'à la 1ere question du départ concernant le codage... JE vois les choses ainsi :

Option Explicit

Sub Macro1()
' MASQUER LES LIGNES VIDES

' Déclarations des variables
Dim DernLigne As Long
Dim I As Long
Dim ZoneRef As Range

' Détermine le numéro de la dernière ligne utilisée
DernLigne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1

' Désactive la mise à jour de l'affichage
Application.ScreenUpdating = False

' Désactive la mise à jour des recalculs
Application.Calculation = xlCalculationManual

' Pour toutes les lignes en partant de la dernière
For I = 1 To DernLigne

    ' Si la formule commence par =SUM on ne supprime pas la ligne et on passe à la valeur suivante de I
    If Left(Range("B" & I).Formula, 4) <> "=SUM" Then

        ' La fonction Excel CountA correspond à =NBVAL (= addition des contenus)
        If Application.WorksheetFunction.CountA(Range("A" & I & ":b" & I)) = 0 Then
            Rows(I).EntireRow.Hidden = True
        End If
    
    End If
Next I

' Ré-activations
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub


Ensuite, tu n'auras pas la possibilité de retourner en arrière avec les flèches, mais cela n'est pas grave puisque tu mets un bouton "Mode saisie" qui devra avoir le code suivant : (sinon tu le fais à la main en sélectionnant les lignes masquée puis clique droit>menu Afficher)

Sub Macro2()
' AFFICHER LES LIGNES VIDES

' Déclarations des variables
Dim DernLigne As Long
    
' Détermine le numéro de la dernière ligne utilisée
DernLigne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    
' Affichage
    Rows("1:" & DernLigne).Select
    Selection.EntireRow.Hidden = False

End Sub


Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 nov. 2009 à 13:40
Oupsss...

Supprimer cette déclaration inutile :
Dim ZoneRef As Range


et l'ancien commentaire :
' Pour toutes les lignes en partant de la dernière

en autre chose...

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 nov. 2009 à 13:44
et Re-oupsss!

Dans Macro2(), on peut améliorer les choses en écrivant simplement la partie 'Affichage par :
' Affichage
    Rows("1:" & DernLigne).EntireRow.Hidden = False


Juste une p'tite amélioration...

Amicalement,
Us.
0
cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009
29 nov. 2009 à 14:12
Merci Us,

Je suis en train de me mettre aux macros et je recherche un livre ou un site pour débutant. Je m'aide de morceaux de codes trouvé et j'ai un peu de mal même à bien déclarer mes variables. Avez-vous un livre ou un site à me conseiller ?
Je profite de votre compétence pour vous demander une petite traduction sur les deux lignes suivantes du code
Code Visual Basic :

dernLigne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Count - 1



je voudrais comprendre le "+ " et le ".count -1" je sais que je part de la dernière ligne non vide et que je remonte avec un step -1 mais pourquoi le faire compter à ce moment ?
Autre chose :
Code Visual Basic :
For I = dernLigne To 1 Step -1


à quoi sert le "To 1" c'est pour le faire aller jusqu'à 1 en remontant ? Pourtant je n'ai aucune variable égale à 1.
Enfin pour la coloration, je sélectionne mon code et dans la liste déroulante je choisi VB ou VB sript ?
Merci d'avance
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 nov. 2009 à 14:40
oh oh ho! je ne suis pas aveugle! tu viens de refaire un copier/coller de ton dernier message...

Bon, déjà le code que je propose fonctionne d'après mes tests, donc... Tu pourrais l'utiliser déjà et dire ce que tu en penses...

Ensuite, dans un forum, je réponds à une question à la fois! c'est je crois aussi dans le règlement...

Enfin, si tu veux progresser en programmation, il faudrait déjà chercher par toi-même. Il me semble que GOOGLE est un bon départ pour trouver un site... Ensuite pour un livre, ben, il suffit d'aller dans n'importe quelle boutique! ou presque... même en SuperMarché Rayon Livre, tu trouveras surement un livre d'apprentissage... Ensuite, il y a-t-il un bon livre meilleur que d'autre! oui, surement. Mais c'est à toi de juger. Ce que je trouverais bien, ne le sera surement pas pour toi. Ensuite, plus le temps passe, plus le renouvellement de livre passe aussi, ce qui rajeuni personne au passage... Aller, perso, j'aime bien la collection : "ressources Informatiques"... Mais si tu es débutant, je te la déconseille fortement ! ... On peut pas faire mieux comme réponse contradictoire! Et pis, tant pis... Et si tu vas faire un tour sur mon site, tu auras un début en video pour le VBA... qu'un simple début, sans aucune prétention... Tu auras juste perdu un peu de temps... haha... Oui c'est de la pub ! cher Admin... n'y voyez pas une pub sauvage et polluante... enfin, j'espère.

Un autre truc :
dernLigne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Count - 1

n'est pas super correct ! moi j'ai codé :
dernLigne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.ROWS.Count - 1

En fait je comprends bien ma syntaxe, et pas beaucoup la tienne... je sais... je sais... cela t'aide pas trop, mais si je dois tout expliquer pas à pas, c'est un véritable cours ! voir un bouquin de 500 pages à écrire... donc plusieurs mois de travail d'écriture... Et la TextBox où j'écris ce message ne pourrait pas le supporter ! alors ! c'est tout !

Bon courage,

Amicalement,
Us.
0
cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009
29 nov. 2009 à 15:16
Merci Us,
Le code marche.
Désolé pour le copier-coller.
Merci pour tes conseils.
Yohann
0
cs_Y1982 Messages postés 8 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009
29 nov. 2009 à 15:23
Je suis sur ton site et je vais regarder les vidéos. Super car il y a une vidéo pour un sujet.
Je vais pouvoir commencer par les bases, car il y a beaucoup de code sur internet mais j'aimerais comprendre ce que je fais.
Merci encore
0
Rejoignez-nous