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 :

Variables Tableaux - Incompréhension ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut Variables Tableaux - Incompréhension ?
    Hello world,

    Je suis en train "d'étudier" la méthode des variables tableaux pour mes besoins professionnels, pour optimiser mes traitements de fichiers et me voici confronté à ma première incompréhension.

    J'ai actuellement un code complet, dont je vous copie ci-dessous le morceau qui ne convient pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim T As Variant, A As Long
     
    With Worksheets(1)
        T = .Range("A2:H" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    End With
     
    For A = LBound(T, 1) To UBound(T, 1)
       If InStr(T(A, 5), "valeur") > 0 Then Worksheets(2).Range("A" & LBound(T, 1) & ":A" & UBound(T, 2)) = T(A)
    Next A
    Le soucis est qu'il me renvoi un superbe code 9 <subscript out of range> sur la partie de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Then Worksheets(2).Range("A" & LBound(T, 1) & ":A" & UBound(T, 2)) = T(A)
    Visiblement je n'ai pas déclaré l'array T(A) ?
    Ou j'ai mal compris l'utilisation de la variable T ?

    Pour la petite explication de ma façon de faire, je pensais que T(A) me renvoyait les données 1 à 8 de la ligne "A" du tableau T dans mon tableau à deux dimensions. Ai-je mal compris ?
    Lorsque je renseigne T(A, 1) cependant, il me renvoit bien la valeur de la ligne A, cellule 1 du tableau T dans tout le range défini sur la feuille 2.
    Mais je ne comprends pas comment lui faire renvoyer les valeurs 1 à 8 de la ligne A du tableau T dans le Range("A" & LBound(T, 1) & ":A" & UBound(T, 2)) de la feuille 2

    Je vous remercie par avance pour votre aide

  2. #2
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    En faisant ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim T As Variant, A As Long
     
    With Worksheets(1)
        T = .Range("A2:H" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    End With
    Tu obtiens un tableau à 2 dimensions (n lignes et 8 colonnes). Donc pour accéder à un élément tu dois préciser les 2 indices :T(i,j).
    Et le renvoi d'une ligne ou colonne complète directement, avec une syntaxe du style T(A,) ou autre, ne fonctionne pas.

    Cordialement.

  3. #3
    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
    Vaut mieux partout travailler avec des variables tableaux et de retourner le résultat en bloc vers la feuille.

    Exemple
    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
    Sub Remp()
    Dim i As Long, j As Long
    Dim k As Integer, n As Integer
    Dim T, Res()
     
    With Worksheets(1)
        T = .Range("A2:H" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
    End With
     
    n = UBound(T, 2)
    For i = 1 To UBound(T, 1)
        If InStr(UCase(T(i, 5)), "VALEUR") Then
            j = j + 1
            ReDim Preserve Res(1 To n, 1 To j)
            For k = 1 To n
                Res(k, j) = T(i, k)
            Next k
        End If
    Next i
    Worksheets(2).Range("A1").Resize(n, j) = Res
    End Sub
    PS: attention au points devant Cells et Rows.count dans la ligne d'affectation de T

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    J'abonde dans le sens de mercatog. Faire bien attention toutefois que la plage ne contienne pas de formules.

  5. #5
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut
    Une nouvelle fois, merci à vous pour vos réponses !

    Je m'en vais de ce pas essayer les solutions proposées, et voir si j'arrive à les exploiter

    Je reviens vers vous pour clôturer le post et vous redire merci quand j'ai un résultat

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Malheureusement, les variables tableau ne sont pas aussi souples. Avec la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T = .Range("A2:H" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    tu as défini une matrice à deux dimensions et VBA attend que tu fournisses deux index (ou aucun si tu te réfères à la matrice entière). Dans ce cas je ne pense pas que tu gagnes grand chose à utiliser une variable tableau.

    Mais je ne comprends pas comment lui faire renvoyer les valeurs 1 à 8 de la ligne A du tableau T dans le Range("A" & LBound(T, 1) & ":A" & UBound(T, 2)) de la feuille 2
    A moins de faire une boucle, je ne pense pas que tu puisses.

Discussions similaires

  1. [9i] Faut-il "vider" les variables tableaux ?
    Par AyaGizmo dans le forum SQL
    Réponses: 4
    Dernier message: 20/11/2007, 14h55
  2. Réponses: 1
    Dernier message: 19/04/2007, 21h52
  3. FLASH PHP SQL passage de variables tableaux
    Par Jeminforme dans le forum Flash
    Réponses: 3
    Dernier message: 05/09/2006, 19h36
  4. variables tableaux
    Par kernel57 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/12/2005, 11h03

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