Créer une macro pour annuler cette macro

Y1982

XLDnaute Nouveau
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

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 ?
 
Dernière édition:

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Créer une macro pour annuler cette macro

Bonsoir Y1982 ,

sans fichier joint, difficile de te répondre

Perso, je ferais comme suit:
avec la macro impression, je modifierais la couleur du texte qui ne doit pas être imprimé ( mettre les caractères en blanc)

et en suite l'autre bout de code rétablirait la couleur initiale

tu peux aussi mettre les hauteurs de lignes concernées à 0 et cela sans changer la couleur de l'encre dnas ce cas, elles ne s'impirmeront pas
ne pas oublier de rétablir après impression

dans un cas comme dans l'autre, rien ne sera perdu

bon week-end
à+
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Créer une macro pour annuler cette macro

Bonsoir le Forum

Plutôt que de "Delete" les "Rows" qui sont à Zéro... Porquoi ne pas faire "Hidden" ?

Je ne connais pas la structure de ta feuille et la raison du Delete, mais ce serait le plus rapide et simple au lieu d'une usince à gaz.


Exemple :

Code:
Sub Cache()
Dim i As Integer
For i = 1 To 50
        If Cells(i, 1) & Cells(i, 2) = "" Then
            Rows(i).Hidden = True
        End If
Next i
End Sub



Code:
Sub De_Cache()

Rows("1:50").Hidden = False

End Sub

Bonne Soitée

@+Thierry
 

oracle7

XLDnaute Nouveau
Re : Créer une macro pour annuler cette macro

@ Y1982

Je te propose un principe d'algorithme qui devrait répondre à ton besoin :

1 - Tu crées une macro toute simple "mode_saisie" qui sera appelée par ton bouton "Mode saise"
Cette macro ne fait qu'initialiser une variable X (par ex X="mode _saisie") que tu passe en paramètre à ta macro "macro1" lors de son appel soit macro1(X).
Code:
private sub mode_saisie()
dim X as string ' (ou ton_type_perso)
X="mode _saisie"
macro1(X)
end sub

2 - Dans le même principe tu crées une macro "mode_impression" appelée par le bouton "Mode impression"
Comme précédemment cette macro initialise une variable Y (Y="mode_impression) que tu passes en paramètre à ta macro "macro1" lors de son appel soit macro1(Y).

Bien évidemment X et Y sont du même type !

3 - Tu modifies ta macro1 pour recevoir un paramètre du même type que X ou Y en argument.

Ensuite un simple select case sur la valeur du paramètre recu et tu fais selon le cas le traitement correspondant.
Pour ce qui est des supprimer les lignes vides : en fait tu ne les supprimes pas !
a) d'une part cela répond à ton autre besoin de traitement
b) d'autre part, puisque tu savais les identifier pour les supprimer, donc tu sais les identifier pour les ignorer et ainsi passer à la ligne suivante dans la boucle dans ton traitement.

4 - Par ailleurs un petit conseil de programmation : même si VBA le permet il ne faut pas utiliser la commande "GOTO" ! C'est le meilleur moyen d'introduire des erreurs et de constater que selon les cas la procédure ou la fonction qui les utilise ne rend pas le service que l'on attend d'elle. En clair, je suis désolé mais pour un puriste c'est du travail ni fait ni faire et bien souvent l'erreur courante de tout débutant.
Dans ton cas par exemple :
Code:
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
a) D'abord je t'invite aussi à revoir le fonctionnement de la fonction IF THEN ELSE ENDIF. surtout pour voir ce qui se passe après le "THEN" en fonction du résultat du test initié par le "IF" ! Cela te permettra de mieux comprendre mon propos et d'être à l'avenir plus rigoureux dans l'écriture de ton code.
b) Donc
Code:
If Left(nn, 4) = "=SUM" Then GoTo suivant
Pourrait se récrire tout simplement comme :
Code:
If Left(nn, 4) [B][COLOR="Red"]<>[/COLOR][/B] "=SUM" Then
....
End If
Next i
....
Ce qui permet de supprimer à la fois le GOTO et l'étiquette "suivant:". DE plus si le résultat du "IF" est bien "=SUM" alors on passe bien directement à la ligne suivante.
Au final le code est bien plus propre et facile à lire et gagne quelque peu en rapidité toutes choses égales par ailleurs !

Surtout ne prends pas mal mes remarques, mon soucis est seulement de te transmettre la bonne méthode à mettre en œuvre ...
Même si ce n'est que du principe, j'espère que mes explications auront été assez claire sinon fait moi signe ...

Cordialement
oracle7 :):):)
 

Y1982

XLDnaute Nouveau
Re : Créer une macro pour annuler cette macro

Merci Oracle.
J'apprends et ça se voit. Je recherche d'ailleurs un livre sur VBA pour Excel. Tu en as un à me conseiller?
Sinon, pour le mode impression "Y" j'affecte bien la macro 2 et pas la 1 ?
Bon dimanche.
Yohann
 
