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 :

Lire donné dans table/Parcourir la table/Faire des sommes/écrire dans une autre colonne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut Lire donné dans table/Parcourir la table/Faire des sommes/écrire dans une autre colonne
    Bonjour à tous,

    je post car on me demande de réaliser quelques chose que je ne connais pas du tout au travail et j'aurais besoin d'un petit peu d'aide, personne dans mon équipe ne s'y connait. alors si une âme courageuse pouvait me donner un coup de main j'en serais content !

    J'ai mis en pièce jointe la structure des données que j'ai.

    Voila mon problème, j'extrais des données d'une DB que j'exporte sous excel. Je dois ensuite faire le traitement suivant via un bouton et donc du vba derrière.

    je dois faire la somme de la colonne F pour chaque triplette colH/colI/colN et comparer cette somme aux valeurs de colP pour cette triplette. si il existe une ligne avec colH/colI/colN où colP = la somme alors c'est OK, si ce n'est pas le cas on écrit dans une autre feuille une ligne avec colH/colI/KO

    Dans l'exemple on a donc

    triplettes :
    4500305121/20/5107559238 somme = 4
    4500305121/20/5107548629 somme = 4

    val colP :
    4500305121/20/5107559238 = 2
    4500305121/20/5107548629 = 4

    donc la tout va bien.

    si on avait
    val colP :
    4500305121/20/5107559238 = 2
    4500305121/20/5107548629 = 3

    alors on aurait écrit dans la feuille suivante une ligne avec :
    4500305121/20/KO

    J’espère que c'est compréhensible :/
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    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
    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
    Sub Analyze()
    Dim LastLig As Long, i As Long, n As Long
    Dim MonDico As Object
    Dim Cle As String
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        With Range("S1:S" & LastLig)
            .Formula = "=H1 &""|"" & I1 &""|"" &N1"
            .Value = .Value
        End With
        Set MonDico = CreateObject("scripting.dictionary")
        For i = 1 To LastLig
            Cle = .Range("S" & i).Value
            If Not MonDico.Exists(Cle) Then MonDico.Add Cle, Cle
        Next i
    End With
    n = MonDico.Count
    If n > 0 Then
        With Worksheets("Feuil2")
            .UsedRange.Clear
            With .Range("A1").Resize(n, 1)
                .Value = Application.Transpose(MonDico.items)
                Set MonDico = Nothing
                With .Offset(0, 3)
                    .Formula = "=SUMPRODUCT((Feuil1!S1:S" & LastLig & "=A1)*Feuil1!K1:K" & LastLig & ")"
                    .Value = .Value
                End With
                With .Offset(0, 4)
                    .Formula = "=SUMPRODUCT((Feuil1!S1:S" & LastLig & "=A1)*Feuil1!P1:P" & LastLig & ")"
                    .Value = .Value
                End With
                With .Offset(0, 5)
                    .Formula = "=IF(D1=E1,""OK"",""KO"")"
                    .Value = .Value
                End With
                Application.DisplayAlerts = False
                .TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, Other:=True, OtherChar:="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1))
                Application.DisplayAlerts = True
            End With
        End With
    End If
    Worksheets("Feuil1").Range("S1:S" & LastLig).ClearContents
    End Sub

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Merci infiniment, c'est presque bon.

    Effectivement dans le cas de l'exemple je ne devrais pas avoir de ligne en KO écrite dans la feuil2 car on a :

    triplettes :
    somme des valeurs de la colonne F pour 4500305121/20/5107559238 = 4
    somme des valeurs de la colonne F pour 4500305121/20/5107548629 = 4

    Dans la colonne P pour 4500305121/20/5107559238 on a = 2
    Dans la colonne P pour 4500305121/20/5107548629 on a = 4

    (pour la colonne P on fait pas de somme, c'est une valeur unique pour chaque triplette)

    On a donc bien une valeur dans la colonne P égale à la somme ( 4 ) donc il n'y a pas d'erreurs et donc pas besoin d'écrire une ligne en feuill 2.

    Merci encore pour le code en tout cas c'est trés sympa de ta part !

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    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
    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
    Sub Analyze()
    Dim LastLig As Long, i As Long, n As Long
    Dim MonDico As Object
    Dim Cle As String
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        With .Range("S1:S" & LastLig)
            .Formula = "=H1 &""|"" & I1 &""|"" &N1"
            .Value = .Value
        End With
        Set MonDico = CreateObject("scripting.dictionary")
        For i = 1 To LastLig
            Cle = .Range("S" & i).Value
            If Not MonDico.Exists(Cle) Then MonDico.Add Cle, Cle
        Next i
    End With
    n = MonDico.Count
    If n > 0 Then
        With Worksheets("Feuil2")
            .UsedRange.Clear
            With .Range("A1").Resize(n, 1)
                .Value = Application.Transpose(MonDico.items)
                Set MonDico = Nothing
                With .Offset(0, 3)
                    .Formula = "=SUMPRODUCT((Feuil1!S1:S" & LastLig & "=A1)*Feuil1!K1:K" & LastLig & ")"
                    .Value = .Value
                End With
                With .Offset(0, 4)
                    .Formula = "=INDEX(Feuil1!P1:P" & LastLig & ",MATCH(A1,Feuil1!S1:S" & LastLig & ",0))"
                    .Value = .Value
                End With
                With .Offset(0, 5)
                    .Formula = "=IF(D1=E1,""OK"",""KO"")"
                    .Value = .Value
                End With
                Application.DisplayAlerts = False
                .TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, Other:=True, OtherChar:="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1))
                Application.DisplayAlerts = True
            End With
        End With
    End If
    Worksheets("Feuil1").Range("S1:S" & LastLig).ClearContents
    End Sub

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    c'est PRESQUE bon, j'arrive à faire apparaitre :

    4500305121 20 5107548629 4 4 OK
    4500305121 20 5107559238 4 2 KO

    J'aimerai faire apparaitre uniquement :

    4500305121 20 OK


    effectivement la condition pour le OK est qu'au moins une des lignes avec 4500305121/20 possède une valeur dans la colonne P égale à la somme.

    Encore merci...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    J'imagine que la modification est à faire sur le :

    .Formula = "=IF(D1=E1,""OK"",""KO"")"

    dans notre exemple on a :

    4500305121 20 5107548629 4 4 OK
    4500305121 20 5107559238 4 2 KO

    Il suffit qu'il y ait un seul OK pour que tout le couple 4500305121 20 soit considéré comme OK.

    Si par contre il n'y avait que des KO comme :

    4500305121 20 5107548629 4 3 KO
    4500305121 20 5107559238 4 2 KO

    alors on aurait comme résultat :
    4500305121 20 KO

    C'est lourd comme modif ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/10/2013, 15h35
  2. faire des sommes de colonnes de plusieurs tables
    Par davidovski dans le forum Requêtes
    Réponses: 3
    Dernier message: 31/08/2012, 12h12
  3. Réponses: 0
    Dernier message: 15/09/2009, 10h56
  4. Réponses: 1
    Dernier message: 02/06/2006, 13h51
  5. [VRML] Faire des trous ronds dans une table.
    Par yoyo910 dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 22/03/2006, 17h56

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