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 :

Problème d'éxecution de la macro [XL-2016]


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
    Agent administratif
    Inscrit en
    Juin 2022
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Agent administratif
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2022
    Messages : 58
    Par défaut Problème d'éxecution de la macro
    Re-bonjour à tous,


    Je ne despère pas d'y arriver un jour sans votre aide.

    J'ai crée ce code et je ne comprends pas pourquoi il ne tourne 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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     Sub CorrectionGP3V4()
     
    'Définition des variables onglet "Correction Ophyr"
    Dim VLRFCE As Range         'Valeur de référence onglet
    Dim CDDEVI As Variant       'Valeur de la devise
    Dim AGEMT As Variant        'Valeur de l'agent
    Dim CDRES As Variant        'Valeur de la résidence
    Dim CDZON As Variant        'Valeur de la zone
    Dim NATIT As Variant        'Valeur de la nature du titre
    Dim RESET As Variant        'Valeur de la résidence 2
    Dim REZON As Variant        'Valeur de la zone 2
    Dim TYMNT As Variant        'Valeur du type de montant
    Dim MTDVLC As Variant       'Valeur du montant
     
    Dim VLRFCE1 As Range         'Entête de référence onglet
    Dim CDDEVI1 As Variant       'Entête de la devise
    Dim AGEMT1 As Variant        'Entête de l'agent
    Dim CDRES1 As Variant        'Entête de la résidence
    Dim CDZON1 As Variant        'Entête de la zone
    Dim NATIT1 As Variant        'Entête de la nature du titre
    Dim RESET1 As Variant        'Entête de la résidence 2
    Dim REZON1 As Variant        'Entête de la zone 2
    Dim TYMNT1 As Variant        'Entête du type de montant
    Dim MTDVLC1 As Variant       'Entête du montant
     
    'Définition de la variable onglet "ESTD"
    Dim VLRFCE2 As Range
     
    'Définition du numéro de colonne onglet "ESTD"
    Dim ColumNumber As Integer
     
    'Définition des feuilles
    Dim ShCO As Worksheet
    Dim ShESTD As Worksheet
     
    Set ShCO = Worksheets("Correction_Ophyr")
    Set ShESTD = Worksheets("ESTD")
     
     
    'Valeur recherchée
    For Each VLRFCE In ShCO.Range("a8", ShCO.Range("a1048576").End(xlUp)).Cells
        'Entete de colonne
        VLRFCE1.Range = Range("a6")
        CDDEVI1 = VLRFCE1.Offset(0, 4).Value
        AGEMT1 = VLRFCE1.Offset(0, 6).Value
        CDRES1 = VLRFCE1.Offset(0, 7).Value
        CDZON1 = VLRFCE1.Offset(0, 8).Value
        NATIT1 = VLRFCE1.Offset(0, 9).Value
        RESET1 = VLRFCE1.Offset(0, 10).Value
        REZON1 = VLRFCE1.Offset(0, 11).Value
        TYMNT1 = VLRFCE1.Offset(0, 12).Value
        MTDVLC1 = VLRFCE1.Offset(0, 13).Value
     
        'Définition des valeurs
        CDDEVI = VLRFCE.Offset(0, 4).Value
        AGEMT = VLRFCE.Offset(0, 6).Value
        CDRES = VLRFCE.Offset(0, 7).Value
        CDZON = VLRFCE.Offset(0, 8).Value
        NATIT = VLRFCE.Offset(0, 9).Value
        RESET = VLRFCE.Offset(0, 10).Value
        REZON = VLRFCE.Offset(0, 11).Value
        TYMNT = VLRFCE.Offset(0, 12).Value
        MTDVLC = VLRFCE.Offset(0, 13).Value
     
     
        'Plage de recherche
        For Each VLRFCE2 In ShESTD.Range("E3", ShESTD.Range("e1048576").End(xlUp)).Cells
     
            'Condition sur la référence
            If VLRFCE2.Value = VLRFCE.Value Then
                ColumNumber = ShESTD.Range("E1:ED1").Find(TYMNT1).Column
                If VLRFCE2.EntireRow.Cells(TYMNT).Value = TYMNT.Value Then
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(CDDEVI1).Column
                    If VLRFCE2.EntireRow.Cells(CDDEVI).Value <> CDDEVI.Value Then
                        VLRFCE2.EntireRow.Cells(CDDEVI).Value = CDDEVI.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(AGEMT1).Column
                    If VLRFCE2.EntireRow.Cells(AGEMT).Value <> AGEMT.Value Then
                        VLRFCE2.EntireRow.Cells(AGEMT).Value = AGEMT.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(CDRES1).Column
                    If VLRFCE2.EntireRow.Cells(CDRES).Value <> CDRES.Value Then
                        VLRFCE2.EntireRow.Cells(CDRES).Value = CDRES.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(CDZON1).Column
                    If VLRFCE2.EntireRow.Cells(CDZON).Value <> CDZON.Value Then
                        VLRFCE2.EntireRow.Cells(CDZON).Value = CDZON.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(NATIT1).Column
                    If VLRFCE2.EntireRow.Cells(NATIT).Value <> NATIT.Value Then
                        VLRFCE2.EntireRow.Cells(NATIT).Value = NATIT.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(RESET).Column
                    If VLRFCE2.EntireRow.Cells(RESET).Value <> RESET.Value Then
                        VLRFCE2.EntireRow.Cells(RESET).Value = RESET.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(REZON1).Column
                    If VLRFCE2.EntireRow.Cells(REZON).Value <> REZON.Value Then
                        VLRFCE2.EntireRow.Cells(REZON).Value = REZON.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                    ColumNumber = ShESTD.Range("e1:ED1").Find(MTDVLC1).Column
                    If VLRFCE2.EntireRow.Cells(MTDVLC).Value <> MTDVLC.Value Then
                        VLRFCE2.EntireRow.Cells(MTDVLC).Value = MTDVLC.Value
                        VLRFCE2.EntireRow.Cells(ColumNumber).Interior.ColorIndex = 20
                    End If
     
                End If
     
            End If
     
        Next VLRFCE2
     
    Next VLRFCE
     
    End Sub
    Il y a 2 soucis Le 1er est que la macro s'arrête sur [ VLRFCE1.Range = Range("a6")] l'objet n'est pas bon. je ne sais pas lequel mettre pour me positionner dans la cellule A6.
    Le 2nd souci est [ ColumNumber = ShESTD.Range("E1:ED1").Find(TYMNT1).Column ], je ne vois pas pourquoi.

    Je vous remercie par avance pour votre aide.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 590
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 590
    Par défaut
    Quand on affecte un Range (ou un objet comme les worksheets), il faut le mot clé Set
    Set VLRFCE1.Range = Range("a6")Je dirais aussi que sur ce code, il manque l'info de feuille concernée
    Set VLRFCE1.Range = ShCO.Range("a6") au hasard (vu le commentaire, ça doit être cette feuille)

    Pour le second souci, c'est peut-être parce qu'il ne trouve pas l'info que tu lui demandes; si l'info n'est pas trouvé, le Range renvoyé par Find est Nothing, donc il ne peut pas y avoir de numéro de colonne.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 536
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 536
    Par défaut
    Petite rectification, vue que ta variable VLRFCE1 est de type Range, tu n'as pas besoin de passer par sa propriété Range.
    Le code ci-dessous suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set VLRFCE1= Range("a6")
    Notes:
    On préfèrera utiliser des références absolues, histoire de lever les ambiguïtés.
    En effet, Range("A6"), ca désigne la cellule A6 de quelle feuille ?
    Réponse: Celle qui est active, et cette dernière peut changer à tout moment (un simple click de l'utilisateur par exemple).
    Donc histoire d'éviter les bugs et prises de tête inutiles, qualifie pleinement tes références.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set VLRFCE1= Feuil1.Range("a6")
    De plus, je ne sais pas exactement ce que fait ta fonction, mais au vue du grand nombre de variables, les probabilités qu'elle fasse plusieurs choses à la fois sont très grande.
    Par respect du SRP (https://en.wikipedia.org/wiki/Single...lity_principle), je t'invite à la diviser en plusieurs sous-fonctions qui ne font qu'une tâche. Ca simplifiera la maintenance.

    De plus, trouves de meilleurs noms pour tes variables, ils sont tout sauf parlant. Ton code, avant d'être fonctionnel, doit être lisible.

  4. #4
    Membre averti
    Homme Profil pro
    Agent administratif
    Inscrit en
    Juin 2022
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Agent administratif
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2022
    Messages : 58
    Par défaut
    Merci beaucoup pour vos différentes aides.
    Problème résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Macro]Problème d'importation .CSV avec macro
    Par Eric Harvey dans le forum VBA Access
    Réponses: 8
    Dernier message: 12/04/2007, 17h04
  2. [VBA-E] Problème d'éxecution d'un programme
    Par julio26 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 04/03/2007, 14h10
  3. Problème d'éxecution (compilation)
    Par inabil dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 19/01/2007, 11h15
  4. Problème d'éxecution d'une requete
    Par TheKratos dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/08/2006, 21h39
  5. problème de condition dans une macro
    Par Skizo dans le forum Access
    Réponses: 3
    Dernier message: 15/05/2006, 11h22

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