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]Macro Vérification Tarif


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut [VBA-E]Macro Vérification Tarif
    Bonjour,
    J'ai actuellement un problème d'ordre général sur ce sujet :

    J'ai un fichier mensuel, qui donne la conso de chaque ligne téléphonique (1000 lignes tel)

    Ce fichier est assez lourd et représente 24 colonnes sur 10000 Lignes.

    Le but est de vérifier les tarifs erronés sur les derniers mois.
    Sur l'une des colonnes se trouve le type de facturation et je doit en vérifier 6 (sur tout le fichier il y a peu près 15 type de facturation)

    Dans ma première idée.
    Je faisais un tri auto, puis sélection Type facturation A.
    Puis la suite de la macro sélectionnait la colonne du premier mois et commençait à vérifier si le tarif du type de facturation A était bien appliqué à toute les lignes de cette colonne.
    A chaque erreur il copiait la ligne dans un autre fichier

    (Tout ceci marche actuellement)

    Mais premier problème est qu'il y a plusieurs colonnes et que donc il est possible qu'il ait plusieurs erreurs dans la même ligne mais la macro ne le vois pas et copie deux fois la ligne dans le rapport d'erreur.
    Donc j'aimerais bien éviter les doublons.

    Autre problème, la macro est très lourde et enchaîne boucle sur boucle (cf code juste dessous)
    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
     
     
    'Déclaration de la variable i et j
     
             Dim i As Integer
             Dim j As Integer
             Dim A As Variant
             Dim B As Variant
             Dim C As Variant
             Dim D As Variant
             Dim E As Variant
             Dim F As Variant
             Dim h As Integer
             Dim k As Integer
     
     
     
             Sheets("Base").Select
     
             A = Range("B2").Value
             B = Range("B3").Value
             C = Range("B4").Value
             D = Range("B5").Value
             E = Range("B6").Value
             F = Range("B7").Value
     
     
     
    For i = 3 To 15000
             Windows("Facture_ligne_mobile.xls").Activate
                If Range("D" & i).Value = "Type Facturation A" Then
                   If Range("H" & i).Value <> A Then
                         Rows(i).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If Range("A" & j).Value = Range("X65000").Value Then Range("A" & j).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
                             Next j
                End If
                End If
     
        Next i
    (La dernière partie du code est répéter 6 fois avec La Valeur de facturation qui change et le type de facturation)


    J'aimerais que la macro, fasse
    -vérification colonne H,I et J avec :
    -Type de Facturation A puis B puis C puis D puis E (Tri)
    -Paramètre le tarif A A puis B puis C puis D puis E
    Et quand il détecte une erreur il finit la vérification de la ligne complète (3 colonnes) puis s'il y a une erreur ou plusieurs de copier cette ligne dans un autre fichier.

    Merci d'avance pour vôtre aide

  2. #2
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 3 To 15000
             Windows("Facture_ligne_mobile.xls").Activate
                If Range("D" & i).Value = "Type Facturation A" Then
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                   If Range("H" & i).Value <> A Then
                         Rows(i).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If Range("A" & j).Value = Range("X65000").Value Then Range("A" & j).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
    Comment marche les else ? ,
    Car là :
    Si erreur en H il copie et sort de la boucle,
    J'aimerais bien qu'il fasse a la suite
    ==> sinon il vérifie I, si erreur, il copie et sort de la boucle, sinon il vérifie J, etc ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
                             Next j
                End If
                End If
     
        Next i

  3. #3
    Membre confirmé Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Par défaut
    tu peu emboiter un if dans un else tiens par exemple un bou de code d'une macro quelconque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (a=3) then
       range("A1").value = 5
       else
             if (a=3) then
                  range("A1").value = 6
             else 
                   if (a=4) then
                        range("A1").value = 7
                   end if
             end if
    end if

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    En adaptant ceci, j'ai réussi à avoir un résultat plutôt satisfaisant.

    Sinon je voudrais faire une macro qui aurait plusieurs condition dans le IF et permettrait de colorier les cases en rouges ou bleu (selon les cases erronés ou pas, car sur une ligne certaines cases sont correct)

    Un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If range("b"&i).value= 6 or 12 or 10 then
    'selectionne et en bleu
    ....

  5. #5
    Membre confirmé Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Par défaut
    pour mettre plusieur conditions dans le if tu peux par exemple un bout d'une de mes macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If (text <> "Grand Total" And Sheets("Table pivot").Range("A1").Value <> vide) Then
    ainsi tu peux voir que les condition sont séparés par des and ou des or.

    pour colorier le font d'une case on prendra la case A1, en violet par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With (range("A1").Interior)
             .ColorIndex = 39
             .Pattern = xlSolid
    End With
    voilà d'autre question?

  6. #6
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    J'avais essayé avec les or et And mais ca me faisait un résultat assez bizzare.
    Mais je vais retenter.

  7. #7
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    Voilà une partie du 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
    If Range("D" & i).Value = "Abonnement Jumelle" Then
     
                   If Range("H" & i).Value <> B Then
                         Rows(i).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If Range("A" & j).Value = Range("X65000").Value Then Range("A" & j).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
                             Next j
                    Else
                            If Range("I" & i).Value <> B Then
                         Rows(i).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If Range("A" & j).Value = Range("X65000").Value Then Range("A" & j).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
                             Next j
     
                             Else
     
                             If Range("J" & i).Value <> B Then
                         Rows(i).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If Range("A" & j).Value = Range("X65000").Value Then Range("A" & j).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
                             Next j
     
                End If
                End If
                End If
     
     
     
     
     
        Else
    ...........
    J'aimerais bien lui dire qu'il vérifie de la colonne m a z (par exemple) sans avoir a rajouter des boucles (en gros faire une boucle qu'il répète pour les colonnes désirées)

    Un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ' Au lieu de mettre H :
     If Range("M:Z" & i).Value <> B Then
    'Mais je sais pas si ça marcherait reelement et si surtout il fera bien chaque case une par une puis changement de colonne
                         Rows(i).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If Range("A" & j).Value = Range("X65000").Value Then Range("A" & j).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
                             Next j

  8. #8
    Membre confirmé Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Par défaut
    j'ai une ptite idée, tu pourrais faire ta boucle dans une fonction qui prendrait en paramétre la colonne a tester pui ensuite tu fais appel a ta procédure quand tu en as besoin. ca t'evite de répeté le code.
    tu pourrais ainsi faire un truc du genre:

    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
     
    sub recursif(dim ligne as integer,dim colonne as integer)
    If cells(ligne,colonne).Value <> B Then
                         Rows(ligne).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If cells(j,colonne).Value = Range("X65000").Value Then cells(j,colonne).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
                             Next j
     
                             Else
     
                             If cells(ligne,colonne+1).Value <> B Then
                         Rows(ligne).Copy
                         Windows("verif_mobile.xls").Activate
                         Sheets("Rapport").Select
                             For j = 3 To 15000
                                 If cells(j,colonne).Value = Range("X65000").Value Then cells(j,colonne).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                 :=False, Transpose:=False: Exit For
                             Next j
     
                           else
                                       recursif(ligne,colonne+1)
    end sub
    ensuite dans ton code tu fais appel a recursif enfin le code si dessus n'est pas propre dans la syntaxe mais c pour te donner une ptite idée de départ
    je pense que par du récursif tu pourrais faire ce que tu souhaite.

  9. #9
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    Avec cette methode il va parcourir toute les colonnes et moi je veux qu'il fasse juste certaine colonne ( H I J M O Y V par exemple)
    Il est pas possible de lui dire tout simplement, fait ça pour colonne H I J etc ... ?

  10. #10
    Membre confirmé Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Par défaut
    ben en fait en francais tu ve faire koi?
    tu ve vérifier uniquement dans la colonne D la valeur puis ensuite tu vérifie les colonnes H,I et J dans cet ordre?

    essaye de m'expliquer plus clairement ce que tu ve, ton raisonnement.

  11. #11
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    Mon raisonnement :
    La macro parcours la colonne type de Facturation.
    Dés qu'il trouve un type de Facturation A, B, C, D , E, ou F
    Il récupère le numéro de la ligne et commence le traitement.
    S'il s'agit d'un type de Facturation A il vérifie (sur cette ligne):
    Si les colonnes de facturation des derniers mois sont bien au bon tarif A
    S'il s'agit d'un type de Facturation B il vérifie :
    Si les colonnes de facturation des derniers mois sont bien au bon tarif B
    Etc. ...

    La macro permet de faire une vérification du coût de chaque lignes et repérer les lignes facturés 180 € au lieu de 6€.
    En clair, ça permettra de ne pas passer 2 jours à regarder ou sont les erreurs parmi les 15000 lignes du fichier.

    C'est plus clair maintenant ?

  12. #12
    Membre confirmé Avatar de biggione
    Inscrit en
    Juillet 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 99
    Par défaut
    ok donc pour chaque ligne tu regarde la case de la colonne A puis après tu test les colonnes H,I et J.
    ok je vois donc ce qu tu voudrai ca seré de retrouver tous ces chiffres pour les remplacer.
    au lieu d'une recherche par boucle et par traitement pk ne pas ecrire une macro qui trouve grace a la fonction find les valeurs que tu veux et puis les remplace par celle souhaitée?

    avec find lancer sur chaque colonne où pourrait se trouver des erreurs, tu éviterai ainsi les boucles dans les boucles dans les boucles....

  13. #13
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    Le but est surtout de faire un mini rapport avec toutes les valeurs erronées et après, allez raller chez France Telecom
    "Pourquoi la ligne d'un tel, est facturée 25 € au lieu de 12 ?"

  14. #14
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    Ca n'existe pas une fonction de ce genre ?

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    soit fv fonction de verification
    si and(fv(ax)=fv(hx),fv(ax)=fv(hx),fv(ax)=fv(gx),...)
    alors tout est correct
    sinon je recopie ma ligne et je colorise mon erreur
    fin si

    avec 6 valeurs on remplacera avantageusement
    fv(ax) par une variable booléenne=fv(ax)

  16. #16
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    si and(fv(ax)=fv(hx),fv(ax)=fv(hx),fv(ax)=fv(gx),...)
    J'essaye de comprendre le raisonement mais j'ai du louper un coche.
    Tu pourrais mettre des commentaires pour que je comprenne un peu mieux (j'ai un peu de mal désolé)
    merci d'avance.

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    soit ta procedure de verif d'une colonne
    si la colonne est ok elle renvoie vrai
    sinon faux

    si tu fais and(verif(colonnen),...verif(colonneX)) tu sauras si l'enseble est juste

  18. #18
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    Ok, je vais regarder ça
    Merci

  19. #19
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Par défaut
    J'ai trouvé une solution autre.

    Merci encore de vôtre aide.

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

Discussions similaires

  1. [VBA-E] Macro automatique ouverture Excel
    Par P50 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/04/2006, 12h42
  2. [VBA-E] Macro introuvable
    Par Persons dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/04/2006, 11h12
  3. [VBA] Excel + macro + aléatoire
    Par spopo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/01/2006, 16h42
  4. [VBA-E] macro conversion excel vers csv
    Par baboune dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/07/2004, 10h23
  5. [VBA-E] Macro ouverture fichier déja ouvert
    Par bhaal76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 15h30

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