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 !

9sebb29-copie.xlsm (122.10 Ko)

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 Sub

Corriger 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 !

11sebb29-copie-2.xlsm (132.01 Ko)

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 Sub

Puis, 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 Sub

En espérant vous avoir permis d'avancer, au plaisir de vous relire.

Rechercher des sujets similaires à "realisation macro condtions"