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 :

RECHERHEV, VLOOKUP que faire


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Points : 67
    Points
    67
    Par défaut RECHERHEV, VLOOKUP que faire
    Bonjour, Je lance mon deuxième post car après de multiple recherche je ne trouve pas quelque chose qui s’apparente a mon cas.
    Cependant je penses que ce type de code doit déjà exister et peut intéresser pas mal de personne.
    Je ne suis pas une bête en VBA, mais j'essaye de me débrouiller.

    VOici mon problème :

    J'ai un classeur dans lequel j'ai une Feuil avec les stocks, une autre avec les entrées et une autres avec les sorties.
    Sur une autre Feuil Analyse ou il y a toutes les références existantes, je voudrais regroupé dans une colonne les entrées, dans une autres les sorties et une autres les stocks. Je voudrais de façon automatique que une macro aille me chercher les quantités de chaque référence qu'elle va trouvée (par exemple pour le stock dans la feuil stock), puis me les recopier dans ma Feuil analyse dans la colonne stock. Pour les références qui ne figure pas dans la feuil stock je veux mettre 0 par défaut.
    J’espère avoir été assez clair, mais c'étais pas facile a expliquer ...Classeur1-données stock.xls

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 960
    Points : 28 970
    Points
    28 970
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    S'il s'agit de dénombrer les sorties et entrées de stock, la fonction SOMMEPROD me semble plus adéquate.
    Une feuille avec le stock, une feuille avec les mouvements de stocks ensuite des feuilles pour répartir les sorties et entrées de stocks par mois
    Fichiers attachés Fichiers attachés

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Points : 67
    Points
    67
    Par défaut
    En fait je voulais juste que la macro aille chercher les quantités des différentes catégories dans les différentes feuille et les reporter dans la feuille analyse ! Pour les références où il ne trouve pas de référence il met 0.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 960
    Points : 28 970
    Points
    28 970
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne comprends pas ta demande. Dans le classeur que j'ai déposé, il n'y a aucune ligne de code en VBA tout est effectué avec des fonctions natives d'excel.
    Le même résultat pourrait être obtenu avec un tableau croisé dynamique.
    Pourquoi absolument utiliser du VBA ?

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Points : 67
    Points
    67
    Par défaut
    Bonjour philippe, Je sais bien évidement que avec un TCD tout fonctionnerais le problème étant que les actions que je veux faire rentre dans une sous partie d'un macro que je suis entrain d'éditer. Donc ca serait dommage de tout bloqué pour éffectué un TCD et reprendre la macro après! C'est pour cela que j'aurais besoin de faire ces actions !

    Voila ce que j'ai commencé a faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Analyse()
     
    Sheets("Analyse").Select
    Range("B:B" & derlig).Formula = "=VLOOKUP(A:A,Stock !" & Range("A:B").Address(ReferenceStyle:=xlR1C1) & ",2,FALSE)"
     
    End Sub
    ET j'ai l'erreur 1004 : Erreur définit par l'application ou par l'objet

    Quelqu'un aurait une idée ?

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 960
    Points : 28 970
    Points
    28 970
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sans avoir testé il me semble que ton problème vient de là Range("B:B" & derlig)? cela équivaut à par exemple B:B100 si derlig = 100
    B1:B100 serait mieux non ?
    et il y a peut-être d'autres problèmes

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Points : 67
    Points
    67
    Par défaut
    Finalement je suis partit sur ca :

    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
    Sub Analys_1()
     
    Dim Plage As Range, C As Range, Teste
    With Sheets("Analyse")
        Set Plage = .Range(.[A:B], .Cells(.Rows.Count, 1).End(xlUp))
    End With
    With Sheets("STOCK")
        For Each C In Plage
            Teste = Application.VLookup(C.Value, .Range(.[A:B], .Cells(.Rows.Count, 1).End(xlUp)), 2, 0)
            If IsError(Teste) Then
                C.Offset(, 1) = 0
            Else
            C.Offset(, 1) = Application.VLookup(C.Value, .Range(.[A:B], .Cells(.Rows.Count, 1).End(xlUp)), 2, 0)
            End If
        Next C
    End With
     
    End Sub
    Cependant quand je la lance, j'ai des données qui s'écrivent dans la colonne B (celles que je recherche), cela marche très bien. Par contre j'ai des zéro qui se mettent ma colonne C je ne comprend pas pourquoi ??
    De plus la macro est très longue car elle traite toutes les lignes jusqu'a "la fin du classeur". N'y aurait il pas moyen de la stopper a une telle ligne ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Essaie ta macro modifiée :

    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
    Sub Analys_1()
     
    Dim Plage As Range, C As Range, Teste
    Dim Plage2 As Range, X As Range
    With Sheets("Analyse")
    Set Plage = .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
    End With
    With Sheets("STOCK")
        .[B:B].ClearContents
        Set Plage2 = .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
        For Each C In Plage
            For Each X In Plage2
                If X.Value = C.Value Then
                    C.Offset(, 1).Value = C.Offset(, 1).Value + X.Offset(, 1).Value
                End If
            Next X
        Next C
    End With
    With Sheets("Entrées")
        .[C:C].ClearContents
        Set Plage2 = .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
        For Each C In Plage
            For Each X In Plage2
                If X.Value = C.Value Then
                    C.Offset(, 1).Value = C.Offset(, 1).Value + X.Offset(, 1).Value
                End If
            Next X
        Next C
    End With
    With Sheets("Sorties")
        .[D:D].ClearContents
        Set Plage2 = .Range(.[A4], .Cells(.Rows.Count, 1).End(xlUp))
        For Each C In Plage
            For Each X In Plage2
                If X.Value = C.Value Then
                    C.Offset(, 1).Value = C.Offset(, 1).Value + X.Offset(, 1).Value
                End If
            Next X
        Next C
    End With
    End Sub
    On gagnerait en rapidité d'exécution en utilisant des variables tableau mais je pense que tu aurais du mal à en comprendre le fonctionnement.

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 960
    Points : 28 970
    Points
    28 970
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour écrire une formule en VBA, il faut d'abord l'écrire et la tester manuellement.
    Je te conseille la lecture de ces deux billets Ecrire une formule dans Excel à l'aide d'une procédure VBA et Ecrire une formule dans Excel à l'aide d'une procédure VBA (Part 2)

    Il y a bien entendu, la solution proposée par Daniel que je salue au passage.

  10. #10
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Points : 67
    Points
    67
    Par défaut
    Salut Daniel,

    Merci beaucoup pour la macro, je l'ai essayé mais elle ne fonctionne pas. Elle me met des valeur en colonne B mais certaine non et les valeurs sont erronés. J'ai essayé de chercher pourquoi car je n'ai pas de message de débogage. Je te mets le résultat en PJ.Classeur1-données stock.xls

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Au temps pour moi :

    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
    Sub Analys_1()
     
    Dim Plage As Range, C As Range, Teste
    Dim Plage2 As Range, X As Range
    With Sheets("Analyse")
    Set Plage = .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
    End With
    With Sheets("STOCK")
        .[B:B].ClearContents
        Set Plage2 = .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
        For Each C In Plage
            For Each X In Plage2
                If X.Value = C.Value Then
                    C.Offset(, 1).Value = C.Offset(, 1).Value + X.Offset(, 1).Value
                End If
            Next X
        Next C
    End With
    With Sheets("Entrées")
        .[C:C].ClearContents
        Set Plage2 = .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
        For Each C In Plage
            For Each X In Plage2
                If X.Value = C.Value Then
                    C.Offset(, 2).Value = C.Offset(, 2).Value + X.Offset(, 1).Value
                End If
            Next X
        Next C
    End With
    With Sheets("Sorties")
        .[D:D].ClearContents
        Set Plage2 = .Range(.[A4], .Cells(.Rows.Count, 1).End(xlUp))
        For Each C In Plage
            For Each X In Plage2
                If X.Value = C.Value Then
                    C.Offset(, 3).Value = C.Offset(, 3).Value + X.Offset(, 1).Value
                End If
            Next X
        Next C
    End With
    End Sub

Discussions similaires

  1. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 12h28
  2. Après l'initrd, que faire ?
    Par Michaël dans le forum Administration système
    Réponses: 10
    Dernier message: 02/09/2004, 18h02
  3. [Q] que faire quand un plugin n'apparait pas dans eclipse
    Par zolive dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/08/2004, 23h38
  4. [DirectDraw] Que faire pour optimiser le rendu ???
    Par mat.M dans le forum DirectX
    Réponses: 8
    Dernier message: 12/12/2003, 18h02
  5. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39

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