[VBA] Construire userform et récupérer valeur d'une liste déroulante dans une cellule

nat54

XLDnaute Barbatruc
Bonjour,

Ci-dessous mon code :

Code:
Sub Construire_fichiers()
 
    ''' Boucle sur l'onglet Mapping
    FinTableauMapping = Sheets("Mapping").Range("A" & "65535").End(xlUp).Row
    For i = 2 To FinTableauMapping
    FichierTraite = Workbooks("Macro_TdB_RH_automatisé.xls").Sheets("Mapping").Range("A" & i).Value
    PathFichier = Workbooks("Macro_TdB_RH_automatisé.xls").Sheets("Mapping").Range("B" & i) & FichierTraite
    CodePole = Workbooks("Macro_TdB_RH_automatisé.xls").Sheets("Mapping").Range("c" & i).Value
 
    Dim F_CurrentCata As Workbook
    Application.DisplayAlerts = False
    Set F_CurrentCata = Workbooks.Open(PathFichier)
 
    ''' Test sur pôle 3945 (à voir plus tard pour une boucle)
    'Workbooks.Open Filename:= _
    '"R:\ECHANGE\Tableau_de_bord_RH\3945 - PEDIATRIE\TdB_RH_3945_année_2011-2012.xls", _
    'WriteResPassword:="wxcvbn", _
    'IgnoreReadOnlyRecommended:=True
 
       
    ''' Déprotéger classeur
   Application.Run "'" & FichierTraite & "'!DeProtegeClasseur"
  
   
    ''' Rendre visible les onglets d'export
    With Workbooks(FichierTraite)
        .Sheets("export_HUS_abs").Visible = True
        .Sheets("export_HUS_gestor").Visible = True
        .Sheets("export_abs_N-1").Visible = True
        .Sheets("export_gestor_N-1").Visible = True
    End With
   
    ''' Pour moyenne absentéisme HUS
    Sheets("export_HUS_abs").Select
    Range("a2:u" & Range("u65536").End(xlUp).Offset(1, 0).Row).Select
    Selection.ClearContents
    Windows("Export_BO_ABS_HUS.xls").Activate
    Range("a1:u" & Range("u65536").End(xlUp).Offset(1, 0).Row).Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_HUS_abs").Select
    Range("A65536").End(xlUp).Select
    ActiveSheet.Paste
   
   
    ''' Pour moyenne gestor HUS
    Windows("Export_BO_GESTOR_HUS.xls").Activate
    Range("a1:k" & Range("k65536").End(xlUp).Offset(0, 0).Row).Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_HUS_gestor").Select
    Range("A65536").End(xlUp).Select
    ActiveSheet.Paste
   
  
    ''' Pour absentéisme du pôle test 3945 (à voir pour une boucle plus tard)
    Windows(FichierTraite).Activate
    Sheets("export_abs").Select
    Range("a2:ad" & Range("ad65536").End(xlUp).Offset(1, 0).Row).Select
    Selection.ClearContents
    Windows("Export_BO_ABS_nominatif.xls").Activate
    Selection.AutoFilter Field:=4, Criteria1:=CodePole  'field 4 = colonne D, pôle 3945
    Range("a2:ad10000").Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_abs").Select
    Range("a2:ad" & Range("ad65536").End(xlUp).Offset(1, 0).Row).Select
    ActiveSheet.Paste
 
   
   
     ''' Pour gestor du pôle test 3945 (à voir pour une boucle plus tard)
    Windows("Export_BO_GESTOR_nominatif.xls").Activate
    Selection.AutoFilter Field:=5, Criteria1:=CodePole  'field 5 = colonne E, pôle 3945
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_gestor").Select
    Range("A" & Range("a65536").End(xlUp).Offset(1, 0).Row).Select
    ActiveSheet.Paste
 
