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 :

Aide pour finir de coder une macro VBA.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Par défaut Aide pour finir de coder une macro VBA.
    Hello,

    Je suis pas un pro du VBA excel mais j'apprend en cherchant sur le net malheureusement je n'ai pas trouvé la solution dans mon cas :

    J'ai une boucle qui fonctionne bien pour rajouter une nouvelle ligne de File System si la valeur n’existe pas dans le bilan.

    Cela fonctionne aussi bien si une valeur contenant les valeurs concaténées entre l’onglet FS et le bilan sont similaires, alors la macro rajoute les valeurs les plus récentes depuis l’onglet FS (sources des données mensuelles les plus à jour) par rapport à ses données dans les bonnes colonnes du bilan.

    Par contre, si une nouvelle donnée dans l’onglet FS est présente et aussi présente dans l’onglet Bilan mais pas sur les mêmes lignes la macro ne parvient plus à faire le lien entre les données, ni la clef de recherche.

    De ce fait, la macro va écraser la ligne suivante qui est devenu la ligne courante avec la valeur précédente…

    J’espère que vous pourrez m’aider sur ce dernier point, voici l’exemple détaillé représentant le cas qui me pose problème :

    Cas en mode débugge en image :
    Nom : VBA_Excel.PNG
Affichages : 309
Taille : 21,6 Ko

    Voici le code :

    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
    Sub FS_RECUP_BILAN()
     FS_RECUP_BILAN Macro
        If MsgBox("Souhaitez-vous continuer ?", vbQuestion + vbYesNo, "QUESTION") = vbYes Then
        ' Code si la réponse est "oui"
    'Application.StatusBar = "Patientez S.V.P. Traitement en cours... "
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
        ' Remise à jour de la colonne X (FS current value) dans la colonne Y (FS previous value) pour le Bilan
        Sheets("Bilan FS").Select
        Range("X2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
        Selection.End(xlUp).Select
        Range("Y2").Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
        Range("X2").Select
        Range(Selection, Selection.End(xlDown)).Select
        ' Supprime le contenu de la col X vers la col Y
        Selection.ClearContents
        Selection.End(xlUp).Select
     
    ' ******************************************************************
    ' Déclaration des variables et commandes de mise à jour du bilan FS
    ' ******************************************************************
        Dim ws_Bilan As Worksheet
        Dim ws_FS As Worksheet
        Dim l_DerLigFS As Long
        Dim l_DerLigBilan As Long
        Dim l_LigCouranteFS As Long
        Dim l_LigCouranteBilan As Long
        Dim r_PlageCle As Range
        Dim r_PlageDate As Range
        Dim r_CleTrouve As Range
     
        ' Initialisation des variables feuilles
        Set ws_Bilan = ActiveWorkbook.Sheets("Bilan FS")
        Set ws_FS = ActiveWorkbook.Sheets("FS")
     
        ' Calcul des dernieres lignes
        l_DerLigBilan = ws_Bilan.Range("A" & Rows.Count).End(xlUp).Row
        l_DerLigFS = ws_FS.Range("A" & Rows.Count).End(xlUp).Row
     
        ' Creation des cle de recherche
        For l_LigCouranteBilan = 2 To l_DerLigBilan
            ws_Bilan.Range("AA" & l_LigCouranteBilan) = ws_Bilan.Range("A" & l_LigCouranteBilan) & "-" & ws_Bilan.Range("B" & l_LigCouranteBilan)
        Next l_LigCouranteBilan
     
        ' Initialisation Plage de Recherche Cle sur Col "AA" de Bilan
        Set r_PlageCle = ws_Bilan.Range("AA:AA")
        ' Initialisation Plage de Recherche Date sur Ligne C1:N1 de Bilan
        Set r_PlageDate = ws_Bilan.Range("C1:N1")
     
        ' Appel de la barre de progression du Bilan FS
            Frm_ProgressBar.Show 0  ' Mode non modal
            Frm_ProgressBar.Caption = Mid$(Frm_ProgressBar.Caption, 1, 13) & ": " & s_TitreMsg
            Frm_ProgressBar.Label_barre2.Caption = l_DerLigFS & " lignes à traiter"
            Frm_ProgressBar.Height = 70
     
        ' Boucle sur FS
          For l_LigCouranteFS = 2 To l_DerLigFS
     
         ' MAJ de la barre de progresssion du Bilan FS
          ws_Bilan.Activate ' Choix du la feuille a afficher
          Frm_ProgressBar.Show 0
          Call Frm_ProgressBar.MAJBarre(l_LigCouranteFS, l_DerLigFS)
          Frm_ProgressBar.Repaint
     
         ' Recherche de la Cle (FS colonne G) dans colonne AA de Bilan
         Set r_CleTrouve = r_PlageCle.Find(ws_FS.Range("G" & l_LigCouranteFS), lookat:=xlPart, LookIn:=xlValues)
         ' Recherche de la date (FS colonne F) dans colonnes C1:N1 de Bilan
         Set r_PlageDate = r_PlageDate.Find(ws_FS.Range("F" & l_LigCouranteFS), lookat:=xlPart, LookIn:=xlValues)
     
         If r_PlageDate Is Nothing Then
         ' Message d'avertissement date MySQL
           MsgBox "Attention !! Pas de correspondances de date avec certaines données sources MySQL - Voir feuille (FS Colonne F)"
           MsgBox "*** Interruption du traitement des données ***"
         Exit For
         End If
     
            If Not r_CleTrouve Is Nothing Then
            ' MAJ valeurs (FS colonne D) dans la colonne Date trouvee de Bilan
            r_PlageDate(l_LigCouranteFS) = ws_FS.Range("D" & l_LigCouranteFS)
            ' MAJ valeurs colonne X de la valeur trouvée (FS colonne E)
            ws_Bilan.Range("X" & l_LigCouranteFS) = ws_FS.Range("E" & r_CleTrouve.Row)
            ' Incremente derniere ligne Bilan (FS colonne E)
           End If
     
            If r_CleTrouve Is Nothing Then
            ' MAJ valeurs colonne A de la valeur trouvée (FS colonne A)
            ws_Bilan.Range("A" & l_DerLigBilan + 1) = ws_FS.Range("A" & l_LigCouranteFS)
            ' MAJ valeurs colonne B de la valeur trouvée (FS colonne B)
            ws_Bilan.Range("B" & l_DerLigBilan + 1) = ws_FS.Range("B" & l_LigCouranteFS)
            ' MAJ valeurs (FS colonne D) dans la colonne Date trouvee de Bilan
            r_PlageDate(l_DerLigBilan + 1) = ws_FS.Range("D" & l_LigCouranteFS)
            ' MAJ valeurs colonne X de la valeur trouvée (FS colonne E)
            ws_Bilan.Range("X" & l_DerLigBilan + 1) = ws_FS.Range("E" & l_LigCouranteFS)
            ' Incremente derniere ligne Bilan (FS colonne E)
            l_DerLigBilan = l_DerLigBilan + 1
          End If
    Next l_LigCouranteFS
     
           ' On efface la colonne de la cle de recherche dans Bilan Colonne AA
          ws_Bilan.Range("AA:AA").ClearContents
     
    Application.Calculation = xlCalculationAutomatic
    'Application.StatusBar = False
    Application.ScreenUpdating = True
           ' On agrandit la fenetre de la barre de progression
           Frm_ProgressBar.Height = 110
    Else
          ' Code si la réponse est "non"
          MsgBox "Opération annulée"
    End If
    End Sub
    Merci d’avance…

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    tu ne sers pas de r_CleTrouve dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ElseIf Not r_CleTrouve Is Nothing Then
    C'est normal ?
    Je remplacerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws_Bilan.Range("X" & l_LigCouranteFS) = ws_FS.Range("E" & l_LigCouranteFS)
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws_Bilan.Range("X" & l_LigCouranteFS) = ws_FS.Range("E" & r_CleTrouve.row)
    Voir également si ce que tu mets est correct pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If r_CleTrouve Is Nothing Then
    eric

  3. #3
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Par défaut
    Merci pour ton aide Eriic.

    En effet ca marche un peu mieux avec la valeur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws_Bilan.Range("X" & l_LigCouranteFS) = ws_FS.Range("E" & r_CleTrouve.row)
    Par contre, si la ligne n'existe plus dans l'onglet FS, il me prend la valeur d'après... il serait bien mieux qu'il la saute ou la supprime mais je ne sais pas comment coder cela.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    il vaut mieux juste la marquer, une suppression perturberait ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                If r_CleTrouve Is Nothing Then
                    ws_Bilan.Range("X" & l_LigCouranteFS) = ""
                Else
                    ' MAJ valeurs (FS colonne D) dans la colonne Date trouvee de Bilan
                    r_PlageDate(l_LigCouranteFS) = ws_FS.Range("D" & l_LigCouranteFS)
                    ' MAJ valeurs colonne X de la valeur trouvée (FS colonne E)
                    ws_Bilan.Range("X" & l_LigCouranteFS) = ws_FS.Range("E" & r_CleTrouve)
                    ' Incremente derniere ligne Bilan (FS colonne E)
                End If
    Tu peux mettre une valeur caractéristique autre que "" si tu en as des normaux sur ta feuille.
    Ensuite si tu veux les supprimer le plus rapide est de trier dessus pour tout supprimer d'un bloc.
    eric

    PS : à la place de tes 2 tests sur r_CleTrouve
    Quand une variable a 2 valeurs, si elle a une valeur elle n'a pas l'autre, pas la peine de retester.
    PS2 : évite de sauter des lignes partout. Au lieu de pouvoir voir 20 lignes de code on en voit plus que 7 avec en plus un commentaire entre chaque.

  5. #5
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Par défaut
    Salut Eriic,

    Merci pour ton retour, j'ai encore fait du ménage dans le code en retirant les sauts de lignes.

    J'ai aussi fais ce que tu m'as dit pour marquer la ligne si est elle en état "nothing".
    Le souci qui persiste, c'est dans le cas ou la ligne n'existe plus dans la feuille FS mais toujours dans la feuille Bilan. Dans ce cas, il passera à la ligne suivante avec la valeur courante, il risque de ne plus s'y retrouver non ?

    Il devrait faire une vraie comparaison des clés de recherche sur la plage de données entre les 2 feuilles je pense.

    Merci pour ton aide.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    tu fais quoi avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set r_CleTrouve = r_PlageCle.Find(ws_FS.Range("G" & l_LigCouranteFS), lookat:=xlPart, LookIn:=xlValues)
    ?
    Tu trouves ce que tu cherches...

    Stp, édite ton premier post et met la version compacte de ton code.
    C'est particulièrement pénible à lire avec des fois seulement 4 lignes utiles visibles.

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

Discussions similaires

  1. [XL-2016] Besoin d'aide pour la conception d'une macro
    Par cocodu12 dans le forum Excel
    Réponses: 1
    Dernier message: 01/03/2018, 10h12
  2. [AC-2007] Aide pour la création d'une macro
    Par Jiben59 dans le forum VBA Access
    Réponses: 21
    Dernier message: 25/01/2015, 15h02
  3. Aide pour un bug dans une macro
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/11/2014, 10h39
  4. Besoin d'aide pour finir une macro VBA
    Par Poulette44 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/11/2011, 02h48
  5. Aide pour complèter une macro VBA
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 24/11/2008, 13h07

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