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 :

Remplacer une const par une variable dans un tableau(n,2) pour renseigner une listbox


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut Remplacer une const par une variable dans un tableau(n,2) pour renseigner une listbox
    Dans un module standard, je récupère une valeur dans une variable déclarée en Public
    Public FL1 As Worksheet
    Public DerniereLigne As Long

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Macro1()
    Set FL1 = Worksheets("Feuil")
    DerniereLigne = FL1.Range("A65535").End(xlUp).Row
    UserForm2.Show
    End Sub
    Dans la feuille de code de l'userform, je souhaite dimensionner un tableau à deux dimensions, la première étant = à DerniereLigne
    Dim Tableau(0 To DerniereLigne, 2)
    qui ne fonctionne évidemment pas puisque DerniereLigne doit être une constante
    Pour l'utilisation que j'en fais, (remplissage d'une liste à trois colonnes - 0, 1 et 2) je ne peux pas inverser les dimensions
    Existe-t-il un moyen pour détourner ce pb
    En désespoir de cause, j'ai tenté
    Const Derlig = DerniereLigne
    placé dans la macro renseignant la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Const = .....
    Private Const = .....
    Une idée pour détourner le problème ?
    Par avance, merci

    Edit
    Je précise que l'exemple avec une plage de cellules n'est qu'un exemple.
    Sinon, la propriété BoundColumn règlerait le problème.
    Dans mon cas, les données peuvent provenir des différents calculs.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon, j'ai trouvé un moyen détourné pour obtenir mon tableau dimensionné au nombre de cellules en mettant tout dans Initialize
    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
    Dim FL1 as Worksheet
    
    Private Sub UserForm_Initialize()
    Dim Tableau()
    Dim DerLigne As Long
    Dim Tab2(2) 'Nombre de colonnes dans la listbox
    Set FL1 = Worksheets("Feuil1")
    DerLigne = FL1.Range("A65535").End(xlUp).Row
    ReDim Tableau(DerLigne)
        For i = 1 To DerLigne
            For NoCol = 1 To 3
                Tab2(NoCol - 1) = Cells(i, NoCol)
                Tableau(i - 1) = Tab2
            Next
        Next
    
    'On peut constater que les données se trouvent en bonne place
        For i = 0 To DerLigne
            For NoCol = 0 To UBound(Tab2)
                MsgBox Tableau(i)(NoCol)
            Next
        Next
        
    'cependant, sans planter, les lignes suivantes ne fonctionnent pas
        ListBox1.List() = Tableau()
        ListBox2.Column() = Tableau()
    End Sub
    Et pourquoi que ça marche pas

    Edit
    ListBox1.List() = Tableau()()
    ListBox2.Column() = Tableau()()
    ne fonctionne pas non plus

    Pourtant, si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        ListBox1.List() = Tableau()(1)
        ListBox2.Column() = Tableau()(1)
    J'ai bien mes trois lignes dans la première liste et mes trois colonnes dans la seconde

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon, puisque c'est comme ça, je vais m'arranger avec Additem mais à vrai dire ça ne m'arrange pas du tout !

    Je laisse traîner cette discussion encore un peu... au cas où... Après je délesterai si personne n'a mieux à me proposer.

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Salut...

    Ceci peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Dim tableau()
        Dim DerLigne As Long
     
        DerLigne = 100
        ReDim Preserve tableau(0 To DerLigne, 2)
    Ok?

    [EDIT] Preserve est inutile dans ce cas-ci.[/EDIT]

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello Pierre,
    Alors on ne sait pas qu'on ne peut pas redimensionner la première dimension d'un tableau mais seulement la dernière ? Ou l'inverse selon le sens dans lesquelles on les prend
    Citation Envoyé par L'aide en ligne
    Si vous utilisez le mot clé Preserve, vous ne pouvez redimensionner que la dernière dimension du tableau. Vous ne pouvez en aucun cas modifier le nombre de dimensions. Par exemple, si votre tableau n'a qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la dernière et seule dimension. Toutefois, si le tableau compte plusieurs dimensions, seule la taille de la dernière dimension est modifiable si vous souhaitez préserver le contenu du tableau. L'exemple suivant montre comment augmenter la taille de la dernière dimension d'un tableau dynamique sans effacer les données qu'il contient :
    Vous me le copierez 100 fois

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Homme de peu de foi...!!!!!

    Essaie d'abord, et reviens me dire ensuite...

    L'aide parle de redimensionner, mais dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dim tableau()
    ...
    Point de dimensions...

    Astucieux, n'est-il pas?

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Edit
    Pourtant, à la réflexion, si je lis entre les lignes, cette phrase m'interpelle :
    Toutefois, si le tableau compte plusieurs dimensions, seule la taille de la dernière dimension est modifiable si vous souhaitez préserver le contenu du tableau
    Je (re) teste ça tout de suite
    A+

    Voui voui, t'a peut-être raison (on s'est croisé)

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour cher Pierre et cher Ouskel'n'or

    Pour ma part je n'ai pas compris ce que tu cherches à faire et quel est ton soucis:


    Au hasard:

    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
    Option Explicit
     
    Dim FL1 As Worksheet
     
    Private Sub UserForm_Initialize()
        Dim Tableau()
        Dim DerLigne As Long, i As Long
        Dim NoCol As Long
     
        Set FL1 = Worksheets("Feuil1")
        DerLigne = FL1.Range("A65535").End(xlUp).Row
     
        ReDim Tableau(1 To DerLigne, 1 To 3)
     
        For i = 1 To DerLigne
            For NoCol = 1 To 3
                Tableau(i, NoCol) = Cells(i, NoCol)
            Next
        Next
     
        ListBox1.ColumnCount = UBound(Tableau, 2)
        ListBox1.List() = Tableau()
    End Sub



    bon après midi
    michel

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Salut Michel,

    Moi, j'ai été trop paresseux pour reprendre tout le code de Ouskel'n'or, mais nos esprits se sont entrechoqués, dirait-on...

    Allez,

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Comme c'est beau ! et ça fonctionne du feu de dieu et du premier coup...
    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 init()
    Dim Tableau()
    Dim DerLigne As Long
    Set FL1 = Worksheets("Feuil1")
    DerLigne = FL1.Range("A65535").End(xlUp).Row
    ReDim Preserve Tableau(DerLigne, 2)
        For i = 1 To DerLigne
            For NoCol = 1 To 3
                Tableau(i - 1, NoCol - 1) = Cells(i, NoCol).Value
            Next
        Next
        ListBox1.List() = Tableau()
        ListBox2.Column() = Tableau()
    End Sub
    Merci Pierre

    Edit
    Désolé, Michel, je viens seulement de voir ta réponse
    Alors merci à tous les deux
    Parfois les choses les plus simples désertent les vieux cerveaux fatigués

  11. #11
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par SilkyRoad Voir le message
    bonjour cher Pierre et cher Ouskel'n'or

    Pour ma part je n'ai pas compris ce que tu cherches à faire et quel est ton soucis:


    Au hasard:

    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
    Option Explicit
     
    Dim FL1 As Worksheet
     
    Private Sub UserForm_Initialize()
        Dim Tableau()
        Dim DerLigne As Long, i As Long
        Dim NoCol As Long
     
        Set FL1 = Worksheets("Feuil1")
        DerLigne = FL1.Range("A65535").End(xlUp).Row
     
        ReDim Tableau(1 To DerLigne, 1 To 3)
     
        For i = 1 To DerLigne
            For NoCol = 1 To 3
                Tableau(i, NoCol) = Cells(i, NoCol)
            Next
        Next
     
        ListBox1.ColumnCount = UBound(Tableau, 2)
        ListBox1.List() = Tableau()
    End Sub



    bon après midi
    michel
    Moi non plus, mais ce n'est pas nouveau lol

    Y a p'tet plus simple non, surtout question vitesse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim plage As Range, tmp()
        Set plage = Worksheets("Feuil1").Range("B8").CurrentRegion
        Set plage = plage.Resize(plage.Rows.Count, 2)
        tmp() = plage
        Me.ListBox1.List = tmp
    et pour peu que le tableau soit horizontal on adapte avec un transpose

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour cher DarkVader

    J'y avais pensé aussi, mais Ouskel'n'or avait indiqué que la plage de cellules n'était qu'un simple exemple et que les données pouvaient etre issues de divers calculs ... ;o)


    bonne soirée
    michel

  13. #13
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    Effectivement, (je ne connaissais pas ton tuto) mais cela ne change rien :
    je ne suis pas sur que cela soit plus efficace en terme de vitesse qu'une affectation valeur par valeur
    mais pour l'exemple autant savoir que l'opération de transposition peut s'effectuer directement sur un tableau,
    et permet donc de fait d'effectuer l'équivalent d'un redim preserve sur la 1ère dimension.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        tmp() = plage '... ou autre imputation
        tmp2() = Application.WorksheetFunction.Transpose(tmp())   'swap colonne/ligne
        ReDim Preserve tmp2(LBound(tmp2) To UBound(tmp2), LBound(tmp2, 2) To UBound(tmp2, 2) + 1)
    ' .../...
        For x = LBound(tmp2) To UBound(tmp2)
            tmp2(x, UBound(tmp2, 2)) = "a"
        Next
    ' .../...
        tmp() = Application.WorksheetFunction.Transpose(tmp2())
     
     
        Me.ListBox1.List = tmp
    PS: les tableau de type ()() correspondent à des tableaux imbriqués, il n'est donc pas possible de les utiliser tel que ci-dessus

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello Dark, y'avait longtemps. C'est gentil de nous rendre visite.
    Je vous dois donc une explication : Ce qui m'a fourvoyé est le fait que, quand j'ai voulu construire sans réfléchir plus j'en conviens, mon tableau à deux dimensions avec une variable, j'ai eu le message d'erreur, en subtance "Constante obligatoire"... Je me suis donc acharné sur la constante sans aller plus loin. Une erreur de débutant, j'en conviens
    Pour mon excuse s'il m'en faut une, et vue le débarquement des poids lourds des forums VB(n), c'est préférable pour mon matricule, j'ai dormi 4 heures la nuit dernière.
    Mais je vous présente tout de même toutes mes excuses.
    Je te remercie pour ton explication, Dark. J'aurai en plus appris celà concernant les Tableaux imbriqués.
    Enfin, si les données à insérer avaient été dans une feuille de calculs, j'avais aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ListBox1.ColumnCount = 3
    ListBox1.RowSource = "a1:c" & derniereligne
    Encore merci à tous

    NB - Testé pour d'autres fonctions Excel, elles sont souvent plus rapides que réalisées en code VBA.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/04/2010, 22h23
  2. Réponses: 3
    Dernier message: 21/07/2007, 01h48
  3. Remplacer des balises par des valeurs dans une String
    Par RadicalBob dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 15h22
  4. Réponses: 2
    Dernier message: 12/04/2007, 17h12
  5. Réponses: 6
    Dernier message: 23/01/2007, 10h17

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