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 :

Soustraire les qtés en trouvant d'abord les mêmes items dans deux colonnes


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Soustraire les qtés en trouvant d'abord les mêmes items dans deux colonnes
    Bonjour à tous,

    Cette macro est fonctionnelle mais évidemment très lente.

    Existe-t-il une autre façon de procéder ?

    (4 colonnes : La première = séquence; la deuxième = qté; la troisième = séquence; la quatrième = qté -> Le but étant de trouver les mêmes référence dans les colonnes 1 et 3 et de soustraire leur quantité respectives. Ensuite on colle la référence en colonne 6 avec le résultat de la soustraction en colonne 7)

    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
    Sub reper_idem_soustraction()  
        Application.ScreenUpdating = False
        dernLigne = ActiveCell.SpecialCells(xlLastCell).Row
        Dim Plage As Range
        i = 1
        Do While (i < 2350)
            j = 1
            t = 0
            Do While (j < 1663 And t = 0)
                If (Range("A" & i).Value = Range("C" & j).Value) Then
                    Range("F" & i).Value = Range("A" & i).Value
                    Range("G" & i).Value = Range("B" & i).Value - Range("D" & j).Value
                    t = 1
                End If
                j = j + 1
            Loop
            i = i + 1
        Loop
        Application.ScreenUpdating = True
    End Sub
    Merci !

  2. #2
    Membre régulier Avatar de a.dequidt
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 77
    Points
    77
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim max As Integer
    Dim i As Integer
    max = ActiveCell.SpecialCells(xlLastCell).Row
    For i = 1 To max
        If Cells(i, 1).Value = Cells(i, 3).Value Then
            Cells(i, 6).Value = Cells(i, 1).Value
            If Cells(i, 2).Value > Cells(i, 4).Value Then
                Cells(i, 7).Value = Cells(i, 2).Value - Cells(i, 4).Value
            Else
                Cells(i, 7).Value = Cells(i, 4).Value - Cells(i, 2).Value
            End If
        End If
    Next i
    tu testes tu dis
    Aurore //Gold Fish Memory Girl

  3. #3
    Membre actif Avatar de Drost
    Profil pro
    Inscrit en
    Août 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 192
    Points : 212
    Points
    212
    Par défaut
    Hello,

    En fait tu souhaites soustraires deux quantités lorsques deux références sont identiques et d'en coller le résultat avec la référence dans d'autre colonne?

    Je te propose de passer par des tableaux croisés dynamiques (un pour chacune des deux variables). tu pourra alors via une recherchev alors faire ta soustraction, il te faudra cependant que tu liste d'abord toutes tes références...

    Je ne sais pas si cela sera plus rapide que ta macro mais ca vaut peut etre la peine d'essayer!

    PS : N'oublie pas d'enlever la fonction de calcul automatique^^

    Tchuss
    "S'il n'y a pas de solutions à un problème, c'est qu'il n'y a pas de problème!"



    ++]===> Drost

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut
    Existe-t-il une autre façon de procéder ?
    Bien sur, t'es sur Excel !

    Comme tu ne donnes pas beaucoup d'infos, c'est dur de trouver un meilleur code !
    Mais déjà, une remarque : à quoi peu bien te servir dernLigne ? C'est bien de trouver la dernière ligne utilisée dans ta feuille, mais c'est mieux de l'utiliser !

    Comme je ne connais pas le contenu des colonnes, un peu de logique : si tu as X fois la même valeurs dans A, tu ôteras X fois la valeur correspondant à la première référence trouvée en C. C'est bien le but ?

    Ton idée de T1 est pas mal mais : A1=C1 => j'inscrit une ligne en F1/G1, je mets T1=1 et je fais 1662 test qui seront faux, puisque T1<>0 ?!?



    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
    Sub reper_idem_soustraction()  
    dim i as long
    dim j as long
        Application.ScreenUpdating = False
        i = 1
        Do While (i < 2350) or (i<[A65536].end(xlup).row)
            j = 1
            Do While (j < 1663) or (j<[C65536].end(xlup).row)
                If (Range("A" & i).Value = Range("C" & j).Value) Then
                    Range("F" & i).Value = Range("A" & i).Value
                    Range("G" & i).Value = Range("B" & i).Value - Range("D" & j).Value
                    exit Do
                End If
                j = j + 1
            Loop
            i = i + 1
        Loop
        Application.ScreenUpdating = True
    End Sub
    I et J sont limités soit par la valeur donnée (2350 et 1663) soit par la fin des valeurs de la colonne (A et C)
    Si on rencontre une valeur identique à A en C, on s'occupe de F et G et on passe à A suivant
    Par contre, si j'ai 2 fois la même valeur en C, la seconde ne sera jamais traitée
    A+
    EDIT : y'en a qui ont profité de ma lenteur pour répondre. Mais je reviendrai et ma réponse sera la plus rapide.
    L'histoire de passer par des formules est une bonne idée.
    Pour la recherche en C, le passage par un .Find serait plus rapide, mais j'ai préféré rester sur du code connu.

    P'tite vengeance pour m'avoir grillé :
    Aurore : tu ne testes que l'égalité entre A et C de la même ligne ? Plus rapide, mais moins utiles yerk, yerk, yerk
    Plus dur de jongler avec cells pour ne pas faire d'erreur de numéro de colonne => Je préfère utiliser Range

    Drost :
    F1 : =SI(OU(ESTNA(RECHERCHEV(A1;$C$1:$D$1663;1;0));A1="");"";A1)
    G1 : =SI(F1="";"";B1-RECHERCHEV(A1;$C$1:$D$1663;2;0))
    à recopier jusqu'à la ligne 2350

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Aurore, comme l'a dit Gorfael, avec ta fonction c'est plus rapide mais moins utile et surtout on n'arrivera pas au résultat escompté.

    Pour Gorfael, j'ai oublié de dire qu'il n'y aura jamais de doublons en C, donc pas de souci.

    Pour le coup de la dernière ligne, je l'ai utilisée dans la fonction à un moment et puis plus et j'ai zappé de virer l'instruction

    Sinon, merci pour le , mais cela revient en même que mon t qui devient 1, car quand t devient 1, on sort de la boucle (et on ne fait pas x tests faux )

    Donc résultat, le temps pris par cette macro est toujours aussi long pour le moment...

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut
    C'est vrai (bien la peine de me moquer d'Aurore : je suis pas mieux)
    J'utilise jamais While, et donc, j'ai mal analysé l'instruction . Mais à quoi ça me sert d'être bête si je ne le montre pas, hein !
    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 reper_idem_soustraction()
    Dim i As Long
    Dim Cel As Range
        Application.ScreenUpdating = False
        i = 1
        Do While (i < 2350) Or (i < [A65536].End(xlUp).Row)
            Set Cel = Range([C1], [C65536].End(xlUp)).Find(Range("A" & i), LookIn:=xlValues)
            If Not (Cel Is Nothing) Then
                Range("F" & i) = Range("A" & i)
                Range("G" & i) = Range("B" & i) - Cel.Offset(0, 1)
            End If
            i = i + 1
        Loop
        Application.ScreenUpdating = True
    End Sub
    devrait être un peu plus rapide
    A+

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    En effet !

    Merci à toi

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

Discussions similaires

  1. [11g] Extraire les x et y d'une géométrie de point dans une colonne
    Par bernards111 dans le forum Débuter
    Réponses: 1
    Dernier message: 11/12/2014, 13h13
  2. Réponses: 11
    Dernier message: 21/11/2014, 18h50
  3. [XL-2007] Petite question sur les boucles et deux series de checkbox dans deux colonnes
    Par scoubi77 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/09/2014, 23h48
  4. Comment afficher d'abord les sujets étiqueté ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 16h14

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