désactiver une macro après son exécution à l'ouverture

gog232

XLDnaute Nouveau
Bonjour à tous,

J'ai créé un fichier dans lequel, à l'ouverture, certaines cellules vont chercher des questions, de façon aléatoire , dans une liste cachée. Mon soucis est que je voudrais sauvegarder ce fichier avec les questions qui ont été attribuées de façon aléatoire, afin de pouvoir reconsulter celui-ci plus tard(avec les mêmes questions). Or actuellement quand je réouvre mon fichier sauvegardé, la macro s'excécute à nouveau et j' ai de nouvelles questions.
Je voudrais donc pourvoir ajouter une ligne dans la macro afin qu'elle se désactive après sa première exécution, ou atteindre ce même résultat d'une autre façon (ex macro- supprimant l'exécution de la première à l'ouverture- qui s'enclenche à la fermeture du fichier etc...).

Merci d'avance de votre aide précieuse

gog232
 

Softmama

XLDnaute Accro
Re : désactiver une macro après son exécution à l'ouverture

Bonjour,

je te propose d'effacer la macro Workbook_Open qui lance le choix des questions à l'ouverture du classeur à l'aide de ce bout de code (à placer à la fin de la macro) :
VB:
Private Sub Workbook_Open()
' Ton code ici qui choisit les questions
' ......................................
'*********************  y ajouter ceci :
With ThisWorkbook.VBProject.VBComponents("Thisworkbook").CodeModule
  .DeleteLines .ProcStartLine("WorkBook_Open", 0), .ProcCountLines("WorkBook_Open", 0)
End With
End Sub
 

Gorfael

XLDnaute Barbatruc
Re : désactiver une macro après son exécution à l'ouverture

Salut gog232 et le forum
Une idée toute simple : tu mets Z1=1
et tu commence ta macro par un test "si Z1<>1 alors sortir"
et la dernière ligne de ta macro : "Z1=0"
A+
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : désactiver une macro après son exécution à l'ouverture

Bonjour le fil, bonjour le forum,

N'y a-t-il pas danger de perdre la macro si on oublie d'enregistrer sous ? Peut-être serait-il souhaitable d'intégrer dans le bout de code de Softmama cet Enregistrer sous...
 

Efgé

XLDnaute Barbatruc
Re : désactiver une macro après son exécution à l'ouverture

Bonjour à tous
Juste une idée :
On peux aussi enregistrer le classeur original en Model (.xlt), ce qui permet de supprimer la macro avec le code de Softmama et de ne jamais tout perdre, sans être obligé de paser par un enregistrement sous.
Cordialement
 

gog232

XLDnaute Nouveau
Re : désactiver une macro après son exécution à l'ouverture

Bonjour à tous,

Gorfael, j'ai essayé ta solution; J’ai mis la valeur 1 dans la cellule S1
Puis j’ai ajouté les lignes que tu préconisais, mais cela ne fonctionne pas.


ActiveSheet.Unprotect
"si S1<>1 alors sortir"
Range("F71:G71").Select
ActiveCell.FormulaR1C1 = _
"=INDIRECT(""A""&(INT(RAND()*COUNTA(R[-70]C[-5]:R[-51]C[-5])+1)))"
Range("F72:G72").Select
ActiveCell.FormulaR1C1 = _
"=INDIRECT(""B""&(INT(RAND()*COUNTA(R[-71]C[-4]:R[-52]C[-4])+1)))"
Range("F73:G73").Select
ActiveCell.FormulaR1C1 = _
"=INDIRECT(""C""&(INT(RAND()*COUNTA(R[-72]C[-3]:R[-59]C[-3])+1)))"
Range("F74:G74").Select
ActiveCell.FormulaR1C1 = _
"=INDIRECT(""D""&(INT(RAND()*COUNTA(R[-73]C[-3]:R[-63]C[-3])+1)))"
Range("N74").Select
ActiveWindow.SmallScroll Down:=-60
Range("L8").Select
Range("F71:G74").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveWindow.SmallScroll Down:=-66
Range("G3").Select
"S1=0"
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

End Sub
 

Softmama

XLDnaute Accro
Re : désactiver une macro après son exécution à l'ouverture

Bonjour,

Gorfael a voulu expliqué une méthode ; ce qu'il a écrit n'est pas du langage VBA, il faut donc le traduire ainsi :
tu remplaces déjà :
Code:
"si S1<>1 alors sortir"
par :
VB:
If Range("S1") <>1 then Exit Sub

et
Code:
"S1=0"
par
VB:
Range("S1") = 0

Cela devrait déjà mieux fonctionner.
Le code complet pourrait à priori donner :
VB:
ActiveSheet.Unprotect
If Range("S1") <> 1 then exit Sub
Range("F71:G71").FormulaR1C1 = "=INDIRECT(""A""&(INT(RAND()*COUNTA(R[-70]C[-5]:R[-51]C[-5])+1)))"
Range("F72:G72").FormulaR1C1 = "=INDIRECT(""B""&(INT(RAND()*COUNTA(R[-71]C[-4]:R[-52]C[-4])+1)))"
Range("F73:G73").FormulaR1C1 = "=INDIRECT(""C""&(INT(RAND()*COUNTA(R[-72]C[-3]:R[-59]C[-3])+1)))"
Range("F74:G74").FormulaR1C1 = "=INDIRECT(""D""&(INT(RAND()*COUNTA(R[-73]C[-3]:R[-63]C[-3])+1)))"
Range("S1") = 0
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
 

Gorfael

XLDnaute Barbatruc
Re : désactiver une macro après son exécution à l'ouverture

Salut gog232 et le forum
Merci à Softmama qui a su expliciter ma pensée
si tu mets un 1 en S1, la macro s'exécutera et remplacera le 1 par 0, bloquant tout fonctionnement, sauf si on remet un 1

Ceci étant dit, et n'étant pas très fort en R1c1, j'ai quand même des doutes sur les formules : je vais essayer d'expliquer mon soucis
Code:
Range("F71:G71").Select
    ActiveCell.FormulaR1C1 = _
        "=INDIRECT(""A""&(INT(RAND()*COUNTA(R[-70]C[-5]:R[-51]C[-5])+1)))"
Si je lis la formule j'aurais une fonction indirect sur un texte de la forme A1 => mais on devrait avoir un texte R1C1. En le nettoyant de son select inutile, on devrait avoir
Code:
Range("F71:G71").FormulaR1C1 = _
         "=INDIRECT(""R""&(INT(RAND()*COUNTA(R[-70]C[-5]:R[-51]C[-5])+1)) & ""C1"")"
Entre le mélange d'anglais et de R1C1, j'avoue des problèmes d'assurance sur la justesse de la formule, mais comme le fait d'utiliser indirect revient à figer le texte et donc à utiliser des adresses absolues, je ne pense pas me tromper. Sauf que peut-être suivant la version d'excel, la formule Ax est reconnue au même titre que RxC1.
A+
 
Dernière édition:

Habitude

XLDnaute Accro
Re : désactiver une macro après son exécution à l'ouverture

Bonjour

Je me trompe peut-être mais même si tu désactive l'exécution de la macro.
Comme tu as des formules avec Rand.
Un calculate (F9) va modifier tes questions.

Peut-être alors


Code:
If Range("F71")= "" then
ton code

Calculate
Range("F71:G74").value= Range("F71:G74").value

End If

Et il suffit de supprimer les questions avant d'envoyer le fichier à un tiers
 

Gorfael

XLDnaute Barbatruc
Re : désactiver une macro après son exécution à l'ouverture

Salut Habitude et le forum
Un calculate (F9) va modifier tes questions.
Effectivement, puisqu'on n'inscrit pas une valeur fixe, mais une formule aléatoire. J'avais même pas fait attention, puisque la question était de bloquer l'exécution de la macro => je me contentai d'empêcher son exécution.
A+
 

gog232

XLDnaute Nouveau
Re : désactiver une macro après son exécution à l'ouverture

Bonjour à tous,
Ca fonctionne super bien. Un grand merci
Pour bloquer le "calculate F9", j'ai rajouté à la fin de la macro des instructionS qui transforment les formules par leurs résultats (en copiant le résultat du tri aléatoire et le recollant via "collage spécial-valeur".

Encore merci à tous
 

Discussions similaires

Réponses
8
Affichages
739

Statistiques des forums

Discussions
312 298
Messages
2 086 977
Membres
103 416
dernier inscrit
SEB28110