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 tableau dynamique deux dimensions [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    finance
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : finance
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut VBA tableau dynamique deux dimensions
    Bonjour,

    je rempli un premier tableau mytab1 a partir d'une plage de cellules. Ensuite je dois remplir un deuxieme tableau mytab2 à partir de mytab1 en ayant éliminé les doublons de la première colonne de mytab1.
    pour cela je dois surement faire un redim preserve car le nombre de ligne de mytab2 est dynamique et le nombre de colonnes est toujours égale au nombre de colonne de mytab1. les 2 tableaux sont en option base 1.
    Je n'arrive pas a comprendre pourquoi j'ai un message d'erreur "subscript out of range". Pouvez vous m'aider svp?
    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
    Dim mytab1() As Variant
    Dim mytab2() As Variant
    Dim i As Integer
     
    Dim j As Integer
    Dim k As Integer
    Dim doublon As Boolean
     
    Dim iCount As Integer
    Dim kmax As Integer
     
    temp1 = Timer
     
    k = 1
    mytab1 = Range("A2:AC497").Value
    kmax = UBound(mytab1, 2)
    doublon = False
     
    For i = 1 To UBound(mytab1, 1)
        doublon = False
        For j = i + 1 To UBound(mytab1, 1)
            If mytab1(i, 1) = mytab1(j, 1) Then
                doublon = True
            End If
        Next j
     
        If doublon = False Then
             iCount = iCount + 1
                For k = 1 To UBound(mytab1, 2)      
                    ReDim Preserve mytab2(1 To iCount, 1 To kmax)
                    mytab2(iCount, k) = mytab1(i, k)
                    k = k + 1
                Next k
        End If
    Next i
     
    Range(Sheets("TEST").Cells(1, 1), Sheets("TEST").Cells(iCount, kmax)) = mytab2

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    peux-tu reformuler le comportement attendu ?

    Plus précisément : si tu as deux lignes qui ont la même valeur en colonne 1 ... tu conserves les deux lignes ou une seule ? Laquelle des deux ? Ou alors autre comportement ?

  3. #3
    Membre averti
    Homme Profil pro
    finance
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : finance
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    je conserve la premiere ligne de mytab1 qu'il rencontre dans la colonne 1 pour l'inserer dans mytab2

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Voici une proposition un peu différente :

    - on copie toutes les données dans une nouvelle feuille
    - on utilise l'outil "nettoyer les doublons" (removeduplicates) sur la colonne 1
    - on a plus qu'à récupérer la plage dédoublonnée
    - on supprime la nouvelle feuille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub toto()
    Dim Tabl()
     
    With ThisWorkbook.Worksheets.Add
       Thisworkbook .Worksheets("MaFeuille").UsedRange.Resize(Feuil1.UsedRange.Rows.Count - 1, Feuil1.UsedRange.Columns.Count).Offset(1, 0).Copy .Cells(1, 1)
     
        With .Cells(1, 1)
            .CurrentRegion.RemoveDuplicates 1
            Tabl = .CurrentRegion.Value
        End With
        Application.DisplayAlerts = False: .Delete: Application.DisplayAlerts = True
    End With
     
    End Sub

  5. #5
    Membre averti
    Homme Profil pro
    finance
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : finance
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    merci pour ta réponse mais je souhaite utiliser exclusivement des tableaux car je dois également y importer les données de toutes les colonnes et j'ai plein de calculs ensuite à effectuer (je ne veux pas de dico non plus). merci

  6. #6
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Bonjour,

    Avec la solution de joe tu as toujours un tableau que je sache, du coup je comprends pas pourquoi tu ne souhaites pas l'utiliser

  7. #7
    Membre averti
    Homme Profil pro
    finance
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : finance
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    je souhaite me perfectionner avec les tableaux....essayer de comprendre leur fonctionnement et essayer de savoir pourquoi mon code bug...

  8. #8
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Pour reprendre ton code simplement, cette partie ne peut pas fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    iCount = iCount + 1
    For k = 1 To UBound(mytab1, 2) 
        ReDim Preserve mytab2(1 To iCount, 1 To kmax)
        mytab2(iCount, k) = mytab1(i, k)
        k = k + 1
    Next k
    Pourquoi?
    Un tableau dynamique ne peut faire "évoluer" que sa seconde dimension.

    Secundo : tu ne dois pas redimensionner à chaque "tour de boucle" sur k, mais simplement avant la boucle.

    Autrement dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    iCount = iCount + 1
    ReDim Preserve mytab2(1 To kmax, 1 To iCount)
    For k = 1 To UBound(mytab1, 2) 
        mytab2(k, iCount) = mytab1(i, k)
     'k = k + 1 '==> ???????????????
    Next k
    Ne te reste plus qu'à transposer le cas échéant ton tableau (avec la fonction Transpose si nb éléments < 65000 et des poussières)

    Remarque : Regarde aussi mon commentaire ??? et dis nous a quoi peux bien te servir cette ligne k = k + 1 dans une boucle For k = ... To ... Next k

    EDIT :
    à lire :
    http://didier-gonard.developpez.com/...s-tableau-vba/
    également :
    http://silkyroad.developpez.com/vba/tableaux/

  9. #9
    Membre averti
    Homme Profil pro
    finance
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : finance
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    Merci pour vos explication...ca marche nickel! bravo

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

Discussions similaires

  1. Tableau dynamique deux dimensions de class
    Par Hyssgrif dans le forum C++
    Réponses: 3
    Dernier message: 17/04/2015, 15h22
  2. copier un tableau dynamique à deux dimensions
    Par Benoit_T dans le forum Débuter
    Réponses: 27
    Dernier message: 09/11/2009, 11h29
  3. Tableau dynamique à deux dimensions
    Par Neuromancien2 dans le forum ASP
    Réponses: 4
    Dernier message: 13/06/2007, 18h12
  4. Tableau dynamique à deux dimensions
    Par David Fouejio dans le forum MFC
    Réponses: 4
    Dernier message: 05/03/2007, 09h37
  5. Réponses: 1
    Dernier message: 09/03/2006, 17h25

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