Insertion bouton qui créer un bug VBA

Bonjour,

Je bloque sur un problème magique.

Mon code exécute des copier coller entre plusieurs classeurs, et une variable déclaré public est utilisé par plusieurs Sub (du même classeur).

Tout fonctionne super bien et je souhaite ajouter a ce code un segment qui permet de créer des boutons pour filtrer les copier-coller.

Et c'est la ou la magie opère !

Des que je rajoute le segment suivant, plus rien ne fonctionne.

Ma variable V_path déclaré en public incrémenté dans un "sub" ne peut plus être lu par un autre, les copier coller ne fonctionne plus (j'ai divers erreurs).

Pourtant le code que j'ajoute ne fait rien d'autre que creer des boutons et les placer, le voici :

'#################################### Creation de bouton C2E & DSLE 

Dim Num_bouton As String
Num_bouton = 1 'Ces 3 variables sont déja déclarés avant
num_site = 1
V_offset = 0

Dim PosG As Integer 'Paramettres Position boutons
Dim PosH As Integer
Dim Hauteur As Integer
Dim Longueur As Integer

Dim Bouton(360) As Variant

num_site = 1

While num_site <= Total_sites

With Range("E20").Offset(V_offset)
       PosG = .Left
       PosH = .Top
       Hauteur = .Height
       Longueur = .Width
End With

Range("B20").Offset(V_offset) = "Site" & num_site

'On creer un bouton Gauche dans un tableau Bouton()
Set Bouton(Num_bouton) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
                                  Link:=False, _
                                  DisplayAsIcon:=False, _
                                  Left:=PosG, _
                                  Top:=PosH, _
                                  Width:=Longueur, _
                                  Height:=Hauteur)
Bouton(Num_bouton).Object.Caption = "Gauche"
Bouton(Num_bouton).Object.GroupName = "Group" & num_site

With Range("G20").Offset(V_offset)
       PosG = .Left
       PosH = .Top
       Hauteur = .Height
       Longueur = .Width
End With

'On creer un bouton Droite dans un tableau Bouton()
Set Bouton(Num_bouton) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
                                  Link:=False, _
                                  DisplayAsIcon:=False, _
                                  Left:=PosG, _
                                  Top:=PosH, _
                                  Width:=Longueur, _
                                  Height:=Hauteur)
Bouton(Num_bouton).Object.Caption = "Droite"
Bouton(Num_bouton).Object.GroupName = "Group" & num_site

num_site = num_site + 1
V_offset = V_offset + 2

Wend

'---------------------------- Fin Creation de bouton C2E & DSLE --------------------

J'ai fait plusieurs testes, et c'est que lors ce que je met cette partie du code en commentaire (les 2 "Set bouton" a vrai dire) que tout re-fonctionne :

Set Bouton(Num_bouton) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
                                  Link:=False, _
                                  DisplayAsIcon:=False, _
                                  Left:=PosG, _
                                  Top:=PosH, _
                                  Width:=Longueur, _
                                  Height:=Hauteur)
Bouton(Num_bouton).Object.Caption = "Gauche"
Bouton(Num_bouton).Object.GroupName = "Group" & num_site

Avez vous une idée de pourquoi mon scripte s'emballe lors ce que j'ajoute des boutons option ?

Question difficile j'en suis contient, mais la j'ai aucune idée du problème

Bonsoir,

à voir le code je ne serait pas d'un grand secours...

Ceci dit avez vous essayé le mode pas à pas de VBA ?

En cliquant gauche avec la souris sur la marche de gauche de la fenêtre de code, vous faites apparaître un rond rouge, c'est un point d'arrêt du code, ensuite il vous suffit de faire la touche [F8] pour avancer ligne de code après ligne de code, et en jouant sur la taille des fenêtre vous pouvez voir ce qui se passe et à quel moment cela dérape. A savoir, lors de ce mode, si vous placer le curseur de la souris sur le nom d'une variable, une info bulle apparaît avec sa valeur actuelle, ceci peut également être utile pour détecter une erreur.

@ bientôt

LouReeD

Bonsoir,

La variable déclarée en Public perd sa valeur à partir du moment où on tu déroule l'insertion des boutons...

Une manière de ne jamais perdre cette variable, serait peut-être dans la déclarer dans un nom...

Style :

    ActiveWorkbook.Names.Add Name:="Num_Bouton", RefersToR1C1:="=1"
    MsgBox [Num_Bouton]

Bon courage

Bonsoir,

