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 2 dimensions et redim preserve


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut variable tableau 2 dimensions et redim preserve
    Hello!

    Je fais (encore) appel à vous, pour un problème de variable tableau. J'ai vu dans le forum qu'avec redim, on peut que modifier la taille de la dernière dimension, j'ai fait ce code pour récupérer les données d'un tableau excel pour pouvoir le trier ensuite et renvoyer le tableau obtenu dans une feuille fraichement créé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
    Private Sub Filtre()
    Dim dureetable() As String
    Dim i As Integer, dureetableubound As Integer
     
    Set WScible = Worksheets("Résumé")
    ReDim dureetable(2, 0)
     
    'Entrée des valeurs nom, date login et durée dans le tableau
    For i = 2 To WScible.Range("B65536").End(xlUp).Row
     
        dureetableubound = UBound(dureetable, 2)
        ReDim Preserve dureetable(2, dureetableubound To dureetableubound + 1)
        dureetable(0, dureetableubound + 1) = WScible.Range(Cells(i, 1).Address).Value
        dureetable(1, dureetableubound + 1) = WScible.Range(Cells(i, 2).Address).Value
        dureetable(2, dureetableubound + 1) = WScible.Range(Cells(i, 6).Address).Value
     
    Next i
    End Sub
    Malheureusement, ça me fait une erreur après que mon tableau ait un Ubound de "1"... je suis pas sûr de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve dureetable(2, dureetableubound To dureetableubound + 1)
    Est-ce que quelqu'un pourrait éclairer ma lanterne? Je n'ai pas trouvé la réponse dans le forum

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Vous avez regardé ici :

    http://silkyroad.developpez.com/vba/tableaux/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Oui, mais je n'arrive pas à comprendre ceci : ReDim Preserve Tableau(1 To 2, 1 To x). Par défaut quand on déclare une variable tableau, elle est initialisée à 1, 1 ?

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Je crois comprendre que tu veux charger les colonnes 1, 2 et 6 de la ligne 2 à la dernière.
    Si c'est cela, tu as pris une méthode qui une fois corrigée restera bien longue.
    Il serait beaucoup plus rapide de charger toutes les colonnes de 1 à 6, puis éventuellement récupérer 1,2 et 6; ou charger 3 variables et les rabouter.

    Regarde ce qu'il y a en FAQ sur le chargement de tableaux Excel dans des variables tableaux.

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Oui c'est bien ça!

    J'ai trouvé dans d'autres conversations ce code adapté :

    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
    Dim dureetable() As String
    Dim i As Integer, dureetableubound As Integer
    Dim plage As Range, cell As Range
     
    Set WScible = Worksheets("Résumé")
    Set plage = WScible.Range(Cells(2, 1).Address & ":" & WScible.Range("A65536").End(xlUp).Address)
     
    ReDim dureetable(1 To plage.Count + 1, 1 To 3)
    i = 0
    For Each cell In plage
        i = i + 1
        With cell
            dureetable(i, 1) = .Value
            dureetable(i, 2) = .Offset(0, 1).Value
            dureetable(i, 3) = .Offset(0, 5).Value
        End With
    Next
    Je vais encore voir si ça fonctionne pour tout le tableau.

    Merci!

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Cela peut fonctionner mais si tu as un grand nombre de lignes cette méthode est trop longue.

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Hello!

    En effet, j'ai 24'334 lignes... j'ai fait le test ça prend 3 secondes avec ce code. Je vais encore faire des recherches pour essayer d'optimiser tout ça!

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    BONJOUR

    Je pense que tu devrais utiliser soit un variant de type tableau pour l 'ensemble de tes 6 colonnes , soit 3 variant pour chaque colonne que tu veux exploiter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim vntPlage as variant
    vntPlage = WScible.Range(Cells(2, 1).Address & ":" & WScible.Range("A65536").End(xlUp).Address)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par pgz Voir le message
    Cela peut fonctionner mais si tu as un grand nombre de lignes cette méthode est trop longue.

    PGZ
    Je vais essayer de passer plutot par cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WScible.ListObjects.Add(xlSrcRange, .Range("$A$1").CurrentRegion, , xlYes).Name = NomTable
    (trouvé dans la FAQ)
    Je teste ça demain.

  10. #10
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Pour apprendre à travailler avec des objets, ton premier code modifié:
    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
    Private Sub Filtre()
      Dim dureetable() As String
      Dim c As Range
      Dim rRange As Range
      Dim wsCible As Worksheet
     
      Set wsCible = Worksheets("Résumé")
      ReDim dureetable(2, 0)
     
      'Entrée des valeurs nom, date login et durée dans le tableau
      For Each c In Range(wsCible.[B1], wsCible.Cells(Rows.Count, 2).End(xlUp))
     
        ReDim Preserve dureetable(2, UBound(dureetable, 2) + 1)
        dureetable(0, UBound(dureetable, 2)) = c.Offset(0, -1).Value
        dureetable(1, UBound(dureetable, 2)) = c.Value
        dureetable(2, UBound(dureetable, 2)) = c.Offset(0, 4).Value
     
      Next c
    End Sub
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

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

Discussions similaires

  1. [XL-2010] Manipulation variable tableau 3 dimensions
    Par PierrotMfff dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 23/03/2015, 14h50
  2. tableau a 2 dimmention redim preserve
    Par fernier dans le forum VB.NET
    Réponses: 3
    Dernier message: 30/01/2009, 11h41
  3. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  4. [débutant] un tableau de dimension variable selon l'objet qui le contient
    Par Epistocles dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/01/2007, 18h07
  5. Probleme sur le redim preserve d'un tableau
    Par shinrei dans le forum ASP
    Réponses: 6
    Dernier message: 03/06/2006, 16h12

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