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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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