IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Probleme de chronologie des opérations


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut Probleme de chronologie des opérations
    Bonjour à tous,

    Je viens vers vous pour un probleme de "chronologie" des opérations de ma macro.

    Pour faire simple c'est un enchainement de recherche de et de copie de cellule. Seulement ces opération doivent se dérouler dans un ordre bien précis autrement cela ne marche pas.

    voici le code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    Sub RECHERCHE()
    Dim i As Long
    Dim CDE_ELEMENT As Workbook
    Dim CDE As Workbook
    Dim CLIENT As Workbook
    Dim Plage As Range
    Dim terme As String
    Dim code As String
    Dim dtemin As Date
    Dim dtemax As Date
    Dim dte As Date
    Dim num_cde As String
    Dim num_client As String
    Const Fichier_CDE_ELEMENT As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE_ELEMENT.xls"
    Const Fichier_CDE As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE.xls"
    Const Fichier_CLIENT As String = "C:\Documents and Settings\user\Bureau\GPS\CLIENT.xls"
     
    terme = Range("A2").Value
    code = Range("A3").Value
    dtemin = Range("D1").Value & "/" & Range("E1").Value & "/" & Range("F1").Value
    dtemax = Range("D2").Value & "/" & Range("E2").Value & "/" & Range("F2").Value
     
    Application.ScreenUpdating = False
    If Dir(Fichier_CDE) <> "" And Dir(Fichier_CLIENT) <> "" And Dir(Fichier_CDE_ELEMENT) <> "" Then
    Set CDE_ELEMENT = Workbooks.Open(Fichier_CDE_ELEMENT)
    Set CDE = Workbooks.Open(Fichier_CDE)
    Set CLIENT = Workbooks.Open(Fichier_CLIENT)
        With CDE_ELEMENT.Sheets("COMMANDE_ELEMENT")
            For i = 2 To 25000
                Set c = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
                Set d = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)
                If Not c Is Nothing And Not d Is Nothing Then
                    dte = c.Offset(0, -3).Value
                    If dte > dtemin And dte < dtemax Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Rows(2).Insert shift:=xlDown
                        .Range("A2").Value = c.Offset(0, -5).Value
                        .Range("B2").Value = c.Offset(0, -3).Value
                        .Range("C2").Value = c.Offset(0, 12).Value
                        .Range("D2").Value = c.Offset(0, 13).Value
                        .Range("E2").Value = c.Offset(0, 0).Value
                        num_cde = ThisWorkbook.Sheets("RESULTAT").Range("A2").Value
                        MsgBox num_cde
                        End With
                    End If
                End If
                Set e = CDE.Sheets("COMMANDE").Cells(i, 1).Find(num_cde)
                    If Not e Is Nothing Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Range("F2").Value = e.Offset(0, 3).Value
                        MsgBox e.Offset(0, 3).Value
                        num_client = ThisWorkbook.Sheets("RESULTAT").Range("F2").Value
                        MsgBox num_client
                        End With
                    End If
                'Set f = CLIENT.Sheets("CLIENT").Cells(i, 1).Find(num_client)
                    'If Not f Is Nothing Then
                        'With ThisWorkbook.Worksheets("RESULTAT")
                        '.Range("G2").Value = f.Value
                        'End With
                    'End If
            Next i
        End With
    CLIENT.Close False
    CDE.Close False
    CDE_ELEMENT.Close False
    Set CDE = Nothing
    Set CLIENT = Nothing
    Set CDE_ELEMENT = Nothing
    End If
     
    End Sub
    Il faudrait que la macro s'éxécute comme tel:

    opération 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Set c = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
                Set d = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)
                If Not c Is Nothing And Not d Is Nothing Then
                    dte = c.Offset(0, -3).Value
                    If dte > dtemin And dte < dtemax Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Rows(2).Insert shift:=xlDown
                        .Range("A2").Value = c.Offset(0, -5).Value
                        .Range("B2").Value = c.Offset(0, -3).Value
                        .Range("C2").Value = c.Offset(0, 12).Value
                        .Range("D2").Value = c.Offset(0, 13).Value
                        .Range("E2").Value = c.Offset(0, 0).Value
                        num_cde = ThisWorkbook.Sheets("RESULTAT").Range("A2").Value
                        MsgBox num_cde
                        End With
                    End If
                End If
    Opération 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set e = CDE.Sheets("COMMANDE").Cells(i, 1).Find(num_cde)
                    If Not e Is Nothing Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Range("F2").Value = e.Offset(0, 3).Value
                        MsgBox e.Offset(0, 3).Value
                        num_client = ThisWorkbook.Sheets("RESULTAT").Range("F2").Value
                        MsgBox num_client
                        End With
                    End If
    et opération 3: (qui est volontairement en standby pour le moment)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Set f = CLIENT.Sheets("CLIENT").Cells(i, 1).Find(num_client)
                    'If Not f Is Nothing Then
                        'With ThisWorkbook.Worksheets("RESULTAT")
                        '.Range("G2").Value = f.Value
                        'End With
                    'End If
    Or lorsque j'éxécute ma macro l'opération 2 est éxécutée avant la 1... L'opération 2 ayant besoin de données récupérées dans l'opération 1 cela ne peut pas fonctionner...

    Une idée?

    Cordialement

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Tu boucles le tout. Donc ta boucle execute pour i = 2 les opérations 1 puis 2 puis 3, ensuite pour i = 3, de même, les opérations 1 puis 2 puis 3, etc...
    Si tu veux que tes opérations se fassent entièrement de manière indépendantes, fais trois boucles !

  3. #3
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    Oui c'est ce que je voudrais qu'elle fasse

    mais elle fait 2 puis 1...

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    C'est SUR (!!!) que ta macro ne fait pas 2 puis 1. Met un point d'arrêt au niveau de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
    et regarde où se situe ton problème. Ta macro doit passer un "If" sans que tu ne t'en rendes compte ou quelque chose du genre. Peut-être un offset mal positionné qui ne trouve pas une cellule mais à la boucle d'après la trouve finalement (???).
    Bref teste ! =)

  5. #5
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    la on va arriver au maxi de mes compétences... :s

    je vais essayer avec Debug.Print

    alors, ma macro fait:
    pour i = 2
    opération 1 puis opération 2

    pour i=3 à i=n
    opération 1 et c'est tout.

  6. #6
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    je penses avoir trouvé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                Set e = CDE.Sheets("COMMANDE").Cells(i, 1).Find(num_cde)
    num_cde n'évolue pas...

    EDIT:

    en fait ça semble plus compliqué que ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    For i = 2 To 25000
                Set c = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
                Set d = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)
                If Not c Is Nothing And Not d Is Nothing Then
                    dte = c.Offset(0, -3).Value
                    If dte > dtemin And dte < dtemax Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Rows(2).Insert shift:=xlDown
                        .Range("A2").Value = c.Offset(0, -5).Value
                        .Range("B2").Value = c.Offset(0, -3).Value
                        .Range("C2").Value = c.Offset(0, 12).Value
                        .Range("D2").Value = c.Offset(0, 13).Value
                        .Range("E2").Value = c.Offset(0, 0).Value
                        num_cde = ThisWorkbook.Worksheets("RESULTAT").Range("A2").Value
                        Debug.Print num_cde
                        End With
                    End If
                End If
                Set e = CDE.Sheets("COMMANDE").Cells(i, 1).Find(num_cde)
                    If Not e Is Nothing Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Range("F2").Value = e.Offset(0, 3).Value
                        num_client = ThisWorkbook.Sheets("RESULTAT").Range("F2").Value
                        End With
                    End If
                'Set f = CLIENT.Sheets("CLIENT").Cells(i, 1).Find(num_client)
                    'If Not f Is Nothing Then
                        'With ThisWorkbook.Worksheets("RESULTAT")
                        '.Range("G2").Value = f.Value
                        'End With
                    'End If
            Next i
    Lorsque je met le Debug.Print avant la deuxieme opération la valeur de num_cde évolue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    For i = 2 To 25000
                Set c = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
                Set d = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)
                If Not c Is Nothing And Not d Is Nothing Then
                    dte = c.Offset(0, -3).Value
                    If dte > dtemin And dte < dtemax Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Rows(2).Insert shift:=xlDown
                        .Range("A2").Value = c.Offset(0, -5).Value
                        .Range("B2").Value = c.Offset(0, -3).Value
                        .Range("C2").Value = c.Offset(0, 12).Value
                        .Range("D2").Value = c.Offset(0, 13).Value
                        .Range("E2").Value = c.Offset(0, 0).Value
                        num_cde = ThisWorkbook.Worksheets("RESULTAT").Range("A2").Value
                        End With
                    End If
                End If
                Set e = CDE.Sheets("COMMANDE").Cells(i, 1).Find(num_cde)
                    Debug.Print num_cde
                    If Not e Is Nothing Then
                        With ThisWorkbook.Worksheets("RESULTAT")
                        .Range("F2").Value = e.Offset(0, 3).Value
                        num_client = ThisWorkbook.Sheets("RESULTAT").Range("F2").Value
                        End With
                    End If
                'Set f = CLIENT.Sheets("CLIENT").Cells(i, 1).Find(num_client)
                    'If Not f Is Nothing Then
                        'With ThisWorkbook.Worksheets("RESULTAT")
                        '.Range("G2").Value = f.Value
                        'End With
                    'End If
            Next i
    Lorsque je met le Debug.Print dans la deuxieme opération la valeur de num_cde n'évolue plus.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je n'ai pas lu ton code mais un petit conseil puisque tu sembles connaître les différentes étapes de ton application.
    Déclare des variables modules ou project en tête de module, crée une procédure Main qui démarre ton Application, une procédure d'initialisation de tes variables et puis autant de procédures que tu n'as d'étapes
    Un petit exemple ci-dessous : Plus tu découpes tes procédures, plus la maintenance est aisée, de plus de cette façon tu peux tester chaque phase indépendamment l'une de l'autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Option Explicit
    Public FlagInit As Boolean
    Public shtFrom As Worksheet, shtDest As Worksheet
    Public shtMvt As Worksheet, shtDoc As Worksheet
    Const shtFromName As String = "db"
    Const shtDestName As String = "Feuil2"
    Const shtMvtName As String = "Mvt"
    Const shtDocName As String = "Documentation"
    Sub Main()
     Init
     usfMenu.Show ' Eventuellement une boîte pour choisir des options 
     Phase1 ' 
     Phase2 ' 
    End Sub
    Private Sub Init()
     With ThisWorkbook
      Set shtFrom = .Worksheets(shtFromName)
      Set shtDest = .Worksheets(shtDestName)
      Set shtMvt = .Worksheets(shtMvtName)
      Set shtDoc = .Worksheets(shtDocName)
     End With
     FlagInit = True
    End Sub
    Sub Phase1()
     If Not (FlagInit) Then Init
     ' Le code
    End Sub
    Sub Phase2()
     If Not (FlagInit) Then Init
     ' Le code
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    Il ne fait aucun que c'est plus simple à lire et a gérer mais malheureusement ça dépasse mes compétences...

    J'ai essayé de faire quelque chose avec l'exemple que tu m'as donné mais ça ne marche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    Option Explicit
    Dim i As Long
    Dim CDE_ELEMENT As Workbook
    Dim CDE As Workbook
    Dim CLIENT As Workbook
    Dim Plage As Range
    Dim terme As String
    Dim code As String
    Dim dtemin As Date
    Dim dtemax As Date
    Dim dte As Date
    Dim num_cde As String
    Dim num_client As String
    Const Fichier_CDE_ELEMENT As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE_ELEMENT.xls"
    Const Fichier_CDE As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE.xls"
    Const Fichier_CLIENT As String = "C:\Documents and Settings\user\Bureau\GPS\CLIENT.xls"
     
    Sub RECHERCHE()
     
    terme = Range("A2").Value
    code = Range("A3").Value
    dtemin = Range("D1").Value & "/" & Range("E1").Value & "/" & Range("F1").Value
    dtemax = Range("D2").Value & "/" & Range("E2").Value & "/" & Range("F2").Value
     
    Application.ScreenUpdating = False
    If Dir(Fichier_CDE) <> "" And Dir(Fichier_CLIENT) <> "" And Dir(Fichier_CDE_ELEMENT) <> "" Then
    Set CDE_ELEMENT = Workbooks.Open(Fichier_CDE_ELEMENT)
    Set CDE = Workbooks.Open(Fichier_CDE)
    Set CLIENT = Workbooks.Open(Fichier_CLIENT)
        With CDE_ELEMENT.Sheets("COMMANDE_ELEMENT")
            For i = 2 To 25000
     
                Phase_1
     
                Phase_2
     
                Phase_3
     
            Next i
        End With
    CLIENT.Close False
    CDE.Close False
    CDE_ELEMENT.Close False
    Set CDE = Nothing
    Set CLIENT = Nothing
    Set CDE_ELEMENT = Nothing
    End If
     
    End Sub
     
    Private Sub Phase_1()
     
    Set c = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
    Set d = CDE_ELEMENT.Sheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)
        If Not c Is Nothing And Not d Is Nothing Then
            dte = c.Offset(0, -3).Value
            If dte > dtemin And dte < dtemax Then
                With ThisWorkbook.Worksheet("RESULTAT")
                    .Rows(2).Insert shift:=xlDown
                    .Range("A2").Value = c.Offset(0, -5).Value
                    .Range("B2").Value = c.Offset(0, -3).Value
                    .Range("C2").Value = c.Offset(0, 12).Value
                    .Range("D2").Value = c.Offset(0, 13).Value
                    .Range("E2").Value = c.Offset(0, 0).Value
                    num_cde = ThisWorkbook.Worksheet("RESULTAT").Range("A2").Value
                End With
            End If
        End If
     
    End Sub
     
    Private Sub Phase_2()
     
    Set e = CDE.Sheets("COMMANDE").Cells(i, 1).Find(num_cde)
        If Not e Is Nothing Then
            With ThisWorkbook.Worksheet("RESULTAT")
                .Range("F2").Value = e.Offset(0, 3).Value
                num_client = ThisWorkbook.Sheets("RESULTAT").Range("F2").Value
            End With
        End If
    End Sub
     
    Private Sub Phase_3()
     
    Set f = CLIENT.Sheets("CLIENT").Cells(i, 1).Find(num_client)
        If Not f Is Nothing Then
            With ThisWorkbook.Worksheets("RESULTAT")
                .Range("G2").Value = f.Value
            End With
        End If
     
    End Sub
    je suis vraiment dans un impasse.

    Est ce que vous envoyer les différent fichier pour vous aider?

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Citation Envoyé par JiBé91 Voir le message
    je suis vraiment dans un impasse.
    Est ce que vous envoyer les différent fichier pour vous aider?
    Montrer ton code et demander que l'on y regarde n'est pas à mon avis la bonne démarche.
    Le mieux serait que tu expliques clairement ce que tu as (structure des tables, organisation des colonnes, etc...) et où tu veux aller (Vers quelle feuille, existantes ou nouvelle(s), ce qu'il faut faire) bref ce qu'on appelle une analyse.
    On pourra ainsi te donner des pistes mais pas faire le travail à ta place.
    En écrivant cela je pense que tu vas voir nettement plus clair et tu auras sans doute toi même la réponse à ton problème.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    Je ne vous demande pas de faire le boulot à ma place. J'ai fait mon code avec pas mal d'erreur que je corrige au fur et à mesure mais la je bloque sur une que je n'arrive pas a corriger d'ou ma demande. J'ai pas forcement de super bases en macro ça fait à peine plus d'un mois que je me suis lancé dedans en autodidacte...

    Je vais essayer de vous décrire l'ensemble.

    Il y a 4 classeurs:
    le classeur nommé recherche est celui qui contient la macros, il est composé de 2 feuilles: RECHERCHE et RESULTAT
    le classeur COMMANDE_ELEMENT est composé d'une seul feuille nommée COMMANDE ELEMENT
    le classeur COMMANDE est composé d'une seul feuille nommée COMMANDE
    le classeur CLIENT est composé d'une seul feuille nommée CLIENT

    Le but de la macro est de ressortir pour un type de pièce toute les commandes passées sur une période. (type de piece, date, prix de vente, client, n° de commande)

    Le classeur COMMANDE_ELEMENT contient le type de piece, date prix, n° commande
    Le classeur COMMANDE contient n°commande, n°client
    Le classeur CLIENT contient n°client, nom client

    La premiere partie consistant a récupérer les informations (type de piece, date prix, n° commande) dans le classeur COMMANDE_ELEMENT suivant les criteres (référence et date) ne m'a pas posée de problème.

    C'est la que ça bloque, la seconde partie, elle consiste a reprendre le numéro de commande pour aller avec celui ci trouver le client correspondant dans le classeur COMMANDE.

    Vous l'aurez compris la troisieme partie est le meme principe que la seconde mais dans un autre classeur.

    est ce que cela vous aide?

    PS: j'ai aussi mis des commentaires a mon code afin que vous puissiez comprendre plus simplement ma démarche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Sub RECHERCHE()
     
    Dim i As Long
    Dim CDE_ELEMENT As Workbook, CLIENT As Workbook, CDE As Workbook
    Dim terme As String, code As String, num_cde As Variant, num_client As String
    Dim dtemin As Date, dtemax As Date, dte As Date
     
    Const Fichier_CDE_ELEMENT As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE_ELEMENT.xls"      'les différents classeur
    Const Fichier_CDE As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE.xls"                      'dans lesquels on va rechercher
    Const Fichier_CLIENT As String = "C:\Documents and Settings\user\Bureau\GPS\CLIENT.xls"                     'les données
     
    terme = Range("A2").Value                                                                                   'désignation de la piece
    code = Range("A3").Value                                                                                    'partie référence de la piece
    dtemin = Range("D1").Value & "/" & Range("E1").Value & "/" & Range("F1").Value                              'date mini de la recherche
    dtemax = Range("D2").Value & "/" & Range("E2").Value & "/" & Range("F2").Value                              'date maxi de la recherche
     
    Application.ScreenUpdating = False                                                                          'pas d'update
     
    If Dir(Fichier_CDE) <> "" And Dir(Fichier_CLIENT) <> "" And Dir(Fichier_CDE_ELEMENT) <> "" Then             'si les trois fichiers existe
     
        Set CDE_ELEMENT = Workbooks.Open(Fichier_CDE_ELEMENT)
        Set CDE = Workbooks.Open(Fichier_CDE)
        Set CLIENT = Workbooks.Open(Fichier_CLIENT)
     
            With CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT")                                                     'dans COMMANDE_ELEMENT
     
                For i = 2 To 25000
     
                    Set c = CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
                    Set d = CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)                   'trouver à la fois dans deux colonnes différentes
                                                                                                                '"terme" et "code"
                        If Not c Is Nothing And Not d Is Nothing Then
     
                            dte = c.Offset(0, -3).Value                                                         'récupéré la date
     
                            If dte > dtemin And dte < dtemax Then                                               'vérifier si la date est dans l'interval
     
                                With ThisWorkbook.Worksheets("RESULTAT")                                        'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                                .Rows(2).Insert shift:=xlDown                                                   'insérer un ligne
                                .Range("A2").Value = c.Offset(0, -5).Value                                      'copier n°commande
                                .Range("B2").Value = c.Offset(0, -3).Value                                      'copier date
                                .Range("C2").Value = c.Offset(0, 12).Value                                      'copier prix unitaire
                                .Range("D2").Value = c.Offset(0, 13).Value                                      'copier prix total
                                .Range("E2").Value = c.Offset(0, 0).Value                                       'copier designation
                                num_cde = ThisWorkbook.Worksheets("RESULTAT").Range("A2").Value                 'récupérer le numéro de commande et le mettre en variable num_cde
     
                                End With
     
                            End If                                                                              'fin du travail avec le classeur COMMANDE_ELEMENT
     
                        End If
     
                    Set e = CDE.Worksheets("COMMANDE").Cells(i, 1).Find(num_cde)                                'recherche dans le classeur COMMANDE avec le numéro de commande
                                                                                                                'précédement récupéré en variable
                        If Not e Is Nothing Then
     
                            With ThisWorkbook.Worksheets("RESULTAT")                                            'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                            .Range("F2").Value = e.Offset(0, 3).Value                                           'copier le numéro client
                            num_client = ThisWorkbook.Worksheets("RESULTAT").Range("F2").Value                  'récupérer le numéro client et le mettre en variable num_client
                            End With
     
                        End If                                                                                  'fin du travail avec le classeur COMMANDE
     
                    Set f = CLIENT.Sheets("CLIENT").Cells(i, 1).Find(num_client)                                'recherche dans le classeur CLIENT avec le numéro CLIENT
                                                                                                                'précédement récupéré en variable
                        If Not f Is Nothing Then
     
                            With ThisWorkbook.Worksheets("RESULTAT")                                            'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                            .Range("G2").Value = f.Value                                                        'copier le nom client
                            End With
     
                        End If                                                                                  'fin du travail avec le classeur CLIENT
                Next i
     
            End With
    End If
     
    CLIENT.Close False                                                                                          'fermeture des classeur
    CDE.Close False
    CDE_ELEMENT.Close False
     
    Set CDE = Nothing                                                                                           'libere les variables
    Set CLIENT = Nothing
    Set CDE_ELEMENT = Nothing
     
    End Sub

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Avec le code que tu publies, voilà comment déjà je le structurerais pour y voir plus clair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Option Explicit
    ' Déclaration
    Dim CDE_ELEMENT As Workbook, CLIENT As Workbook, CDE As Workbook
    Dim terme As String, code As String, num_cde As Variant, num_client As String
    Dim dtemin As Date, dtemax As Date, dte As Date
     
    Const Fichier_CDE_ELEMENT As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE_ELEMENT.xls"      'les différents classeur
    Const Fichier_CDE As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE.xls"                      'dans lesquels on va rechercher
    Const Fichier_CLIENT As String = "C:\Documents and Settings\user\Bureau\GPS\CLIENT.xls"                     'les données
    Dim flagInit As Boolean
    Sub Main()
     Application.ScreenUpdating = False
     Init      ' Phase 0 - Initialisation
     Recherche ' Phase 2 -
     Application.ScreenUpdating = True
    End Sub
    Sub Init()
     flagInit = True
     If Dir(Fichier_CDE) <> "" And Dir(Fichier_CLIENT) <> "" And Dir(Fichier_CDE_ELEMENT) <> "" Then             'si les trois fichiers existe
      Set CDE_ELEMENT = Workbooks.Open(Fichier_CDE_ELEMENT)
      Set CDE = Workbooks.Open(Fichier_CDE)
      Set CLIENT = Workbooks.Open(Fichier_CLIENT)
     End If
     terme = Range("A2").Value                                                                                   'désignation de la piece
     code = Range("A3").Value                                                                                    'partie référence de la piece
     dtemin = Range("D1").Value & "/" & Range("E1").Value & "/" & Range("F1").Value                              'date mini de la recherche
     dtemax = Range("D2").Value & "/" & Range("E2").Value & "/" & Range("F2").Value                              'date maxi de la recherche
    End Sub
    Sub Recherche()
      If Not flagInit Then Init
      With CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT")                                                     'dans COMMANDE_ELEMENT
       For i = 2 To 25000
        Set c = CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
        Set d = CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)                   'trouver à la fois dans deux colonnes différentes
          If Not c Is Nothing And Not d Is Nothing Then
              dte = c.Offset(0, -3).Value                                                         'récupéré la date
              If dte > dtemin And dte < dtemax Then                                               'vérifier si la date est dans l'interval
                  With ThisWorkbook.Worksheets("RESULTAT")                                        'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                  .Rows(2).Insert shift:=xlDown                                                   'insérer un ligne
                  .Range("A2").Value = c.Offset(0, -5).Value                                      'copier n°commande
                  .Range("B2").Value = c.Offset(0, -3).Value                                      'copier date
                  .Range("C2").Value = c.Offset(0, 12).Value                                      'copier prix unitaire
                  .Range("D2").Value = c.Offset(0, 13).Value                                      'copier prix total
                  .Range("E2").Value = c.Offset(0, 0).Value                                       'copier designation
                  num_cde = ThisWorkbook.Worksheets("RESULTAT").Range("A2").Value                 'récupérer le numéro de commande et le mettre en variable num_cde
                  End With
              End If                                                                              'fin du travail avec le classeur COMMANDE_ELEMENT
          End If
        Set e = CDE.Worksheets("COMMANDE").Cells(i, 1).Find(num_cde)                                'recherche dans le classeur COMMANDE avec le numéro de commande
            If Not e Is Nothing Then
                With ThisWorkbook.Worksheets("RESULTAT")                                            'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                .Range("F2").Value = e.Offset(0, 3).Value                                           'copier le numéro client
                num_client = ThisWorkbook.Worksheets("RESULTAT").Range("F2").Value                  'récupérer le numéro client et le mettre en variable num_client
                End With
            End If                                                                                  'fin du travail avec le classeur COMMANDE
        Set f = CLIENT.Sheets("CLIENT").Cells(i, 1).Find(num_client)                                'recherche dans le classeur CLIENT avec le numéro CLIENT
            If Not f Is Nothing Then
                With ThisWorkbook.Worksheets("RESULTAT")                                            'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                .Range("G2").Value = f.Value                                                        'copier le nom client
                End With
            End If                                                                                  'fin du travail avec le classeur CLIENT
       Next i
      End With
    End Sub
    Il y a donc la partie Déclaration où l'on retrouve toutes variables et constantes qui sont communes à toutes les procédures du module.
    La procédure Main est la procédure principale qui appelle toutes les procédures que je décompose en Phase x. La première Phase0 étant la procédure d'initialisation des procédures communes (déclarées dans la zone déclaration).
    J'ai une variable booléenne FlagInit qui est à True quand les variables sont initialisées. Ce qui me permet de faire démarrer chaque phase indépendamment des autres pour faire mes tests.
    Ja fais donc précéder chacune de ces procédures par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not flagInit Then Init
    Je constate que beaucoup de variables telles que I, A, B, C etc... ne sont pas déclarées
    Je te conseille donc d'utiliser l'option Explicit afin de t'obliger à déclarer toutes tes variables. C'est plus de travail mais la maintenance et le déboguage en sera facilité.
    Pour tes variables, j'utiliserais des variables plus explicites surtout quand il y en a beaucoup. Je sais que tous les exemples de boucles utilisent les variables I ou X mais quand on parcourt des lignes il me semble plus explicite d'utiliser L(igne) ou R(ow) qui permet une facilité de relecture d'un code plusieurs mois après.

    Ensuite chaque phase à sa procédure qui pourrait avoir des sous-procédures si le nombre de lignes devient trop important.
    Pour les variables objets, tu utilises des variables pour les répertoires et classeurs. J'utiliserais en plus des variables pour les tables de données plus aisées à travailler.
    Exemple : pour cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT")
    Ce serait plus simple d'avoir déclaré une variable objet de type Range qui serait par exemple CdeElem qui ferait référence aux cellules A2:G2500 de la feuille "COMMANDE_ELEMENT" du classeur COMMANDE_ELEMENT.xls.
    La ligne de code s'écrirait alors
    Pour la seconde partie, je créerais donc une nouvelle procédure (Phase 2) où je lirais séquentiellement la table de données où se trouve les n° de commandes pour aller chercher les données que j'ai besoin dans le classeur COMMANDE où se trouve les n° de commande et n° de client et ainsi de suite pour les autres parties de ton application.
    J'ajouterais qu'il serait préférable sans doute de penser à utiliser des variables tableaux dans ce cas précis. Il y a d'excellents tutoriels à ce sujet sur dvp
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    Bonjour Philippe,

    j'avais laissé cette macro de coté quelques jours car je m'agaçais dessus. De plus mon supérieur à modifié sa demande et j'ai pu lui fournir ce qu'il voulait avec ce que j'avais fait en macro. Toutefois je tiens à la finir... (qui sais, il pourrait re-changer d'avis)

    J'avais bien pensé appeler des sous-macro afin ce faciliter la lecture et aussi comme tu le dis, la maintenance. Mais je bloquais sur la fonction recherche. En effet dans ce cas le terme recherché sera une variable. J'ai essayé quelques chose, qui ne fonctionne pas. Ca bloque juste avant la fameuse fonction recherche qui me genait.

    Code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    Option Explicit                                                                                             ' Déclaration
     
    Dim CDE_ELEMENT As Workbook, CLIENT As Workbook, CDE As Workbook
    Dim terme As String, code As String, num_cde As Variant, num_client As String
    Dim dtemin As Date, dtemax As Date, dte As Date
    Dim i As Long, j As Long, k As Long
    Dim c As Range, d As Range, e As Range, f As Range, g As Range
    Dim flagInit As Boolean
     
    Const Fichier_CDE_ELEMENT As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE_ELEMENT.xls"      'les différents classeur
    Const Fichier_CDE As String = "C:\Documents and Settings\user\Bureau\GPS\COMMANDE.xls"                      'dans lesquels on va rechercher
    Const Fichier_CLIENT As String = "C:\Documents and Settings\user\Bureau\GPS\CLIENT.xls"                     'les données
    Sub Main()
     
        Application.ScreenUpdating = False
        Init                                                                                                    ' Phase 0 - Initialisation
        Recherche_Ph1                                                                                           ' Phase 1 - Recherche dans COMMANDE_ELEMENT
        Recherche_Ph2                                                                                           ' Phase 2 - Recherche dans COMMANDE
        Recherche_Ph3                                                                                           ' Phase 3 - Recherche dans CLIENT
        Close_classeur
        Application.ScreenUpdating = True
     
    End Sub
    Sub Init()
        flagInit = True
     
        terme = Range("A2").Value                                                                               'désignation de la piece
        code = Range("A3").Value                                                                                'partie référence de la piece
        dtemin = Range("D1").Value & "/" & Range("E1").Value & "/" & Range("F1").Value                          'date mini de la recherche
        dtemax = Range("D2").Value & "/" & Range("E2").Value & "/" & Range("F2").Value                          'date maxi de la recherche
     
        If Dir(Fichier_CDE) <> "" And Dir(Fichier_CLIENT) <> "" And Dir(Fichier_CDE_ELEMENT) <> "" Then         'si les trois fichiers existe
            Set CDE_ELEMENT = Workbooks.Open(Fichier_CDE_ELEMENT)
            Set CDE = Workbooks.Open(Fichier_CDE)
            Set CLIENT = Workbooks.Open(Fichier_CLIENT)
        End If
     
    End Sub
    Sub Recherche_Ph1()
      If Not flagInit Then Init
      With CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT")                                       'dans COMMANDE_ELEMENT
       For i = 2 To 25000
        Set c = CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT").Cells(i, 6).Find(terme)
        Set d = CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT").Cells(i, 5).Find(code)           'trouver à la fois dans deux colonnes différentes
          If Not c Is Nothing And Not d Is Nothing Then
              dte = c.Offset(0, -3).Value                                                   'récupéré la date
              If dte > dtemin And dte < dtemax Then                                         'vérifier si la date est dans l'interval
                  With ThisWorkbook.Worksheets("RESULTAT")                                  'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                  .Rows(2).Insert shift:=xlDown                                             'insérer un ligne
                  .Range("A2").Value = c.Offset(0, -5).Value                                'copier n°commande
                  .Range("B2").Value = c.Offset(0, -3).Value                                'copier date
                  .Range("C2").Value = c.Offset(0, 12).Value                                'copier prix unitaire
                  .Range("D2").Value = c.Offset(0, 13).Value                                'copier prix total
                  .Range("E2").Value = c.Offset(0, 0).Value                                 'copier designation
                  num_cde = ThisWorkbook.Worksheets("RESULTAT").Range("A2").Value           'récupérer le numéro de commande et le mettre en variable num_cde
                  End With
              End If                                                                        'fin du travail avec le classeur COMMANDE_ELEMENT
          End If
        Next i
      End With
    End Sub
    Sub Recherche_Ph2()
        With ThisWorkbook.Worksheets("RESULTAT")
            For j = 2 To 25000
                If Not IsEmpty(Cells(j, 1)) Then
                    num_cde = d.Value
     
                    With CDE.Worksheets("COMMANDE")
                        Set e = CDE.Worksheets("COMMANDE").Cells(j, 1).Find(num_cde)        'recherche dans le classeur COMMANDE avec le numéro de commande
                            If Not e Is Nothing Then
                                With ThisWorkbook.Worksheets("RESULTAT")                    'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                                    d.Offset(0, 5).Value = e.Offset(0, 3).Value             'copier le numéro client
                                End With
                            End If
                    End With
                End If                                                                      'fin du travail avec le classeur COMMANDE
            Next j
        End With
    End Sub
    Sub Recherche_Ph3()
        With ThisWorkbook.Worksheets("RESULTAT")
            For k = 2 To 25000
                If Not IsEmpty(Cells(k, 5)) Then
                    num_client = f.Value
     
                    With CLIENT.Worksheets("CLIENT")
                        Set g = CDE.Worksheets("COMMANDE").Cells(k, 1).Find(num_client)     'recherche dans le classeur COMMANDE avec le numéro de commande
                            If Not g Is Nothing Then
                                With ThisWorkbook.Worksheets("RESULTAT")                    'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                                    f.Offset(0, 6).Value = g.Offset(0, 2).Value             'copier le numéro client
                                End With
                            End If
                    End With
                End If
            Next k
        End With                                                                            'fin du travail avec le classeur COMMANDE
    End Sub
     
    Sub Close_classeur()
     
    CLIENT.Close False                                                                      'fermeture des classeur
    CDE.Close False
    CDE_ELEMENT.Close False
     
    Set CDE = Nothing                                                                       'libere les variables
    Set CLIENT = Nothing
    Set CDE_ELEMENT = Nothing
     
    End Sub
    Partie ou cela bloque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub Recherche_Ph2()
        With ThisWorkbook.Worksheets("RESULTAT")
            For j = 2 To 25000
                If Not IsEmpty(Cells(j, 1)) Then
                    num_cde = d.Value
     
                    With CDE.Worksheets("COMMANDE")
                        Set e = CDE.Worksheets("COMMANDE").Cells(j, 1).Find(num_cde)        'recherche dans le classeur COMMANDE avec le numéro de commande
                            If Not e Is Nothing Then
                                With ThisWorkbook.Worksheets("RESULTAT")                    'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                                    d.Offset(0, 5).Value = e.Offset(0, 3).Value             'copier le numéro client
                                End With
                            End If
                    End With
                End If                                                                      'fin du travail avec le classeur COMMANDE
            Next j
        End With
    End Sub
    Citation Envoyé par Philippe Tulliez Voir le message
    Ensuite chaque phase à sa procédure qui pourrait avoir des sous-procédures si le nombre de lignes devient trop important.
    Pour les variables objets, tu utilises des variables pour les répertoires et classeurs. J'utiliserais en plus des variables pour les tables de données plus aisées à travailler.
    Exemple : pour cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT")
    Ce serait plus simple d'avoir déclaré une variable objet de type Range qui serait par exemple CdeElem qui ferait référence aux cellules A2:G2500 de la feuille "COMMANDE_ELEMENT" du classeur COMMANDE_ELEMENT.xls.
    La ligne de code s'écrirait alors
    Quel formule utilisé pour la déclarer comme tel?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set CDE_ELEMENT = Workbooks.Open(Fichier_CDE_ELEMENT)
    Set CDE_ELEM = CDE_ELEMENT.Worksheets("COMMANDE_ELEMENT").Range("A2:G25000")
    Merci de ton aide

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Dans cette ligne on déclare CDE_ELEMENT comme un objet de type Workbook.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim CDE_ELEMENT As Workbook, CLIENT As Workbook, CDE As Workbook
    Si tu souhaites que ce soit une cellule ou une plage de cellule, tu déclares cette variable comme un Range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim CDE_ELEMENT As Range
    Tu pourrais faire aussi comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
    Dim rng As Range
    Sub Main()
     Set rng = ThisWorkbook.Worksheets("Feuil1").Range("A1:d50")
     rng.Select
     rng.Value = "Coucou"
    End Sub
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
    Dim wkb As Workbook, sht As Worksheet
    Dim rng As Range
    Sub Main()
     Set wkb = ThisWorkbook
     Set sht = wkb.Worksheets("Feuil1")
     Set rng = sht.Range("A1:D50")
     sht.Range("F20") = "Ici" ' Ecrit dans la cellule F20 de la feuille "Feuil1"
     rng = "Excel"  ' Ecrit dans la plage A1:D50 de la feuille Feuil1
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    Voila ce que cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub Init()
        flagInit = True
     
        terme = Range("A2").Value                                                                               'désignation de la piece
        code = Range("A3").Value                                                                                'partie référence de la piece
        dtemin = Range("D1").Value & "/" & Range("E1").Value & "/" & Range("F1").Value                          'date mini de la recherche
        dtemax = Range("D2").Value & "/" & Range("E2").Value & "/" & Range("F2").Value                          'date maxi de la recherche
     
        Set RECHERCHE = ThisWorkbook.Worksheets("RECHERCHE")
        Set RESULTAT = ThisWorkbook.Worksheets("RESULTAT")
     
        If Dir(Fichier_CDE) <> "" And Dir(Fichier_CLIENT) <> "" And Dir(Fichier_CDE_ELEMENT) <> "" Then         'si les trois fichiers existe
            Set CDE_ELEMENT_WBK = Workbooks.Open(Fichier_CDE_ELEMENT)
            Set CDE_WBK = Workbooks.Open(Fichier_CDE)
            Set CLIENT_WBK = Workbooks.Open(Fichier_CLIENT)
        End If
     
        Set CDE_ELEMENT = CDE_ELEMENT_WBK.Worksheets("COMMANDE_ELEMENT").Range("A1:S25000")
        Set CDE = CDE_WBK.Worksheets("COMMANDE").Range("A1:D25000")
        Set CLIENT = CLIENT_WBK.Worksheets("CLIENT").Range("A1:D25000")
     
     
    End Sub
    ça semble bon. Biensur je les aussi déclarer en range et en worksheets.

    Comment lui faire comprendre que je veux que la variable num_cde prene la valeur de la cellule j?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Recherche_Ph2()
        With RESULTAT
            For j = 2 To 25000
                If Not IsEmpty(Cells(j, 1)) Then
                    num_cde = d.Value
    Cordialement

  15. #15
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Comment lui faire comprendre que je veux que la variable num_cde prene la valeur de la cellule j?
    Comme ceci peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Recherche_Ph2()
        With RESULTAT
            For j = 2 To 25000
                If Not IsEmpty(Cells(j, 1)) Then
                    num_cde = Cells(j, 1).value

  16. #16
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    j'y avais pensé mais je me suis dit que Cells(j, 1) en ligne 4 et Cells(j, 1) en ligne 5 ne serait pas forcement les memes, à tort je suppose?!

  17. #17
    Membre averti
    Homme Profil pro
    TSE
    Inscrit en
    Octobre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : TSE
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 32
    Par défaut
    Il y a toujours quelques bug:

    dans cette sous macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Recherche_Ph2()
        If Not flagInit Then Init
        With RESULTAT
            For j = 2 To 25000
                If Not IsEmpty(Cells(j, 1)) Then
                    num_cde = Cells(j, 1).Value
                    Debug.Print num_cde
                    With CDE
                        Set e = CDE.Cells(j, 1).Find(num_cde)                               'recherche dans le classeur COMMANDE avec le numéro de commande
                            If Not e Is Nothing Then
                                With RESULTAT                                               'Dans le classeur RECHERCHE et dans la feuille RESULTAT
                                    Cells(j, 1).Offset(0, 5).Value = e.Offset(0, 3).Value   'copier le numéro client
                                End With
                            End If
                    End With
                End If                                                                      'fin du travail avec le classeur COMMANDE
            Next j
        End With
    End Sub
    les données que me donne le Debug.Print sont pas bonne. Au lieu de travailler dans le classeur RECHERCHE la macro travail dans le classeur CLIENT.

    Pourtant je lui demande bien avec With RESULTAT de travailler dans le classeur RECHERCHE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set RESULTAT = ThisWorkbook.Worksheets("RESULTAT")
    Cordialement

Discussions similaires

  1. [easystruts] probleme de copie des *.tld dans web-inf
    Par champion dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/08/2004, 12h46
  2. Problème d'install des drivers NVIDIA
    Par Blowih dans le forum Matériel
    Réponses: 4
    Dernier message: 14/08/2004, 21h16
  3. Réponses: 5
    Dernier message: 07/07/2004, 17h05
  4. [C#] Probleme de dimensionnement des fenetres en MDI
    Par stephdiplo150 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/05/2004, 20h05
  5. [TP][MULTI-PROBLEME]Comment afficher des images pcx
    Par mikoeur dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 24/10/2002, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo