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 :

Variable Tableau pour Expert [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Par défaut Variable Tableau pour Expert
    Bonjour à tous,
    Chèrs Experts de Array, Je demande votre aide grandement appréciée!
    d'abord j'aimerais dire au débutants qui commencerait à me suggérer des fonctions Excel du genre RechercheV, de garder leurs suggestions .
    Ensuite J'ai déjà fait ce même (à peu près avec des boucles un peu boiteuses) mais celà a rendu le travail trop lourd.
    J'aimerais aussi dire que ceci est seulement un exemple. Mon vrai travail contient des milliers de données (pas loin de 650 000 lignes) c'est ce qui a rendu l'exécution des boucles super longues.

    J'ai scruté ce lien, mais je crois que c'est trop avancé pour mon niveau débutant VBA.

    http://didier-gonard.developpez.com/...s-tableau-vba/

    Voici ce que j'aimerais faire:

    1) dans mon onglet Données, Je parcours mes cellules de la cellules 2 à la fin de la colonne A.

    1.1) ma première cellule a la valeur "A1-A3"
    1.2) je vais dans la mon tableau d'instruction qui se trouve dans l'onglet "Instruction".
    1.3) Je cherche la ligne qui correspond à mon "A1-A3" dans mon Range (Cells(3,1),cells(26,5))
    1.4) c'est la ligne 8 qui correspond à mon "A1-A3" (en Conactenant A et 1 et - et A et 3)
    1.5) je parcours la ligne 8 (qui correspond à la ligne du "A1-A3"),
    1,6) Je prend la valeur de la première cellule qui n'est pas vide (J'en ai 3 dans la ligne 8, la première "3" à la cellule H5, la deuxième "-2" à la cellule N5, et la troisième "-1" à la cellule R5)

    1.6.1) J’additionne ma première valeur que j'ai trouvé (3) à la cellule qui s'appelle Toto dans chacune des feuil1-2-3-4, Le "toto" je l'ai pris à la valeur de la cellule de la ligne 2 correspondante dans mon tableau d,Instruction à la première valeur trouvée dans la ligne 8.
    1.6.2) J’additionne ma deuxième valeur que je trouve (-2) à la cellule qui s'appelle "SASO" dans chacune des feuil1-2-3-4, le "SASO" je l'ai pris à la valeur de la cellule de la ligne 2 correspondante à la deuxième valeur trouvé sur ma ligne 8.
    ...
    ...Etc.

    2.1) ma deuxième cellule a la valeur "A1-B2"
    ...
    ...ETC.

    D'ou ma conclusion, je pense que la meilleure façon de le faire est avec Array!
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut tableau
    Salut

    j'ai prit le temps de regarder ton fichier joint et j'avoue ne pas tout avoir tout compris. Tu dis
    1.3) Je cherche la ligne qui correspond à mon "A1-A3" dans mon Range (Cells(3,1),cells(26,5))
    1.4) c'est la ligne 8 qui correspond à mon "A1-A2" (en Conactenant A et 1 et - et A et 3)
    à mon avis tu t'es melanger avec ton A1-A3 et A1-A2 se qui nous aide pas à comprendre.

    ceci dis tu n'es pas obliger de passer par array car tu peux utiliser des variables de type tableau
    Exemple 1 tableau a 1 dimention de 7 cases
    Dim (ou public) Tablo1( 1 to 7) ou Tablo1(6) <- là l'indice 0 compte

    1 tableau à 2 dimentions
    Dim " " Tablo2 (1 to 7, 1 to 10)

    Mais je pense que malgres ton travail en memoire pour aller plus vite tes 650 000 c'est trop lourd pour Excel perseonnellement je passerais en access surtout si ta combinaison A1-A3 est unique ton gain de temps sera énorme

    A plus

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Par défaut
    Tout à fait c'est A1-A3.
    J'aurais aimé essayer Access, le problème c'est que je n'ai y jamais touché donc le temps d'apprendre et de le faire ne rentre pas dans les délais de temps.
    Merci.

  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
    J'ai 2 questions par rapport à ton fichier exemple
    1. Est ce que dans ta Feuille Instruction, les colonnes de données sont fixes (de H à S) ou peuvent varier au delà ou en deça de la colonne S?
    2. Est ce que tu as seulement les quatre feuilles Feuil2..Feuil5 ou tu peux avoir plusieurs autres feuilles et si les données de ces feuilles sont toujours en colonnes G-H?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Par défaut
    1. OUi les colonne des données sont fixes.

    2. Je peux en avoir de 1 à n feuilles (donc variables) mais les données dans ces feuilles sont fixes (toujours G-H).

    Merci.

  6. #6
    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
    Essaies ce code (testé sur le fichier exemple que tu as joint)
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    Option Explicit
    Const Donnees As String = "Données"
    Const Instruction As String = "Instruction"
     
    Sub Traitement()
    Dim NTrai As Long, NData As Long, i As Long, j As Long
    Dim Tmp() As String, Code As String
    Dim Res, Rech, Data, LesDonnees
    Dim Cpt As Double
    Dim n As Integer
     
    Application.ScreenUpdating = False
    With Worksheets(Donnees)
        NTrai = .Cells(.Rows.Count, 1).End(xlUp).Row
        .Range("B2:B" & NTrai).ClearContents
        Res = .Range("A2:B" & NTrai)
    End With
     
    With Worksheets(Instruction)
        NData = .Cells(.Rows.Count, 1).End(xlUp).Row
        Rech = .Range("A2:E" & NData)
        Data = .Range("H2:S" & NData)
    End With
     
    ReDim Tmp(1 To NData - 1)
    For i = 1 To NData - 1
        Tmp(i) = Rech(i, 1) & Rech(i, 2) & Rech(i, 3) & Rech(i, 4) & Rech(i, 5)
    Next i
     
    LesDonnees = RempliData(Data)
     
    For j = 1 To NTrai - 1
        Code = Res(j, 1)
        For i = 1 To NData - 1
            If Code = Tmp(i) Then
                For n = 1 To UBound(Data, 2)
                    If Trim(Data(i, n)) <> "" Then Cpt = Cpt + Val(Data(i, n)) + LesDonnees(n, 2)
                Next n
                Exit For
            End If
        Next i
        Res(j, 2) = Cpt
        Cpt = 0
    Next j
    Worksheets(Donnees).Range("A2:B" & NTrai) = Res
    End Sub
     
    '---------------------------------------
    Private Function RempliData(ByVal Tmp)
    Dim i As Integer, j As Integer, LastLig As Integer
    Dim Tb(), Tablo
    Dim Ws As Worksheet
    Dim Pers As String
     
    Application.ScreenUpdating = False
    ReDim Tb(1 To UBound(Tmp, 2), 1 To 2)
    For i = 1 To UBound(Tmp, 2)
        Tb(i, 1) = Tmp(1, i)
    Next i
     
    For Each Ws In ThisWorkbook.Worksheets
        With Ws
            If .Name <> Donnees And .Name <> Instruction Then
                LastLig = .Cells(.Rows.Count, "G").End(xlUp).Row
                If LastLig > 1 Then
                    Tablo = .Range("G2:H" & LastLig)
                    For i = 1 To UBound(Tmp, 2)
                        Pers = Tb(i, 1)
                        For j = 1 To LastLig - 1
                            If Tablo(j, 1) = Pers Then
                                Tb(i, 2) = Tb(i, 2) + Val(Tablo(j, 2))
                                Exit For
                            End If
                        Next j
                    Next i
                End If
            End If
        End With
    Next Ws
    RempliData = Tb
    End Function

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Par défaut
    Salut !

    Tout d,abord j'aimerais te remercier pour le temps que t'as pris à me répondre.
    pour ce qui est de la macro, le résultat envoyé ne s'affiche pas dans les feuil1-2-3-4, il va mettre le résultat (mauvais) dans la feuil Données.

    J'ai mis en commentaire, le résultat souhaité dans les feuil1-2-3-4 avec des flèche pour mieux comprendre!

    Si t'as d'autres précisions, n'hésites pas! je reste connecté!

  8. #8
    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
    Ce que j'ai compris c'est le suivant:

    Pour chaque élément de la colonne A de la feuille Données, le code recherche la valeur correspondante en concaténant les valeurs des 5 colonnes de A à E de la feuille Instruction.

    Quand la ligne Zeta est trouvée, il parcourt les cellule de H à S sur la même ligne Zeta.

    Et pour chaque cellule non vide Psi (ligne Zeta et colonne Beta), il fait la somme de cette cellule Psi avec la somme des valeurs de la colonne G des feuilles Feuil2...Feuil5 correspondant à l'intitulé cellule Alpha (ligne 3 et colonne Beta)

    Le résultat est inscrit en colonne B de la feuille Données.

    Bon, c'est ce que j'avais compris de ton post #1.

    Si tu veux remplir les feuilles Feuil2...Feuil5 identiquement par la somme correspondante aux résultat des critères
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Option Explicit
     
    Const Donnees As String = "Données"
    Const Instruction As String = "Instruction"
    Const Prem As String = "Feuil2"
     
    Sub Traitement()
    Dim NTrai As Long, NData As Long, i As Long, j As Long
    Dim Tmp() As String, Code As String, Cpt As String
    Dim Res, Rech, Data, Tb
    Dim Ws As Worksheet
    Dim n As Integer
     
    Application.ScreenUpdating = False
    With Worksheets(Donnees)
        NTrai = .Cells(.Rows.Count, 1).End(xlUp).Row
        Res = .Range("A2:A" & NTrai)
    End With
     
    With Worksheets(Instruction)
        NData = .Cells(.Rows.Count, 1).End(xlUp).Row
        Rech = .Range("A2:E" & NData)
        Data = .Range("H2:S" & NData)
    End With
     
    ReDim Tmp(1 To NData - 1)
    For i = 1 To NData - 1
        Tmp(i) = Rech(i, 1) & Rech(i, 2) & Rech(i, 3) & Rech(i, 4) & Rech(i, 5)
    Next i
     
    With Worksheets(Prem)
        .Range("H2:H17").ClearContents
        Tb = .Range("G2:H17")
    End With
    For j = 1 To NTrai - 1
        Code = Res(j, 1)
        For i = 1 To NData - 1
            If Code = Tmp(i) Then
                For n = 1 To UBound(Data, 2)
                    If Trim(Data(i, n)) <> "" Then
                        Cpt = Data(1, n)
                        MAJ Tb, Cpt, Data(i, n)
                    End If
                Next n
                Exit For
            End If
        Next i
    Next j
     
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> Donnees And Ws.Name <> Instruction Then Ws.Range("G2:H17") = Tb
    Next Ws
    End Sub
     
    '---------------------------------------
    Private Sub MAJ(ByRef Tablo, ByVal Str As String, ByVal Lavaleur As Double)
    Dim i As Integer
     
    Application.ScreenUpdating = False
    For i = 1 To UBound(Tablo, 1)
        If Tablo(i, 1) = Str Then
            Tablo(i, 2) = Tablo(i, 2) + Val(Lavaleur)
            Exit Sub
        End If
    Next i
    End Sub

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Par défaut
    Ah ok! c'est mon erreur, je me suis mal exprimé!
    Je veux juste envoyer la valeur trouvé sur la ligne 5 (pour A1-A3) du tableau d'instruction dans les feuil-1-2-3-4 dans lescellules respectives;

    pour A1-A3 qui se trouve dans la ligne 5 dans instruction, je trouve 3 dans la cellule cells(5,toto) donc je l'envoie (L'additionne) dans la cellule (toto,8) (ici le 8 c'est la colonne H de mes tableaux de résultat et il est fixe mais la ligne toto c'est la colonne toto de ma cellule ou j'ai trouvé mon 3).
    • pour ce qui est du -2, je le trouve à la cellule cells(5, SASO) donc je l'envoie dans mes tableau des feuil1-2-3-4, à la cellule (Saso, 8). Même chose, le 8 est fixe et le Saso c'est la colonne de la cellule ou j'ai trouvé mon -2 dans la feuille des instruction (cells(5, Saso)).


    • même chose pour mon -1


    Je continue à parcourrir ma colonne A des mes données, jje trouve la valeur suivante A1-B2, je vais dans le tableau des instruction, je la trouve sur la ligne 8. Je parcours la ligne 8, je trouve 1 dans la cellule cells(8,Zozo) j'envoie cette valeur dans les tableaux de feuille1-2-3-4 à la cellule correspondante cells(zozo, 8) latre valeur colonne 8 est fixe et zozo viens de coordonée de la cellule où j'ai trouvé mon 1.
    • Je continue à parcourrir ma ligne 8, je trouve une autre valeur -1 à la cellule cells(8, YAYO), j'envoie alors cette valeur aux tableaux des feuille1-2-3-4 à la cellule (YAYO, 8) le 8 est fixe mais le YAYA viens de la coordonnée des colonne de ma cellule où j'ai trouvé mon -1 (cells(9,Yayo))


    et je continue sur ma colonne A de ma feuille Données

    ...ETC


    j'espère être plus clair!

    Si tu veux d'autre précisions je reste connecté!

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Par défaut
    Citation Envoyé par mercatog Voir le message
    Si tu veux remplir les feuilles Feuil2...Feuil5 identiquement par la somme correspondante aux résultat des critères
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Option Explicit
     
    Const Donnees As String = "Données"
    Const Instruction As String = "Instruction"
    Const Prem As String = "Feuil2"
     
    Sub Traitement()
    Dim NTrai As Long, NData As Long, i As Long, j As Long
    Dim Tmp() As String, Code As String, Cpt As String
    Dim Res, Rech, Data, Tb
    Dim Ws As Worksheet
    Dim n As Integer
     
    Application.ScreenUpdating = False
    With Worksheets(Donnees)
        NTrai = .Cells(.Rows.Count, 1).End(xlUp).Row
        Res = .Range("A2:A" & NTrai)
    End With
     
    With Worksheets(Instruction)
        NData = .Cells(.Rows.Count, 1).End(xlUp).Row
        Rech = .Range("A2:E" & NData)
        Data = .Range("H2:S" & NData)
    End With
     
    ReDim Tmp(1 To NData - 1)
    For i = 1 To NData - 1
        Tmp(i) = Rech(i, 1) & Rech(i, 2) & Rech(i, 3) & Rech(i, 4) & Rech(i, 5)
    Next i
     
    With Worksheets(Prem)
        .Range("H2:H17").ClearContents
        Tb = .Range("G2:H17")
    End With
    For j = 1 To NTrai - 1
        Code = Res(j, 1)
        For i = 1 To NData - 1
            If Code = Tmp(i) Then
                For n = 1 To UBound(Data, 2)
                    If Trim(Data(i, n)) <> "" Then
                        Cpt = Data(1, n)
                        MAJ Tb, Cpt, Data(i, n)
                    End If
                Next n
                Exit For
            End If
        Next i
    Next j
     
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> Donnees And Ws.Name <> Instruction Then Ws.Range("G2:H17") = Tb
    Next Ws
    End Sub
     
    '---------------------------------------
    Private Sub MAJ(ByRef Tablo, ByVal Str As String, ByVal Lavaleur As Double)
    Dim i As Integer
     
    Application.ScreenUpdating = False
    For i = 1 To UBound(Tablo, 1)
        If Tablo(i, 1) = Str Then
            Tablo(i, 2) = Tablo(i, 2) + Val(Lavaleur)
            Exit Sub
        End If
    Next i
    End Sub
    Super!!!!
    Je suis resté figé! tellement ça fonctionne à merveille. Je vais étudier ce code je pense que pour moi ça va être une formation incroyable, je crois qu'il y'a tout dedans...

    WOW

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

Discussions similaires

  1. [V6] Variable créée pour filtre sur tableau
    Par kheduch dans le forum Deski
    Réponses: 1
    Dernier message: 04/08/2012, 14h05
  2. [XL-2007] Select obligatoire pour remplir feuille avec variable tableau ?
    Par Carambar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/03/2011, 15h18
  3. [MySQL] Requête SQL pour récupérer variable tableau
    Par Baka59 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/10/2008, 20h06
  4. [VB.NET] Quel objet tableau pour une recherche indexée ???
    Par Kitano dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/09/2004, 10h38
  5. Feuille de style avec XML (pour expert !)
    Par jer_the_one dans le forum Composants VCL
    Réponses: 8
    Dernier message: 11/08/2004, 09h48

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