Une procédure commence par une instruction déclarative de procédure et se termine par une instruction de fin (Sub et End Sub pour une procédure tout à fait ordinaire, mais il y en a d'autres). En citant du code de façon incomplète, tu ne permets pas de voir les procédures en entier.

Tu n'indiques pas non plus ou elles se trouvent. Et tu ne fournis pas également les déclarations de niveau module (qui font pourtant partie de ton problème).

En l'état, il ne m'apparaît donc pas possible de répondre valablement à ta question, tu n'en fournis pas les données à analyser.

Nous sommes bien d'accord qu'une variable publique initialisée conserve normalement la valeur qui lui a été affectée durant toute la session de travail (sauf si une procédure la modifie). Cependant, il est toujours possible que cette valeur se perde ! Toute erreur d'exécution notamment a pour effet la réinitialisation de toutes les variables...

Il convient donc de déterminer la cause dans ton cas, par exemple en testant sa valeur à différent moments de la procédure que tu incrimines, de façon à cerner la source du problème...

La détection de causes n'éliminant pas forcément tout risque en la matière, il est par ailleurs possible de mettre en place un dispositif de réinitialisation aux points "stratégiques" : si une variable à perdu sa valeur, cela va en général produire une erreur d'exécution lorsque celle-ci n'est pas trouvée, on récupère cette erreur pour relancer l'initialisation puis revenir sur la ligne de déclenchement de l'erreur et poursuivre la procédure.

Cordialement.

Merci pour vos réponses,

Le code est tellement long qu'il me semblais contre productif d'en copier l'intégralité, mauvaise idée de ma part >.<

Voici les subs, j'ai fait un peut le ménage pour limiter la taille.

Public DOC1 As Workbook 'Notre Doc
Public DOC2 As Workbook 'Notre Template qui acceuile l'éxtract
Public V_path
Dim Total_sites As Integer 'C'est le total des sites a traiter
Dim num_site As Integer 'Site actuellement en cours de traitement
Dim V_saisie As String 'Varaible temporaire qui stocke le nombre de site total indiqué par l’utilisateur
Dim Techno(180) As String 'Tableau de techno pour chaque site (j'y stockerai "GAUCHE" ou "droite" par site
Dim Tampon As String 'Variable Tampon 
Dim V_offset As Integer ' Valeur offset pour les cases
Dim I_offset As Integer 'Valeur offset pour les lignes
Dim Bouton(360) As Variant ' Les buttons seront créer via ce tableau

Public Sub ButtonParcourir_Click()
'####" On sélectionne le classeur cible et on creer des boutons en fonction du nombre de site renseigné (2 par sites, gauche & droite)

V_path = Application.GetOpenFilename 'On stocke dans V_path le classeur sélectionné par l'utilisateur
Range("B10") = V_path
Set DOC1= Workbooks.Open(V_path) 'Notre Doc cible
FileCopy ThisWorkbook.Path & "\Model\DOC2.xlsm", ThisWorkbook.Path & "\DOC2.xlsm"
Set DOC2= Workbooks.Open(ThisWorkbook.Path & "\CPDA.xlsm")
ThisWorkbook.Activate

'Scan du nombre de site
Dim V_scan As Boolean
V_offset = 0
V_scan = False
Total_sites = 0
While V_scan = False
Tampon = DOC1.Worksheets("Sites").Range("A2").Offset(V_offset)
    If Tampon <> "" And Tampon <> " " And Tampon <> "  " Then
        Total_sites = Total_sites + 1
        V_offset = V_offset + 1
    Else
        V_scan = True
    End If
Wend

Range("F14") = Total_sites

Call Creation_button 'c'est le contenu de ce sub qui supprime les valeurs publics

End Sub

Public Sub Creation_button()

'################## Creation de bouton Gauche & Droite 

Num_bouton = 1
num_site = 1
V_offset = 0

Dim PosG As Integer 'Paramettres Position boutons
Dim PosH As Integer
Dim Hauteur As Integer
Dim Longueur As Integer

num_site = 1

While num_site <= Total_sites

With Range("E20").Offset(V_offset)
       PosG = .Left
       PosH = .Top
       Hauteur = .Height
       Longueur = .Width
End With

'On creer un bouton Gauche dans un tableau Bouton()
Set Bouton(Num_bouton) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
                                  Link:=False, _
                                  DisplayAsIcon:=False, _
                                  Left:=PosG, _
                                  Top:=PosH, _
                                  Width:=Longueur, _
                                  Height:=Hauteur)
Bouton(Num_bouton).Object.Caption = "Gauche"
Bouton(Num_bouton).Object.GroupName = "Group" & num_site

With Range("G20").Offset(V_offset)
       PosG = .Left
       PosH = .Top
       Hauteur = .Height
       Longueur = .Width
End With

'On creer un bouton Droite dans un tableau Bouton()
Set Bouton(Num_bouton) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
                                  Link:=False, _
                                  DisplayAsIcon:=False, _
                                  Left:=PosG, _
                                  Top:=PosH, _
                                  Width:=Longueur, _
                                  Height:=Hauteur)
Bouton(Num_bouton).Object.Caption = "Droite"
Bouton(Num_bouton).Object.GroupName = "Group" & num_site

num_site = num_site + 1
V_offset = V_offset + 2

Wend

'------------------- Fin Creation de bouton Droite & Gauche -------------------
End Sub

Public Sub ButtonExecuter_Click()

Set DOC1= Workbooks.Open(V_path)
Set DOC2= Workbooks.Open(ThisWorkbook.Path & "\Doc2.xlsm")

End sub
cousinhub a écrit :

Bonsoir,

Une manière de ne jamais perdre cette variable, serait peut-être dans la déclarer dans un nom...

Style :

    ActiveWorkbook.Names.Add Name:="Num_Bouton", RefersToR1C1:="=1"
    MsgBox [Num_Bouton]

Merci pour l'astuce. Question un peu bète mais.. Que représente un "Nom" ?

Merci LouReeD pour l'astuce, en effet ca aide a repérer le problème.

Il semble que Num_bouton soit une variable non déclarée (donc de type Variant), initialisée une fois pour toutes à 1.

Seul Bouton(1) sera initialisé (dernier bouton créé). Je n'y vois pas d'autre incidence dans le code visible, Bouton() n'étant pas utilisé par ailleurs.

Rechercher des sujets similaires à "insertion bouton qui creer bug vba"