cruxifer
Messages postés16Date d'inscriptionjeudi 16 avril 2015StatutMembreDernière intervention19 mai 2015
-
Modifié par cruxifer le 11/05/2015 à 16:46
cruxifer
Messages postés16Date d'inscriptionjeudi 16 avril 2015StatutMembreDernière intervention19 mai 2015
-
12 mai 2015 à 16:09
Bonjour,
Énoncé tout bête mais ça me prend la tête.
J'ai une macro associée à un bouton (*Wouaouh*). Ok. Je peux cliquer dessus et la macro se lance (*mais comment fait-il !?*).
SAUF QUE une fois le programme exécuté, si je veux le ré-exécuter en re-cliquant sur le bouton, ben rien ne se passe. Je comprends pas. Si je veux relancer mon programme je dois quitter et relancer Excel.
NB : J'utilise des "End" dans certaines conditions, mais c'est le seul moyen que j'ai trouvé pour arrêter mon programme en cours de route...
Help ?
Si vous avez une solution simple, ou même une explication, je prend.
Merci !
Pour les courageux : le code utilisé (uniquement la macro principale, j'exlue les userForm et compagnie)
Sub courbeTendance() 'Ce programme permet d'aller chercher le tableau Excel exporté depuis l'ERP et 'de représenter les courbes associées
'################# Déclarations #################
'Feuilles, classeurs, etc. Dim Msheet As Worksheet 'Feuille de la macro Dim Mwb As Workbook 'Classeur de la macro Dim Mdata As Worksheet 'Feuille des données recopiées dans Mwb Dim Dwb As Workbook 'Classeur des données Dim WbDataPath As String 'Chemin du Classeur contenant les données Dim WsAfficherTableau As Worksheet 'Feuille des données à montrer à l'utilisateur
'Variables utilisées pour les boucles : Dim compteur As Integer 'Compteur pour les boucles Dim ligne As Integer 'Compteur de ligne Dim colonne As Integer 'Compteur de colonnes
'Graphique Dim Graphique As Chart 'Objet graphique Dim carac As String 'Caractéristique à afficher Dim article As String 'Code de l'article Dim afficherTableau As Boolean 'Affichage du tableau de données Dim export As Boolean 'Exportation du graphique au format JPG Dim exportDir As String 'Chemin d'exportation Dim serie As Series 'série de données du graphique
'################################################ '---Contrôles et réglages--- afficherTableau = False export = False itf_CQCT1.Hide Set Mwb = Application.Workbooks.Item("MacroCQ_CT.xlsm") Mwb.Unprotect "toto" 'On enlève temporairement la protection du classeur Set Msheet = Mwb.Worksheets.Item("Interface") 'Classeur de la macro
If Mwb.Worksheets.Count > 1 Then 'Si la macro a déjà été exécutée Application.DisplayAlerts = False For compteur = Mwb.Worksheets.Count To 2 Step -1 'alors on supprime les feuilles déjà existantes Mwb.Worksheets.Item(compteur).Delete Next ThisWorkbook.Charts.Delete Application.DisplayAlerts = True End If
'################################################ '# Récupération et tri des données # '################################################
itf_CQCT1.Show 'On montre la 1ère interface à l'utilisateur
WbDataPath = itf_CQCT1.selectedFile.Caption 'On récupère le chemin du classeur des données Set Dwb = Application.Workbooks.Open(Filename:=CStr(WbDataPath), Local:=True) 'On ouvre le classeur des données Set Mdata = Mwb.Worksheets.Add(After:=Mwb.Worksheets.Item(Mwb.Worksheets.Count)) 'On crée une nouvelle feuille qui contiendra les données et que l'utilisateur ne pourra pas voir With Mdata .Name = "donnees" .Visible = xlSheetHidden 'On cache la feuille End With
If Right(WbDataPath, 3) = "csv" Then 'Si c'est un fichier csv For ligne = 1 To Dwb.Worksheets.Item(1).UsedRange.Rows.Count For colonne = 1 To Dwb.Worksheets.Item(1).UsedRange.Columns.Count 'On recopie les valeurs de la feuille de données dans le classeur de la macro Mdata.Cells(ligne, colonne).Value = Dwb.Worksheets.Item(1).Cells(ligne, colonne).Value Next colonne Next ligne Dwb.Close 'On ferme le classeur des données ElseIf Right(WbDataPath, 4) = "xlsx" Then 'Si c'est un fichier Excel (.xlsx) 'Sélection du type d'article For ligne = 6 To Dwb.Worksheets.Item(1).UsedRange.Rows.Count - 6 For colonne = 1 To Dwb.Worksheets.Item(1).UsedRange.Columns.Count 'On recopie les valeurs de la feuille de données dans le classeur de la macro Mdata.Cells(ligne - 5, colonne).Value = Dwb.Worksheets.Item(1).Cells(ligne, colonne).Value Next colonne Next ligne Dwb.Close Else Dwb.Close MsgBox "Format du fichier non pris en charge" & vbLf & "Veuillez sélectionner un fichier Excel (.xslx) ou csv (.csv)" End End If
If Mdata.Cells(nbLigDataInit + 4, 1) = "" Then MsgBox "Donneés insuffisantes (< 2 valeurs)" & vbLf & "Fin du programme" End End If
'''''' itf_CQCT2.Show 'On montre la 2ème interface à l'utilisateur article = itf_CQCT2.choixArticle.Value 'On récupère l'article choisi ''''''
'Tableau qui servira à l'affichage du graphique et l'utilisateur peut demander à le voir Set WsAfficherTableau = Mwb.Worksheets.Add(After:=Mwb.Worksheets.Item(Mwb.Worksheets.Count)) WsAfficherTableau.Name = "Tableau de données" 'Nom de la feuille du tableau de données WsAfficherTableau.Visible = xlSheetHidden compteur = 2
'-----Sélection des lignes où apparaissent l'article souhaité----- 'Libellés For colonne = 1 To Mdata.UsedRange.Columns.Count WsAfficherTableau.Cells(1, colonne).Value = Mdata.Cells(1, colonne).Value Next colonne 'Valeurs For ligne = 2 To nbLigDataInit If Mdata.Cells(ligne, 8) = typeArticle And Mdata.Cells(ligne, 7) = article Then For colonne = 1 To Mdata.UsedRange.Columns.Count WsAfficherTableau.Cells(compteur, colonne).Value = Mdata.Cells(ligne, colonne).Value Next colonne compteur = compteur + 1 End If Next ligne
If WsAfficherTableau.Cells(3, 1) = "" Then MsgBox "Donneés insuffisantes (< 2 valeurs)" & vbLf & "Fin du programme" End End If
'''''' itf_CQCT3.Show 'On montre la 3ème interface à l'utilisateur carac = itf_CQCT3.choixCarac.Value 'On récupère la caractéristique choisie afficherTableau = itf_CQCT3.CBtableau.Value 'On regarde si l'utilisateur souhaite voir le tableau de données export = itf_CQCT3.CBjpg.Value 'On regarde si l'utilisateur souhaite enregistrer les graphiques en .jpg ''''''
'-----Sélection des lignes où apparaissent la caractéristique souhaitée----- 'Valeurs For ligne = WsAfficherTableau.UsedRange.Rows.Count To 2 Step -1 If WsAfficherTableau.Cells(ligne, 10).Value <> carac Then 'On supprime les lignes qui ne contiennent pas la caractéristique souhaitée WsAfficherTableau.Rows.Item(ligne).Delete End If Next ligne
If WsAfficherTableau.Cells(3, 1) = "" Then MsgBox "Donneés insuffisantes (< 2 valeurs)" & vbLf & "Fin du programme" End End If
'--------- Mise en place du graphique ---------- Set Graphique = ThisWorkbook.Charts.Add(After:=Mwb.Worksheets.Item(Mwb.Worksheets.Count)) 'On crée une feuille de graphique If Graphique.SeriesCollection.Count > 0 Then Do Until Graphique.SeriesCollection.Count = 0 Graphique.SeriesCollection(1).Delete 'On supprime les séries déjà existantes Loop End If
With Graphique .Name = "Courbe de tendance" 'Nom du graphique .ChartType = xlLine 'Type du graphique .ApplyLayout (1) 'Forme du graphique (Titre, légende, etc.) .ChartTitle.Text = article & vbLf & carac 'Titre du graphique With .Axes(xlValue, xlPrimary) 'Libellé de l'axe des ordonnées .HasTitle = True .AxisTitle.Characters.Text = "Valeurs de la réponse" End With With .Axes(xlCategory, xlPrimary) 'Libellé de l'axe des abscisses .HasTitle = True .AxisTitle.Characters.Text = "N° Lot" End With 'Réglage de l'échelle de l'axe des ordonnées: .Axes(xlValue).MaximumScale = maximumGraph(WsAfficherTableau.Cells(2, 5).Value, _ WsAfficherTableau.Range(WsAfficherTableau.Cells(2, 3), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, 3))) .Axes(xlValue).MinimumScale = minimumGraph(WsAfficherTableau.Cells(2, 4).Value, _ WsAfficherTableau.Range(WsAfficherTableau.Cells(2, 3), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, 3))) End With
'--------Données du graphique---------- Set serie = Graphique.SeriesCollection.NewSeries 'Série borne inférieure With serie .Name = WsAfficherTableau.Cells(1, 4) 'Nom de la série .Values = WsAfficherTableau.Range(WsAfficherTableau.Cells(2, 4), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, 4)) 'valeurs End With
Set serie = Graphique.SeriesCollection.NewSeries 'Série borne supérieure With serie .Name = WsAfficherTableau.Cells(1, 5) 'Nom de la série .Values = WsAfficherTableau.Range(WsAfficherTableau.Cells(2, 5), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, 5)) 'valeurs End With
Set serie = Graphique.SeriesCollection.NewSeries 'Série des valeurs With serie .Name = WsAfficherTableau.Cells(1, 3) 'Nom de la série .Values = WsAfficherTableau.Range(WsAfficherTableau.Cells(2, 3), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, 3)) 'valeurs .XValues = WsAfficherTableau.Range(WsAfficherTableau.Cells(2, 1), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, 1)) 'Axe des abscisses End With
If afficherTableau Then 'Si l'utilisateur veut voir le tableau de données With WsAfficherTableau .Visible = xlSheetVisible 'On rend la feuille visible .Columns.AutoFit 'On ajuste la largeur des colonnes .ListObjects.Add(xlSrcRange, Range(WsAfficherTableau.Cells(1, 1), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, WsAfficherTableau.UsedRange.Columns.Count)), _ , xlYes).Name = "Données du graphique" 'On crée un tableau de mise en forme Range(WsAfficherTableau.Cells(1, 1), _ WsAfficherTableau.Cells(WsAfficherTableau.UsedRange.Rows.Count, WsAfficherTableau.UsedRange.Columns.Count)) _ .HorizontalAlignment = xlCenter 'On centre tout le contenu du tableau End With End If If export Then 'Si l'utilisateur veut exporter le graphique en .jpg exportDir = Left(itf_CQCT1.selectedFile.Caption, InStrRev(itf_CQCT1.selectedFile.Caption, "\") - 1) 'On récupère le chemin du fichier de données Graphique.export exportDir & "\CT_art." & WsAfficherTableau.Cells(2, 6).Value & "_caract." & WsAfficherTableau.Cells(2, 9).Value & ".jpg", "JPG" End If
'On remet la protection du classeur Mwb.Protect "toto" , True, True End Sub
Patrice33740
Messages postés8556Date d'inscriptiondimanche 13 juin 2010StatutMembreDernière intervention 2 mars 20231 775 11 mai 2015 à 16:31
Bonjour,
En attendant que les devins et les extralucides te répondent,
pourrais tu mettre un exemple de ton fichier sur
https://www.cjoint.com/ et revenir ici nous donner le lien obtenu.
Sinon, à défaut d'exemple, peut-être qui si tu listes le code utilisé ...
cruxifer
Messages postés16Date d'inscriptionjeudi 16 avril 2015StatutMembreDernière intervention19 mai 2015 11 mai 2015 à 16:43
Eh bien le code est assez volumineux, mais si vous pensez trouver l'erreur...
Patrice33740
Messages postés8556Date d'inscriptiondimanche 13 juin 2010StatutMembreDernière intervention 2 mars 20231 775
>
cruxifer
Messages postés16Date d'inscriptionjeudi 16 avril 2015StatutMembreDernière intervention19 mai 2015 Modifié par Patrice33740 le 12/05/2015 à 13:42
A priori c'est pas dans ce code, peut-être dans celui du bouton ou celui de itf_CQCT1 (qui reste instancié ? )
Waou, quel courage...
C'est la macro courbeTendance qui est rattachée au bouton.
Il y a 3 user form et le code dans chacun d'eux est quasiment le même pour les boutons Suivant et Quitter.
itf_CQCT1 :
Private Sub selection_fichier_Click() Dim CheminChoisi As Variant CheminChoisi = Application.GetOpenFilename(Title:="Sélection fichier") itf_CQCT1.selectedFile.Caption = CheminChoisi End Sub
Private Sub OB_PF_Click() 'Sélection Produit fini typeArticle = "PF01" End Sub
Private Sub OB_MP_Click() 'Sélection Matière première typeArticle = "MP01" End Sub
Private Sub OB_ADC01_Click() 'Sélection Article de conditionnement prim. typeArticle = "ADC01" End Sub
Private Sub OB_ADC02_Click() 'Sélection Article de conditionnement sec. typeArticle = "ADC02" End Sub
Private Sub Suivant_Click() If selectedFile.Caption <> "" Then itf_CQCT1.Hide Else MsgBox ("Vous devez choisir un fichier de données") End If End Sub
Private Sub Quitter_Click() Unload Me 'Protection du classeur à son ouverture Application.Workbooks.Item("MacroCQ_CT.xlsm").Protect "toto", True, True 'Protection de la feuille Application.Workbooks.Item("MacroCQ_CT.xlsm").Worksheets.Item("Interface") _ .Protect Password:="toto", DrawingObjects:=True, Contents:=True, userInterfaceOnly:=True End End Sub
Patrice33740
Messages postés8556Date d'inscriptiondimanche 13 juin 2010StatutMembreDernière intervention 2 mars 20231 775 12 mai 2015 à 15:31
Désolé, je ne vois pas d'où ça vient
cruxifer
Messages postés16Date d'inscriptionjeudi 16 avril 2015StatutMembreDernière intervention19 mai 2015 12 mai 2015 à 16:09
Je viens de trouver. En fait j'avais associé ma macro à un bouton issu de insertion -> Forme. Avant d'essayer de relancer ma macro, j'ai regardé quelle macro était affectée, et en fait ça la changeait après utilisation et la remplaçait par "Forme1_Click" ou un truc dans le genre. Du coup j'ai mis un vrai bouton de l'onglet développeur et ça marche nikel.
11 mai 2015 à 16:43
Modifié par Patrice33740 le 12/05/2015 à 13:42
Modifié par cruxifer le 12/05/2015 à 14:26
C'est la macro courbeTendance qui est rattachée au bouton.
Il y a 3 user form et le code dans chacun d'eux est quasiment le même pour les boutons Suivant et Quitter.
itf_CQCT1 :