Réalisation d'une macro sous 2 condtions
Bonjour à tous,
Débutant en VBA, après de longues et infructueuses recherches sur les forums. voici ma question:
Je veux copier plusieurs données ( Lieu, %passagers calcul, %passagers sigfox ) de la feuille "Résult.Final" en fonction d'une date et heure de début et fin ( voir feuille "Configuration" D3,D4 et D5) tout en s'intégrant aussi à la date et heures de la feuille ''Résult.Final" , et copier tout cela dans la feuille "graphique"
Serait-ce un problème de format de date et heure entre la feuille "Résult.Final " et "Configuration "
Merci à tous pour votre aide !
Bonsoir,
dans le code ci-dessous, vous faites appel à un onglet inexistant... (Feuil4).
Private Sub CommandButton1_Click()
Dim Ligne As Long
Dim Ligne_Feuil2 As Long
Dim LigneRecherche As Long
Dim Trouve As Boolean
Dim Index_Bas As Long
Dim Index_Haut As Long
Dim Nb_Valeur_En_Double As Long
'etc.....
Ligne = 2
Ligne_Feuil2 = 2
Do While Not IsEmpty(Feuil4.Cells(Ligne, 3)) 'l'onglet Feuil4 n'hexiste pas !
If Not Feuil4.Cells(Ligne, 2) = "-" Then ' de même ici !
Feuil3.Cells(Ligne_Feuil2, 1) = Left(Feuil4.Cells(Ligne, 6), 10)
Feuil3.Cells(Ligne_Feuil2, 1) = Feuil4.Cells(Ligne, 6)
Feuil3.Cells(Ligne_Feuil2, 2) = Right(Feuil4.Cells(Ligne, 6), 5)
Feuil3.Cells(Ligne_Feuil2, 3) = Feuil4.Cells(Ligne, 2)
Feuil3.Cells(Ligne_Feuil2, 4) = Feuil4.Cells(Ligne, 4)
Feuil3.Cells(Ligne_Feuil2, 5) = Feuil4.Cells(Ligne, 5)
Ligne_Feuil2 = Ligne_Feuil2 + 1
End If
' ect..
End SubCorriger cette erreur de frappe avant de continuer.
De plus, pour afficher la date 'en string' dans onglet 1 et 2, modifier format cellule en format date, et sélectionner un format spécifique (plus simple que les formules dans colonne "G").
Oui oui je sais, je l'es " supprimé " car sinon le fichier prenait un trop gros volume pour pouvoir l'envoyer sur le forum..
C'est bon, voici le fichier avec bien toutes les feuilles intégrées.
Merci encore pour votre aide !
Bonsoir,
désolé pour le délais apporté à une aide...
J'ai survolé le code rapidement sans regarder les détails de formats ou autres, et j'ai détecté une 'boucle sans fin' qui empêche la progression de la routine, dû à une logique de base de la programmation qui n'est pas 'respectée'.
Je regarde mieux ce soir, et vous tiens informé.
Bonsoir,
Par manque de temps ce soir, je n’ai étudié qu’une partie. Mais avec quelques explications, vous devriez comprendre et pouvoir corriger beaucoup dans votre code...
Je vais essayer d’être court et compréhensible...
Dans un premier temps, dans l’UserForm1, vous avez 4 ComboBox pour que l’utilisateur puisse sélectionner des choix.
ComboBox1, ComboBox2, ComboBox3, et ComboBox4.
Le ComboBox1 comporte une liste de choix connue et chargée au départ de l’exécution du code : Private Sub UserForm_initialize().
Suivant la sélection de ce ComboBox1, dépend la liste à charger pour le ComboBox4, de même que la sélection du ComboBox4 définit la liste à charger pour le ComboBox2. Il en est de même pour charger la liste du ComboBox3, il nous faut connaître la sélection du ComboBox2 !
Il n’est pas possible d’initialiser une liste, si toutes les conditions qui permettent de la définir ne sont pas VALIDES.
Donc, dans un premier temps, Il ne faut pas exécuter de code qui traite de liste, si la ou les conditions, qui permettent de la définir, ne sont pas valides. Puis, tant que la liste n’est, ni définie, ni charger, il faut bloquer à l’utilisateur la possibilité de faire une sélection dans la ou les listes suivantes qui en sont ‘esclaves’.
De plus, pour une meilleure compréhension, renommer les objets dans ‘un ordre logique’, facilite l’écriture du code.
ComboBox1, son résultat permet d’initialiser le ComboBox2.
ComboBox2, son résultat permet d’initialiser le ComboBox3.
ComboBox3, son résultat permet d’initialiser le ComboBox4.
Et...
Voici une partie du code modifié en ce qui concerne les ComboBox :
Private Sub ComboBox1_exit(ByVal Cancel As MSForms.ReturnBoolean) 'évènement lorsque le ComboBox est quitté
If Me.ComboBox1.ListIndex > -1 Then Exit Sub 'sélection valide, sortir du Sub.
'pas de sélection valide : Bloquer la possibilité à l'utilisateur de continuer,
Me.ComboBox2.Enabled = False
Me.ComboBox3.Enabled = False
Me.ComboBox4.Enabled = False
End Sub
Private Sub ComboBox1_Change()
Dim Looked_Date As String
Dim i As Integer
Dim Date_Test As String
Dim Trouve As Boolean
Dim y As Integer
Dim Num_Train As String
'=================================================================================
'=================================================================================
If Me.ComboBox1.ListIndex < 0 Then 'pas de sélection valide !
'bloquer la possibilité à l'utilisateur d'utiliser les autres ComboBox
Me.ComboBox2.Enabled = False
Me.ComboBox3.Enabled = False
Me.ComboBox4.Enabled = False
Exit Sub 'sortir du sub, ne pas charger de liste dans le ComboBox4 !
End If
'une sélection valide, autorise l'exécution du code ci-après
'=================================================================================
'=================================================================================
Me.ComboBox2.Clear
Me.ComboBox3.Clear
Me.ComboBox4.Clear
Set fd = Sheets("Résult.Final") ' Selection de la feuille Result Final
derLn = fd.Range("B" & Rows.Count).End(xlUp).Row ' Recherche du dernier index
Looked_Date = ComboBox1.Value ' On recupere la date selectionnee afin de mettre le numero de train dans la deuxieme combobox
Set dico1 = CreateObject("Scripting.Dictionary")
'On va maintenant rechercher la date correspondante
Fin_de_While = False ' Pour eviter de perdre du temps machine on va sortir si on trouve la
i = 3 ' On initialise la valeur de i pour commencer à compter à partir de la ligne 3.
Do While (i < derLn)
Date_Test = Mid(Feuil3.Cells(i, 1), 9, 2) + "/" + Mid(Feuil3.Cells(i, 1), 6, 2) + "/" + Left(Feuil3.Cells(i, 1), 4)
If Looked_Date = Date_Test Then
Trouve = False
For y = 0 To Me.ComboBox4.ListCount - 1
Num_Train = Feuil3.Cells(i, 3)
If Me.ComboBox4.List(y) = Num_Train Then
Trouve = True
End If
Next y
If Trouve = False Then
Me.ComboBox4.AddItem Feuil3.Cells(i, 3)
End If
End If
i = i + 1
Loop
Me.ComboBox4.Enabled = True 'autoriser l'utilisateur à utiliser le comboBox4
End SubPuis, dans la routine Sub recop(), j'ai modifié la variable derLn1 en derLn, qui provoquait une erreur au niveau de :
fd.Range("A2:A" & derLn).NumberFormat = "dd/mm/yyyy"
fd.Range("A2:A" & derLn).NumberFormat = "hh:mm"Pour terminer, je ne sais pas où aller chercher l'heure de fin pour le ComboBox3, pour éviter une erreur d'exécution, j'ai mis la ligne en question en remarque :
Private Sub ComboBox2_change()
Dim y As Integer
Dim Index As Integer
'=================================================================================
'=================================================================================
If Me.ComboBox2.ListIndex < 0 Then 'pas de sélection valide !
'bloquer la possibilité à l'utilisateur d'utiliser les autres ComboBox
Me.ComboBox3.Enabled = False
Exit Sub 'sortir du sub, ne pas charger de liste dans le ComboBox4 !
End If
'une sélection valide, autorise l'exécution du code ci-après
'=================================================================================
'=================================================================================
'Me.ComboBox3.Clear
For y = 0 To Me.ComboBox2.ListIndex - 1
'Me.ComboBox3.RemoveItem ((Me.ComboBox2.ListIndex - 1) - y) # Erreur, spécifier la feuille et cellule ! #
Next y
Me.ComboBox3.Enabled = True
End SubEn espérant vous avoir permis d'avancer, au plaisir de vous relire.