Dernière édition:

oracle7

XLDnaute Nouveau
Re : Créer une macro pour annuler cette macro

Re ...

1 - Désolé, je n'avais pas compris que tu avais 2 macros !

Cela dit, avec la méthode que je t'ai proposé, une seule macro suffit (je l'avais appelée macro1 et effectivement cela a porté à ta confusion).

Donc si tu as 2 macros A et B, une pour chaque traitement, tu peux reporter chaque traitement (fait dans A respectivement dans B) dans la partie du "select case" qui va bien. Au final tu n'aura qu'une seule macro à gérer qui comportera l'ensemble de ton code.

Maintenant si cela te gène, tu peux dans le "select case" tout simplement aussi faire un appel à chacune de tes macros A et B déjà existantes pour chacun de tes traitements. Mais je dirai alors que code va prendre un effet de "passes à 10" donc avec X renvois avant d'arriver au réél traitement. A toi de voir ce qui te va le mieux mais crois moi fais au plus simple tu t'y retrouveras à la longue surtout si tu doit reprendre le code beaucoup plus tard ! Plus il est simple et plus il sera facile à relire. Maintenant ce n'est que mon avis ...

A toi maintenant de choisir la solution qui te convient et bon courage ...

2 - Pour ce qui est du livre VBA, je te renverrai ici :http://www.developpez.net pour faire ton choix en fonction de ton réel niveau de connaissances. Cela dit attention il y a "boire et à manger" en la matière. Soit prudent ! cela peut devenir un investissement cher au vues du service rendu, car on progresse en général assez vite et le livre devient vite inssuffisant.
Moi j'ai seulement appris le VBA "sur le tas" avec les tutoriaux existant à l'URL sus citée. Cela m'a personnellement suffit ... même si j'en apprend encore tous les jours en examinant des discussions sur les forums comme celui-ci.

Bon courage et bon WE
Cordialement
oracle7
 

oracle7

XLDnaute Nouveau
Re : Créer une macro pour annuler cette macro

@ kjin

Désolé kjin, mais je ne parle QUE de ce que je connais !

Comme j'ai découvert récemment xld, je n'en parle donc pas car je n'ai pas d'éléments pour porter un jugement et encore moins pour conseiller qq'un à son propos.

C'est donc un bien mauvais procès d'intention que tu fais là kjin ...
Je n'épiloguerai donc pas plus !

Cordialement
oracle7
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Créer une macro pour annuler cette macro

Bonjour à tous,
@ kjin

Comme j'ai découvert récemment xld, je n'en parle donc pas car je n'ai pas d'éléments pour porter un jugement et encore moins pour conseiller qq'un à son propos.
Conseiller quelqu'un pour l'achat d'un livre est une tâche bien difficile car un livre est un objet mort qui n'évoluera plus
Par contre XLd est une encyclopédie vivante à laquelle des centaines de pages s'ajoutent tous les jours...................
sans compter le nombre impressionnant de personnes talentueuses toujours prêtes à t'apporter un conseil, une solution

Y1982,Oracle, tu viens de découvrir XLd, tu as bien choisi ;)

à+
 

Y1982

XLDnaute Nouveau
Re : Créer une macro pour annuler cette macro

Merci à tous, mon problème est que je ne sais pas utiliser "select case"
J'ai fait une petite recherche et ça voudrait dire qu'on fait un peu comme avec un if then eelse ?
Oracle ou qui veut m'aider,
Pouvez vous me donner un petit exemple pour avoir une macro au lieu de 2 en utilisant select case ?
Merci
Yohann
 

oracle7

XLDnaute Nouveau
Re : Créer une macro pour annuler cette macro

@ Y1982

Voilà dans un principe proche de ton problème :

1 - Tu as fait initialement un appel de procédure à ta macro1 depuis chacun de tes boutons tel que : macro1(X) respectivement macro1(Y)

2- Dans ta macro1 tu traites comme cela :

Code:
sub macro1(byval MonParam as type_de_XouY)
...
select case MonParam
case is "mode_saisie" ' En clair si MonParam = "mode_saisie" alors faire ce qui suit
... traitement du mode saisie ...
case is "mode_impression" ' En clair si MonParam = "mode_impression" alors faire ce qui suit
... traitement du mode impression ...
end select
....
end sub

Voilà c'est tout simple ... et cela ramène tes 2 macros en une seule ...
Et en plus saches que structurellement, souvent le SELECT CASE évite d'imbriquer tout pleins de IF THEN ELSE (pour une même condition à tester s'entend) difficiles à relire par la suite.

Bon courage pour la suite et bon code !
Cordialement
oracle7 :):):)
 

Discussions similaires

Réponses
0
Affichages
182

Statistiques des forums

Discussions
312 579
Messages
2 089 876
Membres
104 298
dernier inscrit
MarieCB