[h=1][SIZE=3]XXXXXXXXXXXX[/SIZE][/h] 
    ''' Reprotéger classeur
    Application.Run "'" & FichierTraite & "'!ProtegeClasseur"
   
   
    ''' Masquer les onglets export HUS (gestor et abs), export N-1 (gestor et abs)
    Sheets("export_HUS_abs").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("export_HUS_gestor").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("export_abs_N-1").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("export_gestor_N-1").Select
    ActiveWindow.SelectedSheets.Visible = False
   
     
    ''' Sauvegarder le TdB RH
    ActiveWorkbook.Close True 'true = sauvegarde les changements
 
 
    ''' On passe au pôle suivant
    Next
   
   
    ''' Fermer les classeurs d'export
    Windows("Export_BO_ABS_HUS.xls").Activate
    ActiveWorkbook.Close False
    Windows("Export_BO_GESTOR_HUS.xls").Activate
    ActiveWorkbook.Close False
    Windows("Export_BO_ABS_nominatif.xls").Activate
    ActiveWorkbook.Close False
    Windows("Export_BO_GESTOR_nominatif.xls").Activate
    ActiveWorkbook.Close False
 
End Sub




A la place des
[h=1]XXXXXXXXXXXX[/h]
j’aimerai voir s’afficher un userform avec une liste déroulante affichant

janvier
février
mars
avril
mai
juin
juillet
août
sept
oct
nov
dec

et que ce choix soit transposé en cellule O1 de l’onglet ABS_pole


Je sais construire un userform
http://www.heberger-image.fr

mais je ne sais pas comment l'afficher à l'endroit XXXXXXXXXXXX
Dans la propriété RowSource de la ComboBox1 j'ai mis
Accueil!i3:t3
(qui correspond au tableau des mois ci-dessus )

mais déjà ça ne m'affiche que janvier

Puis pour récupérer la valeur, je variabilise ChoixMois
Code:
Private Sub ComboBox1_Change()
ChoixMois = ComboBox1.Value
End Sub
Code:
Private Sub Validation_mois_Click()
Unload Me
End Sub

mais je ne sais pas comment affecter le résultat à la cellule O1


Merci d'avance pour votre aide !
 

nat54

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Re,

J'ai essayé de reproduire, pas forcément simple...

La macro est lancée à partir du fichier Macro_TdB_RH_automatisé.xls

Restant à ta diposition si besoin d'information complémentaire,

Merci d'avance pour ton aide !
 

Pièces jointes

  • test_vba.zip
    96.3 KB · Affichages: 132

Pierrot93

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Re,

modifie comme suit :
dans module1 :
Code:
Sub Construire_fichiers()
    UserForm1.Show
        ''' Insérer le mois pour que les graphiques s'auto-adaptent
    Workbooks.Open ("C:\TdB_RH_3945_année_2011-2012.xls")
    'Sheets("ABS_Pole").Range("O1").Value = ChoixMois
    Sheets("ABS_Pole").Range("O1").Value = UserForm1.ComboBox1.Value
End Sub

dans l'usf :


Code:
Option Explicit
Private Sub UserForm_Initialize()
''' Création des valeurs contenues dans la liste déroulante
ComboBox1.Column = Workbooks("NomClasseur.xls").Sheets("Accueil").Range("I3:T3").Value
End Sub

A noter je ne vois pas l'utilité de ta variable puisqu'à priori tu nel'utilise pas dans la procédure "Private Sub Validation_mois_Click()".... il fallait la déclarer public et ce dans un module standard pour pouvoir l'utiliser dans un autre module...
 

nat54

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Re,

Euh merci pour le 1er code dans module 1, je l'avais modifié car dans mon code réel j'ai une boucle..

- pour le 2ème code dans l'usf : ok
mais il n'y a rien pour dire met le mois choisi dans la liste déroulante en cellule O1 de l'onglet ABS_pole du tableau de bord
et le clic sur "ok" est devenu inactif..
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Re,

bah c'est cette instruction :
Code:
Sheets("ABS_Pole").Range("O1").Value = UserForm1.ComboBox1.Value
qui se trouve dans la procédure "Construire_fichiers" du module 1....
 

Pierrot93

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Re,

A noter que tu peux peut être l'associer directerment au code de ton bouton, peut être préciser le classeur si pas actif à ce moment..... tout dépend de ton projet....
 

nat54

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Re,

Je ne suis peut-être pas douée mais quand je fais la macro pas à pas
--> l'userform se présente au lancement, je choisis le mois
--> je déroule les différents copier-coller
--> et quand le code arrive à
Code:
Sheets("ABS_Pole").Range("O1").Value = UserForm1.ComboBox1.Value
ca relance le Private Sub UserForm_Initialize() alors que la liste a déjà été chargée et le choix déjà fait..

A aucun moment l'onglet ABS_POLE n'est sélectionné :(

Et le bouton ok n'est plus associé à aucune commande, je suis obligée de cliquer sur la croix rouge de l'USF
 

nat54

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Alleluia !

Ca marche, en ayant déplacé le bout de code après la déprotection des onglets

Code:
Sub Construire_fichiers()
        
        
    ''' Boucle sur l'onglet Mapping
    FinTableauMapping = Sheets("Mapping").Range("A" & "65535").End(xlUp).Row
    For i = 2 To FinTableauMapping
    FichierTraite = Workbooks("Macro_TdB_RH_automatisé.xls").Sheets("Mapping").Range("A" & i).Value
    PathFichier = Workbooks("Macro_TdB_RH_automatisé.xls").Sheets("Mapping").Range("B" & i) & FichierTraite
    CodePole = Workbooks("Macro_TdB_RH_automatisé.xls").Sheets("Mapping").Range("c" & i).Value
    Dim F_CurrentCata As Workbook
    Application.DisplayAlerts = False
    Set F_CurrentCata = Workbooks.Open(PathFichier)
        
    ''' Déprotéger classeur
   Application.Run "'" & FichierTraite & "'!DeProtegeClasseur"
   
    
    ''' Rendre visible les onglets d'export
    With Workbooks(FichierTraite)
        .Sheets("export_HUS_abs").Visible = True
        .Sheets("export_HUS_gestor").Visible = True
        .Sheets("export_abs_N-1").Visible = True
        .Sheets("export_gestor_N-1").Visible = True
    End With
    
    
    ''' Insérer le mois pour que les graphiques s'auto-adaptent
    UserForm1.Show
    
    
    
    ''' Pour moyenne absentéisme HUS
    Sheets("export_HUS_abs").Select
    Range("a2:u" & Range("u65536").End(xlUp).Offset(1, 0).Row).Select
    Selection.ClearContents
    Windows("Export_BO_ABS_HUS.xls").Activate
    Range("a1:u" & Range("u65536").End(xlUp).Offset(1, 0).Row).Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_HUS_abs").Select
    Range("A65536").End(xlUp).Select
    ActiveSheet.Paste
    
    
    ''' Pour moyenne gestor HUS
    Windows("Export_BO_GESTOR_HUS.xls").Activate
    Range("a1:k" & Range("k65536").End(xlUp).Offset(0, 0).Row).Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_HUS_gestor").Select
    Range("A65536").End(xlUp).Select
    ActiveSheet.Paste
    
   
    ''' Pour absentéisme du pôle test 3945 (à voir pour une boucle plus tard)
    Windows(FichierTraite).Activate
    Sheets("export_abs").Select
    Range("a2:ad" & Range("ad65536").End(xlUp).Offset(1, 0).Row).Select
    Selection.ClearContents
    Windows("Export_BO_ABS_nominatif.xls").Activate
    Selection.AutoFilter Field:=4, Criteria1:=CodePole  'field 4 = colonne D, pôle 3945
    Range("a2:ad10000").Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_abs").Select
    Range("a2:ad" & Range("ad65536").End(xlUp).Offset(1, 0).Row).Select
    ActiveSheet.Paste
        
    ''' Pour gestor du pôle test 3945 (à voir pour une boucle plus tard)
    Windows("Export_BO_GESTOR_nominatif.xls").Activate
    Selection.AutoFilter Field:=5, Criteria1:=CodePole  'field 5 = colonne E, pôle 3945
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Windows(FichierTraite).Activate
    Sheets("export_gestor").Select
    Range("A" & Range("a65536").End(xlUp).Offset(1, 0).Row).Select
    ActiveSheet.Paste
        
    ''' Reprotéger classeur
    Application.Run "'" & FichierTraite & "'!ProtegeClasseur"
    
    
    ''' Masquer les onglets export HUS (gestor et abs), export N-1 (gestor et abs)
    Sheets("export_HUS_abs").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("export_HUS_gestor").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("export_abs_N-1").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("export_gestor_N-1").Select
    ActiveWindow.SelectedSheets.Visible = False
    
      
    ''' Sauvegarder le TdB RH
    ActiveWorkbook.Close True 'true = sauvegarde les changements
 
    ''' On passe au pôle suivant
    Next
    
    
    ''' Fermer les classeurs d'export
    Windows("Export_BO_ABS_HUS.xls").Activate
    ActiveWorkbook.Close False
    Windows("Export_BO_GESTOR_HUS.xls").Activate
    ActiveWorkbook.Close False
    Windows("Export_BO_ABS_nominatif.xls").Activate
    ActiveWorkbook.Close False
    Windows("Export_BO_GESTOR_nominatif.xls").Activate
    ActiveWorkbook.Close False
