Réutiliser une macro

Résolu
cruxifer Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   -  
cruxifer Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   -
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

nbLigDataInit = Mdata.UsedRange.Rows.Count
compteur = 1
'Sélection des lignes où apparaissent les articles souhaités
'Libellés
Mdata.Cells(nbLigDataInit + 2, 1).Value = Mdata.Cells(1, 1).Value 'N. Lot
Mdata.Cells(nbLigDataInit + 2, 2).Value = Mdata.Cells(1, 3).Value 'Val réponse
Mdata.Cells(nbLigDataInit + 2, 3).Value = Mdata.Cells(1, 4).Value 'Borne inf
Mdata.Cells(nbLigDataInit + 2, 4).Value = Mdata.Cells(1, 5).Value 'Borne sup
Mdata.Cells(nbLigDataInit + 2, 5).Value = Mdata.Cells(1, 7).Value 'Libellé article
Mdata.Cells(nbLigDataInit + 2, 6).Value = Mdata.Cells(1, 10).Value 'Libellé carac
Mdata.Cells(nbLigDataInit + 2, 7).Value = Mdata.Cells(1, 11).Value 'Date

'Valeurs
For ligne = 2 To nbLigDataInit
If Mdata.Cells(ligne, 8) = typeArticle Then
Mdata.Cells(compteur + nbLigDataInit + 2, 1).Value = Mdata.Cells(ligne, 1).Value 'N. Lot
Mdata.Cells(compteur + nbLigDataInit + 2, 2).Value = Mdata.Cells(ligne, 3).Value 'Valeur réponse
Mdata.Cells(compteur + nbLigDataInit + 2, 3).Value = Mdata.Cells(ligne, 4).Value 'Borne inf
Mdata.Cells(compteur + nbLigDataInit + 2, 4).Value = Mdata.Cells(ligne, 5).Value 'Borne sup
Mdata.Cells(compteur + nbLigDataInit + 2, 5).Value = Mdata.Cells(ligne, 7).Value 'Libellé article
Mdata.Cells(compteur + nbLigDataInit + 2, 6).Value = Mdata.Cells(ligne, 10).Value 'Libellé Carac
Mdata.Cells(compteur + nbLigDataInit + 2, 7).Value = Mdata.Cells(ligne, 11).Value 'Date
compteur = compteur + 1
End If
Next

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

'################################################
'# Graphique #
'################################################

'--------- 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

'################################################
'# Instructions supplémentaires #
'################################################

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
A voir également:

2 réponses

Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
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é ...
0
cruxifer Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
Eh bien le code est assez volumineux, mais si vous pensez trouver l'erreur...
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780 > cruxifer Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
A priori c'est pas dans ce code, peut-être dans celui du bouton ou celui de itf_CQCT1 (qui reste instancié ? )
0
cruxifer Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Désolé, je ne vois pas d'où ça vient
0
cruxifer Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0