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

  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
    Je peux passer mon tableau en type variant au lieu de string, mais est-ce que ça va accélérer le processus?

  10. #10
    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.

  11. #11
    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!

  12. #12
    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!

    Le code avec la boucle fonctionnait, mais vu qu'il y avait beaucoup de lignes, j'essaie avec cette méthode, mais j'ai une erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range(Cells(i, 1).Address).Value = listeduree.Range(Cells(i, 1).Address).Value
    Je bloque là dessus... Est-ce que quelqu'un pourrait m'aider? Le filtre du tableau fonctionne correctement, il ne reste plus qu'à le copier sur un nouvel onglet qui est créé automatiquement nommé par la variable "userdate". Mais comment faire pour "sortir" les données du tableau trié? Le code complet :

    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
    Private Sub Filtre(Optional userdate)
    Dim i As Integer, dureetableubound As Integer
    Dim listeduree As ListObject
     
    Set WScible = Worksheets("Résumé")
     
    With WScible
     
        If .ListObjects.Count <> 0 Then
            .ListObjects("Duree").Unlist
        End If
     
        .ListObjects.Add(xlSrcRange, .Range("$A$1").CurrentRegion, , xlYes).Name = "Duree"
        .ListObjects("Duree").Range.AutoFilter Field:=2, Criteria1:="=" & userdate
     
    End With
     
    i = 0
     
    For Each listeduree In WScible.ListObjects
        i = i + 1
        ActiveSheet.Range(Cells(i, 1).Address).Value = listeduree.Range(Cells(i, 1).Address).Value
    Next
    End Sub
    Merci d'avance

  13. #13
    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
    Pour copier ton tableau filtré, il y a plusieurs méthodes. En voici une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Application.ThisWorkbook
        .Sheets(2).UsedRange.ClearContents
        .Sheets(1).Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy .Sheets(2).Range("A1")
    End With
    A adapter au contexte de ton projet. Ici la feuille(1) est celle qui contient les données filtrées et (2) celle où l'on copie les lignes visibles.

    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

  14. #14
    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
    Merci! Grâce à votre aide j'ai réussi ce que je voulais faire!

    Ci joint, si ça vous intéresse, j'ai mis le fichier compressé.

    Il fonctionne sur Excel 2003. En 2 étapes :
    1 cliquer sur copier pour copier tous les login / logouts
    2 choisir la date dans combobox pour créer l'onglet avec le tri par date / choisir tous pour créer tous les onglets triés.

    C'est encore un peu lent, mais ça fonctionne bien ici!

    Bonne journée!
    Fichiers attachés Fichiers attachés

+ 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