Récupérer la valeur d'une checkbox pré-rempli dans un nouveau classeur
Bonjour à tous !
Je suis actuellement en stage et travaille sur un projet de qualimétrie. Je possède plusieurs fichiers xls, organisé de la même façon, dans lesquels je dois extraire certaines données, puis les coller dans un nouveau classeur que je pourrais par la suite convertir en csv afin de l'analyser avec python plus tard.
Grâce à ma macro, je peux stocker dans 2 tableaux mémoire différents les données souhaitées, dans le premier le chemin du fichier sélectionné ainsi que son nom et dans le deuxième les données que je souhaite extraire sur chaque fichier. Ces tableaux sont redimensionnés en fonction du nombre de fichier choisi. Une fois chaque fichier analyser, mes tableaux sont collés sur le nouvel excel, l'un a coté de l'autre, pour pouvoir plus facilement le stocké dans un df par la suite et faire quelques visualisations.
En revanche, j'aurais besoin aussi d'extraire certaines valeurs représenté grâce à des checkbox déjà cochée, comme la décision finale du rapport (Accepté, rejeté, reporté) par exemple. Je pensais pouvoir utilisé la méthode Range comme pour les autres données grâce aux noms de chaque checkbox (chaque checkbox est nommé). Le problème est que ces checkbox ne sont rattachées à aucune cellule, et la méthode Range est donc inutilisable car ces checkbox ne sont pas à proprement dit "placées" sur le rapport xls.
J'ai pensé à utilisé la méthode checkbox.value mais elle m'est trop inconnu et je ne sais donc pas trop comment écrire mon code en conséquence.
J'en appelle donc à l'expertise de ce forum pour m'aider, s'il vous plait !
L'idéal serait qu'en fonction de la case coché (Accepté ou rejeté ou reporté), la colonne "Report_decision" du deuxième tableau prenne la valeur sous forme de texte du style (ce code ne marche absolument pas mais c'est explicite) :
If CheckBox("SC_H2_DEC_ACCEPTED").Value = True Then
report_decision = "Accepted"
ElseIf CheckBox("SC_H2_DEC_POSTPONED").Value = True Then
report_decision = "Postponed"
ElseIf Checkbo("SC_H2_DEC_REJECTED").Value = True Then
report_decision = "Rejected"
Else
report_decision = "Unknown"
Je vous laisse mon code complet ci-dessous, je ne peux en revanche pas fournir de fichier des données extraites pour des raisons de confidentialité..
Merci d'avance pour votre aide, j'espère avoir été assez clair.
Sub get_data()
'Déclaration des variables
Dim comp_num As String, company_name As String, controller_name As String, inspection_date As String
Dim Ph_G_C As Integer, Ph_G_maj As Integer, Ph_G_m As Integer, Ph_W_C As Integer, Ph_W_maj As Integer, Ph_W_m As Integer, Ph_R_C As Integer, Ph_R_maj As Integer, Ph_R_m As Integer
Dim Sc_A_C As Integer, Sc_A_maj As Integer, Sc_A_m As Integer, Sc_A_dfu_C As Integer, Sc_A_dfu_maj As Integer, Sc_A_dfu_m As Integer, Sc_A_nc_C As Integer, Sc_A_nc_maj As Integer, Sc_A_nc_m As Integer
Dim Sc_R_mp_C As Integer, Sc_R_mp_maj As Integer, Sc_R_mp_m As Integer, Sc_R_m_C As Integer, Sc_R_m_maj As Integer, Sc_R_m_m As Integer, Sc_P_C As Integer, Sc_P_maj As Integer, Sc_P_m As Integer
Dim report_decision As String
Dim i As Integer, nombre_fichier As Integer, fichier_choisi As Integer
Dim nom_fichier As String, chemin_fichier As String
Dim dialog_fichier As FileDialog
Dim measures As Integer
Dim monTab()
Dim monTabDeDonnee()
'Desactivation des différents event/alert etc pour une meilleure rapidité
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Index pour tableau
i = 1
'Selection des fichiers à analyser
Set dialog_fichier = Application.FileDialog(msoFileDialogFilePicker)
dialog_fichier.InitialFileName = " " 'chemin du dossier contenant les rapports
dialog_fichier.InitialView = msoFileDialogViewList
dialog_fichier.AllowMultiSelect = True 'Multi select autorisé
fichier_choisi = dialog_fichier.Show
If fichier_choisi = -1 Then
measures = dialog_fichier.SelectedItems.Count 'Compte du nb de fichier choisi pour redimensionnement des tableaux
ReDim monTab(measures, 1) 'Tableau du chemin et nom du fichier
ReDim monTabDeDonnee(measures, 31) 'Tableau des données à extraire
'Labelisation des colonnes des tableaux
monTab(0, 0) = "File_path"
monTab(0, 1) = "File_name"
monTabDeDonnee(0, 0) = "Comp_num"
monTabDeDonnee(0, 1) = "Ph_Good_Cri"
monTabDeDonnee(0, 2) = "Ph_Good_Maj"
monTabDeDonnee(0, 3) = "Ph_Good_Min"
monTabDeDonnee(0, 4) = "Ph_Weak_Cri"
monTabDeDonnee(0, 5) = "Ph_Weak_Maj"
monTabDeDonnee(0, 6) = "Ph_Weak_Min"
monTabDeDonnee(0, 7) = "Ph_Rejected_Cri"
monTabDeDonnee(0, 8) = "Ph_Rejected_Maj"
monTabDeDonnee(0, 9) = "Ph_Rejected_Min"
monTabDeDonnee(0, 10) = "Sc_Acc_Cri"
monTabDeDonnee(0, 11) = "Sc_Acc_Maj"
monTabDeDonnee(0, 12) = "Sc_Acc_Min"
monTabDeDonnee(0, 13) = "Sc_Acc_Dfu_Cri"
monTabDeDonnee(0, 14) = "Sc_Acc_Dfu_Maj"
monTabDeDonnee(0, 15) = "Sc_Acc_Dfu_Min"
monTabDeDonnee(0, 16) = "Sc_Acc_Nonconf_Cri"
monTabDeDonnee(0, 17) = "Sc_Acc_Nonconf_Maj"
monTabDeDonnee(0, 18) = "Sc_Acc_Nonconf_Min"
monTabDeDonnee(0, 19) = "Sc_Report_Modprocess_Cri"
monTabDeDonnee(0, 20) = "Sc_Report_Modprocess_Maj"
monTabDeDonnee(0, 21) = "Sc_Report_Modprocess_Min"
monTabDeDonnee(0, 22) = "Sc_Report_Measures_Cri"
monTabDeDonnee(0, 23) = "Sc_Report_Measures_Maj"
monTabDeDonnee(0, 24) = "Sc_Report_Measures_Min"
monTabDeDonnee(0, 25) = "Sc_Postponed_Cri"
monTabDeDonnee(0, 26) = "Sc_Postponed_Maj"
monTabDeDonnee(0, 27) = "Sc_Postponed_Min"
monTabDeDonnee(0, 28) = "Company_Name"
monTabDeDonnee(0, 29) = "Controller_Name"
monTabDeDonnee(0, 30) = "Inspection_Date"
monTabDeDonnee(0, 31) = "Report_Decision"
'Analyse de chaque fichier séléctionné
For nombre_fichier = 1 To dialog_fichier.SelectedItems.Count
'Recuperation des chemins et noms des fichiers
chemin_fichier = dialog_fichier.SelectedItems(nombre_fichier)
nom_fichier = Right(chemin_fichier, Len(chemin_fichier) - InStrRev(chemin_fichier, "\"))
'Recupération des différentes données
Workbooks.Open chemin_fichier
Sheets("ReportHeader").Activate 'Feuille ou se trouve les données voulus
comp_num = Range("SC_H_COMP_NUMBER").Value
Ph_G_C = Range("D51").Value
Ph_G_maj = Range("E51").Value
Ph_G_m = Range("F51").Value
Ph_W_C = Range("D52").Value
Ph_W_maj = Range("E52").Value
Ph_W_m = Range("F52").Value
Ph_R_C = Range("D53").Value
Ph_R_maj = Range("E53").Value
Ph_R_m = Range("F53").Value
Sc_A_C = Range("L51").Value
Sc_A_maj = Range("M51").Value
Sc_A_m = Range("N51").Value
Sc_A_dfu_C = Range("L52").Value
Sc_A_dfu_maj = Range("M52").Value
Sc_A_dfu_m = Range("N52").Value
Sc_A_nc_C = Range("L53").Value
Sc_A_nc_maj = Range("M53").Value
Sc_A_nc_m = Range("N53").Value
Sc_R_mp_C = Range("L54").Value
Sc_R_mp_maj = Range("M54").Value
Sc_R_mp_m = Range("N54").Value
Sc_R_m_C = Range("L55").Value
Sc_R_m_maj = Range("M55").Value
Sc_R_m_m = Range("N55").Value
Sc_P_C = Range("L56").Value
Sc_P_maj = Range("M56").Value
Sc_P_m = Range("N56").Value
company_name = Range("SC_H_COMPANY_NAME").Value
controller_name = Range("SC_H_COMPANY_CTRL_NAME").Value
inspection_date = Range("SC_H2_INSPECTION_DATE").Value
'Remplissage des tableaux
monTab(i, 0) = chemin_fichier
monTab(i, 1) = nom_fichier
monTabDeDonnee(i, 0) = comp_num
monTabDeDonnee(i, 1) = Ph_G_C
monTabDeDonnee(i, 2) = Ph_G_maj
monTabDeDonnee(i, 3) = Ph_G_m
monTabDeDonnee(i, 4) = Ph_W_C
monTabDeDonnee(i, 5) = Ph_W_maj
monTabDeDonnee(i, 6) = Ph_W_m
monTabDeDonnee(i, 7) = Ph_R_C
monTabDeDonnee(i, 8) = Ph_R_maj
monTabDeDonnee(i, 9) = Ph_R_m
monTabDeDonnee(i, 10) = Sc_A_C
monTabDeDonnee(i, 11) = Sc_A_maj
monTabDeDonnee(i, 12) = Sc_A_m
monTabDeDonnee(i, 13) = Sc_A_dfu_C
monTabDeDonnee(i, 14) = Sc_A_dfu_maj
monTabDeDonnee(i, 15) = Sc_A_dfu_m
monTabDeDonnee(i, 16) = Sc_A_nc_C
monTabDeDonnee(i, 17) = Sc_A_nc_maj
monTabDeDonnee(i, 18) = Sc_A_nc_m
monTabDeDonnee(i, 19) = Sc_R_mp_C
monTabDeDonnee(i, 20) = Sc_R_mp_maj
monTabDeDonnee(i, 21) = Sc_R_mp_m
monTabDeDonnee(i, 22) = Sc_R_m_C
monTabDeDonnee(i, 23) = Sc_R_m_maj
monTabDeDonnee(i, 24) = Sc_R_m_m
monTabDeDonnee(i, 25) = Sc_P_C
monTabDeDonnee(i, 26) = Sc_P_maj
monTabDeDonnee(i, 27) = Sc_P_m
monTabDeDonnee(i, 28) = company_name
monTabDeDonnee(i, 29) = controller_name
monTabDeDonnee(i, 30) = inspection_date
monTabDeDonnee(i, 31) = report_decision
i = i + 1
'Fermeture des fichiers
Workbooks(nom_fichier).Close
Next nombre_fichier
End If
'Allocation des tableaux sur le nouvel Excel
Workbooks("Consolidation.xlsm").Activate
Sheets("Data").Range("A1", "B" & measures + 1) = monTab
Sheets("Data").Range("C1", "AH" & measures + 1) = monTabDeDonnee
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Sub Macro()
Dim WS As Worksheet
Set WS = Sheets("Data")
WS.Cells.Clear
Call get_data
End SubLa solution si certaines personnes tombe sur ce post : utilisé la méthode shape
If Worksheets("ReportHeader").Shapes("SC_H2_DEC_ACCEPTED").ControlFormat.Value = 1 Then
report_decision = "Accepted"
ElseIf Worksheets("ReportHeader").Shapes("SC_H2_DEC_POSTPONE").ControlFormat.Value = 1 Then
report_decision = "Postponed"
ElseIf Worksheets("ReportHeader").Shapes("SC_H2_DEC_REJECTED").ControlFormat.Value = 1 Then
report_decision = "Rejected"
Else
report_decision = "Unknown"
End If
Ca fonctionne très bien