End Sub

UERFORM
Code:
Option Explicit
Private Sub UserForm_Initialize()
''' Création des valeurs contenues dans la liste déroulante
ComboBox1.Column = Workbooks("Macro_TdB_RH_automatisé.xls").Sheets("Accueil").Range("I3:T3").Value
End Sub

Private Sub Validation_mois_Click()
Sheets("ABS_Pole").Range("O1").Value = UserForm1.ComboBox1.Value
UserForm1.Hide
End Sub


Bon comme c'est après la boucle il faudra le faire pour chaque fichier mais ce n'est pas grave...
car le mois reste "en mémoire", il y a juste à cliquer OK
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : [VBA] Construire userform et récupérer valeur d'une liste déroulante dans une ce

Re,

fonctionne chez moi en l'état dans les 2 classeurs que tu as donné... et ce après click sur le bouton de ta feuille accueil....

dans le module de l'usf :
Code:
Option Explicit
Private Sub UserForm_Initialize()
''' Création des valeurs contenues dans la liste déroulante Workbooks("NomClasseur.xls").
ComboBox1.Column = ThisWorkbook.Sheets("Accueil").Range("I3:T3").Value
End Sub
Private Sub Validation_mois_Click()
''' On garde en mémoire ce qui a été choisi dans la liste déroulante
Dim ChoixMois As String
ChoixMois = UserForm1.ComboBox1.Value
UserForm1.Hide
End Sub

dans le module 1 :
Code:
Sub Construire_fichiers()
    UserForm1.Show
        ''' Insérer le mois pour que les graphiques s'auto-adaptent
    Workbooks.Open ThisWorkbook.Path & "\TdB_RH_3945_année_2011-2012.xls"
    'Sheets("ABS_Pole").Range("O1").Value = ChoixMois
    Sheets("ABS_Pole").Range("O1").Value = UserForm1.ComboBox1.Value
    Unload UserForm1
End Sub
 

Discussions similaires

Réponses
2
Affichages
118

Statistiques des forums

Discussions
312 239
Messages
2 086 494
Membres
103 234
dernier inscrit
matteo75654548