Exécuter un code VBA qu'une seule fois
Hello j'ai un code qui me permet de faire fusionner des cellules et apparaître une icône. Le seul problème que j'ai que je ne veux que ce code apparaisse que si une cellule contient une certaine valeur. Le code s'exécute alors une fois et puis quand je remplis les cellules qui suivent, le code s'exécute encore et encore tant que ma condition est toujours remplie. Y a-t-il une possibilité pour ne faire exécuter ce code qu'une fois au début et pas à chaque fois que je sélectionne quelque chose dans mes autres cellules ?
Merci beaucoup.
Voilà le code :
Sub Step1Bottle()
'Condition de début
If Range("D3") = "Bottle" Then
'Fusionner les cellules
Range("B4:B9").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
'Fusionner les cellules sélectionnées
Range("A4:A9").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
'Remplir les cellules sélectionnées en bleu
Range("A4:B9").Select
Range("B4").Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Ecrire step 1 : bottle dans la cellule
Range("A4:A9").Select
ActiveCell.FormulaR1C1 = "STEP 1 : BOTTLE"
'Modifier la police
With Selection.Font
.Name = "Calibri"
.Size = 24
.Bold = True
.ColorIndex = 2
End With
Range("B4:B9").Select
'Copier coller l'icone de la bouteille
Sheets("BOTTLE STRUCTURE").Select
ActiveSheet.Shapes.Range(Array("Group 30")).Select
Selection.Copy
Sheets("Feuil1").Select
Range("B4:B9").Select
ActiveCell.FormulaR1C1 = ""
Range("B4:B9").Select
ActiveSheet.Paste
Selection.ShapeRange.IncrementLeft 120.3703149606
Selection.ShapeRange.IncrementTop -1.8518897638
Selection.ShapeRange.ScaleWidth 0.6558418932, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.ScaleHeight 0.6512775375, msoFalse, _
msoScaleFromBottomRight
Selection.ShapeRange.IncrementLeft -25.9259055118
Selection.ShapeRange.IncrementTop -35.1851968504
Range("D10").Select
End If
End Sub
Bonjour,
1 - La macro ne s'exécute pas toute seule (Ce n'est pas une macro évènementielle)
C'est donc sur la macro évènementielle qu'il faut agir.
2 - L’intérêt des macros est d'effectuer des actions répétitives : Une macro qui ne s'exécuterait réellement qu'une fois c'est contre nature.
Il faut donc indiquer dans quelle condition elle ne doit s'exécuter qu'une fois : il y a forcément une autre condition !
A+
Bonjour galopin01,
Je te remercie pour ta réponse voici ma macro événementielle (si c'est vraiment ça, je suis une débutante) :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("D3:D26")) Is Nothing Then
'********* Appel de Bottle *****************
Call Bottle
End If
End Sub
En fait ma macro Step1Bottle se trouve à l'intérieur de la macro Bottle. Et du coup à chaque fois que je change que je sélectionne quelque chose dans mon excel qui elle s'exécute encore une fois. Je voudrai qu'elle ne s'exécute qu'une fois peut-être en remplissant une autre case ça sera sa condition d'arrêt mais je n'arrive pas à coder ça.
Bonjour,
J'avoue ne pas avoir compris la demande...
Essayez ceci :
Private Sub Worksheet_Change(ByVal Target As Range)
Static DejaFait As Boolean
If Not DejaFait Then
If Not Application.Intersect(Target, Range("D3:D26")) Is Nothing Then
'********* Appel de Bottle *****************
Call Bottle
DejaFait = True
End If
End If
End Sub
C'est bon j'ai réglé le problème toute seule j'ai mis une condition d'arrêt comme ça il ne s'exécute que quand une certaine cellule est vide.
Merci pour ta réponse Pijaku, mais ça n'a pas marché j'ai fait autre chose et ça a marché.