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 :

[VBA-E] Comparaison de donnée + Msgbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Étudiant
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut [VBA-E] Comparaison de donnée + Msgbox
    Bonjour tous le monde,

    J'ai un gros problème que je n'arrive pas à résoudre ! j'ai sur une sheet une base de donné qui contient dans la colonne C le nom de l'affaire!! Dans une autre sheet "Budget" j'ai dans la colonne D tous les nom d'affaire que le contrôleur de gestion à taper manuellement!!!
    Je voudrais tous simplement avec une macro comparer ces deux colonnes et ensuite que le programme m'envoie un msgbox lorqu'il ne trouve pas le nom de l'affaire dans l'onglet budget!
    J'ai éssayé toute la journée hier mais vu que je suis un novice en vba, je pense que j'ai fait une erreur dans ma programmation!!

    j'ai surement un probléme avec mes boucles

    J'espére que j'ai bien expliquer mon probléme!! Au pire voila mon programme

    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
       Sheets("DonnéBudget").Activate
        Cells(1).Select
        Selection.CurrentRegion.Select
        Set basebudget = Selection
     
        Sheets("BudgetCoûts").Activate
        range("a5").Select
        Selection.CurrentRegion.Select
        Set recueilbudget = Selection
     
    'Recherche les derniéres cellules non vide sur la colonne 1
    lignemax2 = Sheets("BudgetCoûts").Cells(65527, 1).End(xlUp).Row
    lignemax = Sheets("DonnéBudget").Cells(65527, 1).End(xlUp).Row
     
    'boucle de recherche des noms d'affaire sur l'onglet budgetCoûts
     
    For a = 2 To lignemax
        chercheerreur = basebudget.Columns(3).Cells(a)
    'si le nom d'affaire est vide alors message d'erreur
                If chercheerreur = "" Then
                MsgBox "Attention, il manque des données sur la colonne C de l'onglet DonnéBudget, allez voir à la ligne " & a, vbExclamation + vbOKOnly, "Message d'avertissement"
                End If
    Next a
     
    'réinitialisation des variables
    i = 0
    r = 0
    a = 0
    'message pour prévenir que le nom de l'affaire n'est pas encore créer!!         
    For i = 1 To basebudget.Columns(1).Cells.Count
       monaffairebudget = basebudget.Columns(3).Cells(i + 1).Value
     
     
             For r = r To recueilbudget.Columns(1).Cells.Count
             chercheerreur = recueilbudget.Columns(4).Cells(r + 1)
                Do
                i = i
                r = r + 1
                 'MsgBox "nombase" & monaffairebudget
                 'MsgBox "nombrecueil" & chercheerreur
                 If chercheerreur = monaffairebudget Then
                 'MsgBox "GREAT"
                 GoTo suite2
                 ElseIf chercheerreur = Mid(monaffairebudget, 2) Then
                 'MsgBox "GREAT"
                 GoTo suite2
                 ElseIf chercheerreur = "" Then
                 'MsgBox "GREAT"
                 GoTo suite2
                 Else
                 MsgBox "Le nom de l'affaire est inconnu, veuillez la créer! Cette erreur dans l'onglet budgetdonné fait référence à la ligne " & i, vbExclamation, "Message d'avertissement"
                 End If
                 Loop While chercheerreur = monaffairebudget
     
             Next r
    suite2:
    Next i
    je vous remercie d'avance pour votre aide car moi cette macro m'a donné des maux de tête

    oui je suis obligé de faire en vba car c'est une base de donné que l'on actualise tous les mois!!! C'est ça le probléme!! Le dossier de donné fait pour l'instand 300 lignes mais je n'ai que les données de janvier

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 556
    Par défaut
    Ceci devrait plutôt bien marcher

    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
     
    Dim i, j As Integer
    Dim lignemax, lignemax2 As Long
    Dim trouve As Boolean
    i = 1
     
    lignemax2 = Sheets("BudgetCoûts").Cells(65527, 3).End(xlUp).Row
    lignemax = Sheets("DonnéBudget").Cells(65527, 4).End(xlUp).Row
     
    While i <= lignemax2
        j = 1
        trouve = False
        While j <= lignemax
            If (Sheets("DonnéBudget").Cells(j, 4).Value = Sheets("BudgetCoûts").Cells(i, 3).Value) Then trouve = True
            j = j + 1
        Wend
        If (trouve = False) Then
            MsgBox "Je n'ai pas trouve " & Sheets("BudgetCoûts").Cells(i, 3).Value & " dans la feuille DonneBudget. Voir ligne " & i & " de BudgetCout"
            i = lignemax2 + 1
        Else
            i = i + 1
        End If
    Wend
    Comme j'ai rien compris dans quelle feuille était ta base de données et quelle feuille était mise à jour j'ai fait comme çà :
    Lecture ligne à ligne de la colonne 3 de la feuille BudgetCouts puis boucle sur les lignes de lacolonne 4 de la feuille DonneBudget
    Si je retrouve pas l'affaire alors je sors en indiquant le message d'erreur

    ==> j'ai supposé la base dans la feuille BudgetCout et la manuelle comme étant DonnesBudget

    Si c'est l"invers, i lte rete à réadapte un peu le code

    Sinon évite lesaccents dans les nms de feuilles, c'est toujours un peu périlleux

  3. #3
    Membre habitué
    Étudiant
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut
    merci je v éssayer ça tout de suite!!!

    En fait c'est l'inverse (il faut dire que mon explication était pas top) mais c'est pas grave je vais faire les modifs et je vous si ça fonctionne

    j'ai éssayé mais ça ne fonctionne pas!! Le msgbox me dit que l'affaire de la ligne 1 n'existe pas alors qu'elle existe
    En fait premiére ligne de donnébudget sert à me donner la dénomination de chaque colonne!
    Vu que j'ai pas tous compris à ton programme, je l'ai modifié car comme je te l'ai dit c'est donnébudget la base et non budgetcoûts, j'ai alors peut être fait une erreur en la modifiant
    de plus ça rame quand je mets en marche la macro

    Voici ton code helios77 que j'ai modifié!! Est que mes modifications sont bonnes?

    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
    Dim i, j As Integer
    Dim lignemax, lignemax2 As Long
    Dim trouve As Boolean
    i = 1
     
    lignemax2 = Sheets("BudgetCoûts").Cells(65527, 5).End(xlUp).Row
    lignemax = Sheets("DonnéBudget").Cells(65527, 2).End(xlUp).Row
     
    While i <= lignemax
        j = 1
        trouve = False
        While j <= lignemax2
            If (Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Cells(i, 3).Value) Then trouve = True
            j = j + 1
        Wend
        If (trouve = False) Then
            MsgBox "Je n'ai pas trouve " & Sheets("DonnéBudget").Cells(i, 3).Value & " dans la feuille DonneBudget. Voir ligne " & i & " de DonnéBudget"
            i = lignemax2 + 1
        Else
            i = i + 1
        End If
    Wend

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Essaie ç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
    Sub comparer()
    Set F1 = Worksheets("BudgetCoûts")
    Set F2 = Worksheets("DonnéBudget")
        lignemax = F1.Range("C1").SpecialCells(xlCellTypeLastCell).Row
     
        For i = 2 To lignemax
            LeNom = F1.Cells(i, 3)
            With F2.Range("D:D")
                        Set c = .Find(LeNom, LookIn:=xlValues)
            End With
            If Not c Is Nothing Then
                Else
                MsgBox LeNom & " manquant"
            End If
        Next
    End Sub
    A+

    PS - Et balise ton code Tu le sélectionnes, tu fais un clic sur l'icone # et c'est tout

    Edit
    Ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set F1 = Nothing
    Set F2 = Nothing
    avant End Sub

  5. #5
    Membre habitué
    Étudiant
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut
    ca rame un peu c'est normal, tu boucles sur 300 lignes pour lesquelle tu va vérifier dans 300 ou 500 ou 1000 autre lignes si elles existent
    donc tu fais lignemax * lignemax2 boucles

    Si la ligne 1 est le nom de ta colonne, initialise i et/ou j avec la ligne ou c'est censé commencé

    j'ai vu aussi que le endXlup est fait sur les colonnes 5 et 2
    Moi dans mon code, je travaille sur les colonnes 4 et 3 ==> soit j'ai raison toit tu as raison
    Mais si j'ai raison, en modifiant ton code , tu as peut être lignemax = 65536 et lignemax2 = 655536

    ==> 65536 * 655536 opérations =+> normal que çà rame

    en fait g un autre petit souci!!

    des fois j'ai dans basedonné un caractére en trop par rapport a l'onglet budgetcout!!!
    Donc avec le programme de helios le msgbox va me dire que l'affaire n'éxiste pas alors qu'elle existe

    Je sais que je peux utiliser mid(???,2) mais ça fonctionne pas avec ça!!
    Bon j'ai du mal à m'exprimer correctement donc voila ce que j'ai fait!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            If (Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Cells(i + 1, 3).Value) Then trouve = True
            j = j + 1
            If (Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Mid(Cells(i + 1, 3), 2).Value) Then trouve = True
            j = j + 1
        Wend
    ensuite c la suite de helios (en fait merci beaucoup )

    la le mid même modifier a ton format ne fonctionne pas!!

    Il y a un message d'erreur!!

    propriété ou méthode non géré par cet objet
    Si quelqu'un connais la solution !!!!!!

    excuse moi je suis vraiment une buse des fois Ton programme marche du feu de dieu et en plus ça rame pas!!!!!!

    Trop balése, je te remercie vraiment helios!!

    Chapeau et merci

    ouai je sais pas non plus, je me suis planté

    en fait g un autre petit souci!!

    des fois j'ai dans basedonné un caractére en trop par rapport a l'onglet budgetcout!!!
    Donc avec le programme de helios le msgbox va me dire que l'affaire n'éxiste pas alors qu'elle existe

    Je sais que je peux utiliser mid(???,2) mais ça fonctionne pas avec ça!!
    Bon j'ai du mal à m'exprimer correctement donc voila ce que j'ai fait!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            If (Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Cells(i + 1, 3).Value) Then trouve = True
            j = j + 1
            If (Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Mid(Cells(i + 1, 3), 2).Value) Then trouve = True
            j = j + 1
        Wend
    ensuite c la suite de helios (en fait merci beaucoup )

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 556
    Par défaut
    Pour l'utilisation de Mid
    ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If (Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Mid(Cells(i + 1, 3), 2).Value) Then trouve = True
    mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If (Sheets("BudgetCoûts").Cells(j, 4).Value = Mid(Sheets("DonnéBudget").Cells(i + 1, 3).Value),2) Then trouve = True
    tu peux aussi regrouper les 2 ligne en une seule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If ((Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Cells(i + 1, 3).Value) Or (Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Mid(Cells(i + 1, 3), 2).Value)) Then trouve = True
    j = j + 1
    dans mon code y a une parenthèse de trop après le Value
    Si tu la vires çà devrait être OK

  7. #7
    Membre habitué
    Étudiant
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut
    lequel value???
    il y en au moins 3 !!
    en fait j'ai pris la troisiéme solution des mid (celle ou il y a un Or)

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 556
    Par défaut
    Remplace la ligne ave le Or par celle-ci çà devrait aller mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If ((Sheets("BudgetCoûts").Cells(j, 4).Value = Sheets("DonnéBudget").Cells(i + 1, 3).Value) Or (Sheets("BudgetCoûts").Cells(j, 4).Value = Mid(Sheets("DonnéBudget").Cells(i + 1, 3).Value,2))) Then trouve = True
    j = j + 1

  9. #9
    Membre habitué
    Étudiant
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut
    c bon j'ai trouvé et ça marche!!!

    Je commence à me dire que tu est mon dieu du VBA

    Merci merci merci!!

    Hier j'ai passé une journé a faire mon truc qui marchait pas et toi en même pas heure tu résoud mon problème sans même voir mon fichier !!!

    Merci et bravo

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 556
    Par défaut
    merci et de rien

  11. #11
    Membre habitué
    Étudiant
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut
    dsl j'ai pas éssayer ton code ouskel'n'or car celui de helios marche bien!!!

    je suis que le tient fonctionne trés bien aussi, tu n'est pas modérateur pour rien

    Donc merci aussi pour ton aide et aussi grand merci à ce site!!

    Vous avez vraiment beaucoup aidé (vous avez sauvé mon stage ) et on peut dire que c'est super réactif

    Merci pour tous

  12. #12
    Membre habitué
    Étudiant
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Par défaut
    en fait ouksel j'ai pris ton code car plus rapide et cela ne sort pas de la boucle quand il y un msgbox!!!!

    Merci a vous 2, you are the boss

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 556
    Par défaut
    Juste pour info Gardien Du Code
    Dans le bout de code que je t'ai donné, il te suffisait de supprimer la ligne

    pour ne plus sortir de la boucle après chaque msgbox

    Personnellement, je te conseillerais plutôt de faire affciher les messages dans un fichier à part afin d'avoir les données sous la main en observant ton fichier Excel

    Il te suffit de faire ceci en repartant du code de Ouskel qui est sans doute plus rapide car il ne boucle aps sur toutes les lignes comme je le faisait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    'Mettre ceci juste au-dessous le sub Comparer
    Dim fic as string
    fic = "C:\AffairesManquantes.txt"
    Open fic for Output as #1
     
    'Ensuite, tu replaces la ligne MsgBox LeNom & " manquant" par
    print #1, LeNom & " manquant en ligne " & i 
     
    'Juste au-dessus du End Sub, tu rajoutes ceci
    Close #1
    Ainsi,tu vas écrire toutes tes erreurs dans un fchier("C:\AffairesManquantes.txt") au lieu d'avoir des msgbox s'ouvrant au fur et à mesure
    Bon Courage

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je trouve excellente l'idée d'Hélios aussi vais-je me l'approprier pour modifier mon 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
    Sub comparer()
    Dim F1 as Worksheet, F2 as Worksheet, fic as strig i as integer, LeNom
    Set F1 = Worksheets("BudgetCoûts")
    Set F2 = Worksheets("DonnéBudget")
        lignemax = F1.Range("C1").SpecialCells(xlCellTypeLastCell).Row
        fic = "C:\AffairesManquantes.txt"
     
        Open fic for Output as #1
     
        For i = 2 To lignemax
            LeNom = F1.Cells(i, 3)
            With F2.Range("D:D")
                        Set c = .Find(LeNom, LookIn:=xlValues)
            End With
            If Not c Is Nothing Then
                Else
                'Enregistrement du nom manquant selon Helios
                print #1, LeNom & " manquant en ligne " & i 
                'MsgBox LeNom & " manquant" 'on peut laisser la ligne ou la supprimer
            End If
        Next
     
        Close #1
        Set F1 = Nothing
        Set F2 = Nothing
    End Sub
    Hélios, quand tu as des bonnes idées, tu ne devrais pas les garder pour toi
    A+

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 556
    Par défaut
    Merci pour l'idée géniale Ouskel
    T'en fais pas j'hésite aps à partager mes idées
    Mea Culpa

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

Discussions similaires

  1. [XL-2010] VBA VLOOKUP comparaison 2 bases de données
    Par Tenak dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/11/2012, 15h31
  2. [VBA-E] Formatage des données à l'ouverture d'un fichier texte
    Par jmercier dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/11/2005, 17h00
  3. [VBA-E] Regroupement de données
    Par beurnoir dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/11/2005, 10h16
  4. [VBA Excel] Extraction de données
    Par tpv72 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/09/2005, 21h49
  5. [VBA]répondre automatiquement à un msgbox
    Par gromite dans le forum Général VBA
    Réponses: 11
    Dernier message: 13/01/2004, 17h37

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