Morgoline
Messages postés4Date d'inscriptionlundi 6 octobre 2008StatutMembreDernière intervention23 octobre 2008
-
6 oct. 2008 à 09:46
Morgoline
Messages postés4Date d'inscriptionlundi 6 octobre 2008StatutMembreDernière intervention23 octobre 2008
-
7 oct. 2008 à 08:43
Bonjour a tous et a toutes,
je me resouds finalement a poster ici une question qui me turlyupine depuis 1 semaisne et que je n'arrive pas a resoudre sous Vba exxel 2003.
alors voila mon probleme, j'ai developper un eapplication qui me cr2e des graphiques sous plusieurs fichiers toutes l'application est contebue dnas une module que je deplace en fonction de mes fichiers. les graphique se crent parfaitement ca c'est bon. mais voila j'ai creer une fonction qui place dynaniquement 2 boutons sur les feuilles ou je veux disposer de mon appliaction graphique.
Aussi j'ai ceer une procedure qui me demande a l ouverture du classeur si je veux placer sur chaque feuille des boutons et qui en fonction de la repose appelle ou non ma fonction de creation de boutons. Quand je me place dans le projet Vba et que je demande la creation de bouton directement ca marche.
mais quand je ferme le fichier et que je le reouvre la plus rien ne marche des que je demande la creation de boutons excel se ferme et me demade l'envoie d'un rapport d'erreur.
le pire est c'est la que je capte pas si j'ouvre le fichier et que je vais directement dans Vba sans rien demader puis que je fais une compilation du projet et que je lance la macro cette fois ca marche sans soucis ... il faudrait presque que j'inclue une commande compiler en debut de programme je ne vois que ca.
si vous pouvez m aider a resoudre cette question qui me bloque complement ... je vous dirais un grand grand grand merci..
voila mon code :
''Ca c'est l'ouverture de mon classeur ..
Private Sub Workbook_Open()
Dim j As Integer
Dim error As Boolean
Dim obj As OLEObject
New_try:
Dim i As Long
Dim answser 'idéclaration de la variable, avec reponse comme nom
Dim answser_graphs
answser = MsgBox("Do you want to add Graphical Application ?", vbYesNo + vbQuestion, "Validation")
Select Case answser
Case vbYes 'on click yes
On Error GoTo Problem
For i = 1 To Worksheets.Count
Worksheets(i).Activate
Worksheets(i).Visible = True
error = False
For Each obj In ActiveSheet.OLEObjects
If obj.Name "GraphButton" Or obj.Name "ValidationButton" Then
error = True
Exit For
End If
Select Case answser_graphs
Case vbYes 'on click yes
If error = False Then
'' ca c'est ma procedure de creation dynamique de bouton
Call Module1.Button_creation(Worksheets(i).Name)
MsgBox " Graphs Buttons added successfully !", vbInformation
Case vbNo 'on click no
MsgBox " No Button added !", vbInformation
End Select 'end
Next i
Case vbNo 'on click no
End Select 'end
Exit Sub
Problem:
Initialisation.Hide
Unload Initialisation
MsgBox "Error occured, please try again !", vbInformation
j = j + 1
If j < 3 Then
GoTo New_try
Else
MsgBox " This error need you to restar Excel if you want to add the Graphs, sorry", vbInformation
Exit Sub
End If
End Sub
'' et voila le code la precdure de creation de boutton
'Purpose: Allow to create dynamically 2 Buttons on the sheet to add graph application
Sub Button_creation(Worksheet_Name As String) ' Worksheet_Name is the name of the sheet were we place the buttons
Dim code As String 'code will contain the code of the burŽtoon we will create
Dim NextLine As String ' to situate where we are placing the code
Dim Last_cell As Long ' to know where is the last cell in used
Dim oOLE As OLEObject ' object type to identifie an create the buttons
Dim Ws As Worksheet ' the worksheet where we will use the button
'Application.ScreenUpdating = False
Set Ws = Worksheets(Worksheet_Name)
Last_cell = Ws.UsedRange.Columns.Count ' to know what is the last column in used
'to add a first button
Set oOLE = Ws.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=Ws.Cells(1, Last_cell).Left, Top:=5, Width:=100, Height:=50)
' to change the name of this button and it captation
oOLE.Name = "GraphButton"
Ws.OLEObjects(Ws.OLEObjects.Count).Object.Caption = "Graphs"
' the code we are placing in the procedure which is called after a click on this buton
code = "Sub GraphButton_Click()" & vbCrLf code code & "Menu.Title.Enabled True" & vbCrLf code code & "Menu.Add_graphs.Enabled False" & vbCrLf code code & "Menu.Tol_min.Enabled False" & vbCrLf code code & "Menu.Tol_max.Enabled False" & vbCrLf code code & "Menu.Series.Enabled False" & vbCrLf code code & "Menu.Nominal_Val.Enabled False" & vbCrLf code code & "Menu.Graph_location.Enabled False" & vbCrLf code code & "Menu.End_file.Enabled False" & vbCrLf code code & "Menu.Axis.Enabled False" & vbCrLf
code = code & "Menu.Show " & vbCrLf
code = code & "End Sub"
With ThisWorkbook.VBProject.VBComponents.Item(Ws.CodeName).CodeModule
NextLine = (.CountOfLines + 1)
.insertlines NextLine, code
End With
'to add a second button
Set oOLE = Ws.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=Ws.Cells(1, Last_cell).Left, Top:=100, Width:=100, Height:=40)
' to change the name of this button and it captation
oOLE.Name = "ValidationButton"
Ws.OLEObjects(Ws.OLEObjects.Count).Object.Caption = "Validation"
oOLE.Enabled = False 'make it use unable
' the code we are placing in the procedure which is called after a click on this buton
code = "Sub ValidationButton_Click()" & vbCrLf
code = code & "Menu.Show " & vbCrLf
code = code & "End Sub"
With ThisWorkbook.VBProject.VBComponents.Item(Ws.CodeName).CodeModule
NextLine = (.CountOfLines + 1)
.insertlines NextLine, code
End With
Set Ws = Nothing ' realse the parameter
Set oOLE = Nothing ' realse the parameter
cs_thierry la fronde
Messages postés351Date d'inscriptionmercredi 21 juillet 2004StatutMembreDernière intervention12 août 2009 6 oct. 2008 à 19:26
Bonsoir,
J'ai un léger doute, lorsque la méthode s'exécute, le classeur n'est pas encore ouvert (je crois) et tu lui demande d'afficher des boutons sur des feuilles qui n'existe pas encore... (si je ne me trompe pas). Tu peux utiliser la procédure load pour exécuter ton code, la procédure open servirait juste à récupérer la réponse..
Morgoline
Messages postés4Date d'inscriptionlundi 6 octobre 2008StatutMembreDernière intervention23 octobre 2008 7 oct. 2008 à 08:43
Merci de me repondre Msieur la Fronde,
alors en fait le claseur existe deja quand j'ouvre le fichier car il s'agit d'une macro qui travaille sur des fichiers deja crées. Donc en theorie qund j ouvre le fichiertoutes les feuilles de mon classeurs se chargent enfin j espere...
cependant vu que je veux pas mourrir idiot et que je ne connaissait pas l instruction load j ai essayé. mais quand dans ma procedure je demande un load j'ai une vielle errueur de brin qui apparait run time error 404 object required...
bon je ais essayer de trouver une soluce pour cela mais ce qui m epatte et que je ne pidge pas du tout du tout, c'est le pourquoi : quand j ouvre directement mon fichier et commence a executer la macro le programme excel plante juste apres la creation de boutons, et pourquoi quand j ouvre mon fichier que je ne lance aps la macro que je vais dans l editeur Žvba et que la je fais debug, compiler puis que je me place dans ma fonction workbook_open et que je lance la macro avec play la et bien ca marche titpe top elle fait tout ce que je veux ...
si vous pouvez m eclairé la dessus parce aue la moi je suis largué... je me demande limite si il n y a pas une fonction pour appeler le compilateur en debut de projet ca me resoudrait mon soucis de facon moche certes mais ce le resoudrait quand meme