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 :

[XL-2010] Utilisation des tableaux structurés en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut [XL-2010] Utilisation des tableaux structurés en VBA
    Bonjour à tous,

    Après plusieurs recherches infructueuses, je me décide à ouvrir un nouveau post.

    J'ai un classeur Excel 2010, avec des tableaux structurés (nouveauté 2007 apparemment, avec des évolutions en 2010)
    Je trouve ces tableaux très pratiques, entre autre pour la lisibilité dans les formules (de type Tableau1[[TitreLigne][TitreColonne]] ou Tableau1[@[données]])

    Mon problème se situe dans l'utilisation de ces tableaux en VBA.
    Je n'arrive pas a savoir s'il est possible d'utiliser de telles références, et si oui la syntaxe à utiliser.

    A noter également que ça marche très bien avec les USF (par exemple, pour une zone de liste, dans RowSource, il suffit d'écrire MonTableau[[ColonneVoulue]] et il affiche toutes les valeurs de la colonne dont le titre est "ColonneVoulue")


    Comme indiqué plus haut, dans Excel, on retrouve des formules du type =[@[données]] ce qui signifie qu'excel récupère la valeur qui est au croisement de la ligne active (symbole @) et de la colonne "données"

    Je veux faire exactement la même chose, mais en VBA.


    PS : je souhaite éviter les solutions avec
    - zones nommés, c'est à dire les fonction range(MaColonne)
    - Activecell.offset(...)

    En gros, je souhaite vraiment utiliser la puissance du tableau

    Merci d'avance pour votre aide.
    S'il vous manque des infos auxquelles je n'aurais pas pensé, n'hésitez pas.

  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,

    Va voir du côté de l'objet ListObject et de le collection associée ListObjects.
    Ce ne sont pas des objets que je manipule souvent donc je ne peux pas trop t'aider, mais l'aide MS est bien faite sur ces objets. D'autre part la FAQ est aussi assez fournie à ce sujet.
    Mais il est vrai que la partie VBA mériterait peut être un tutoriel.

    Bon courage

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Et non malheureusement ce n'est pas la même fonction
    Ce dont tu me parle, c'est de l'objet tableau dans VBA. C'est à dire une variable contenant plusieurs données
    La fonction tableau d'excel est vraiment différente.
    en fait c'est un système de référencement des données dans la feuille de calcul.
    Je ne sais pas vraiment comment l'expliquer, le plus simple est d'aller voir dans l'aide Excel, à tableau structuré.
    C'est une "fonction" qui a l'air d'être méconnue ... :/

  4. #4
    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,

    Je n'ai rien trouvé de probant dans l'aide hormis un article sur les "références structurées".

    Comment (via quel menu) accède-t-on à ce que tu décris dans Excel ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    il y a l'aide en ligne microsoft :

    http://office.microsoft.com/fr-001/e...010155686.aspx

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Bonjour,

    je fais un petit up car je n'ai toujours pas trouvé de solution à mon problème :/

    Quelqu'un a-t-il eu le temps de se pencher sur le sujet ?

  7. #7
    Membre éprouvé Avatar de MlNOU
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 47
    Par défaut boucle et cells ?
    Bonjour,

    As-tu essayer de faire comme tu le decris dans ton message avec une boucle for et l'utilisation de cells ( un equivalent de range) pour recuperer les intersection comme le fait apparement ton tableau ??


    Cordialement MlNOU.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    J'aimerais éviter justement.
    En fait je trouve étrange qu'il n'y ai pas de solution simple en VBA pour cette fonctionnalité qui marche si bien dans Excel

  9. #9
    Membre éprouvé Avatar de MlNOU
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 47
    Par défaut
    Bonjour,

    En effet cela est tres etrange , pour ma part je ne peux t'aider plus .


    Bonne chance pour tes recherches.

    Cordialement MlNOU.

  10. #10
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Bonjour Lewis29,

    J'ai un peu comme l'impression d'avoir répondu à quelque chose de semblable à ta question ailleurs.
    Que veux tu faire exactement?
    Exploiter la puissance des tableaux en VBA, sans utiliser le modèle objet mis en place à cet effet?
    (j'en étais certain! après une petite exploration, voici le lien de la discussion qui semble être similaire au tien. http://www.developpez.net/forums/d13...ctures-en-vba/). Bizarre l'article m'a l'air d'avoir été tronqué quelque part.

    Comme suggéré dans le lien ci-dessus l'appel explicite ou implicite de la méthode Evaluate satisfait bien de solutions avec les syntaxes formules/feuille de calcul, qu'on a du mal parfois à exprimer en VBA.

    C'est parfois pratique, son exploitation doit être rationnelle, quand on n'utilise pas ces expressions pour une cellule ou plage de cellules.
    Puisque dans certains cas d'expressions renvoyant un tableau, c'est le premier élément du tableau qui est naturellement renvoyé.
    La pleine puissance de ces formules est obtenue en les envoyant dans une plage directement sans détour, d'y lire la valeur et ensuite l'effacer.
    Contrairement à ce que l'on croit, l'initialisation d'une grande plages de cellules par une formule ou une constante est très puissante avec l'opérateur d'affectation "=".
    [données] = 0, où données est une colonne de 500.000 lignes que VBA initialise pour nous en nous épargnant l'écriture d'une boucle inutile. Cette technique est valable également pour remplissage par formules.
    Je crois plutôt que ce qui est compliqué c'est de vouloir se passer des méthodes du modèle objet d'Excel ou des fonctions VBA pour utiliser une expression propre aux cellules par exemple préférer IIF([A1], "Ok", "No") contre Evaluate("=IF(A1=0;B1;A1)")Si tu tiens vraiment à coder avec la syntaxe du tableur autant utiliser le tableur dans ton code comme réceptrice de tes expressions de calcul. Ou programmer de tes propres mains une méthode personnalisée te permettant d'exploiter au mieux certaines expressions de calcul du tableur.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Effectivement, on dirai bien qu'il y a eu un transfère de messages sur une discussion séparée .
    Pourtant, ça correspondait exactement à la même demande, à savoir l'utilisation de référence structurée en VBA.
    Ça doit être parce que Lewis29 n'a pas répondu depuis quelques temps.

    Depuis, j'ai réussi à mieux m'en servir, mais pas tant que ça.

    Essaye par exemple, dans un Tableau
    1/ nommé "Table1"
    2/ contenant 2 colonnes minimum



    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Sub tableau_v1()
     
        Dim ModCalc As Integer
        Dim t(1 To 10) As Single, ßt(1 To 10) As Double
     
    'Lecture de l'horloge Timer : Temps de Départ
        t(1) = Timer
     
    'Désactive l'affichage (temporairement si réactivé en fin de Macro)
    Application.ScreenUpdating = True 'Mettre sur faux pour tester la différence de temps
     
    'Passe en mode de calcul manuel
    ModCalc = Application.Calculation
    Application.Calculation = xlCalculationManual
     
        Dim ListObj As ListObject
     
    'Définit le tableau dans la feuille de calcul
        Set ListObj = Worksheets("Feuil2").ListObjects("Table1")
     
    'Définit les noms d'entête de chaque colonne (2 colonnes ici): Il faudrai espérer
    ' que la méthode AutofilltoRight fonctionne pour incrémenter automatiquement
    ' une série texte/chiffre de gauche à droite (N1, N2, N3, N4 etc...)
        With ListObj
          .HeaderRowRange(1).Value = "N"
          .HeaderRowRange(2).Value = "t"
        End With
     
        t(2) = Timer
        ßt(1) = t(2) - t(1)  'Calcul du temps écoulé entre les 2 lectures : t1 et t2
     
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
        [Table1[N]].Formula = "= ROW([@t])-ROW(Table1[[#Headers],[N]])"
        t(3) = Timer
        ßt(2) = t(3) - t(1)  'Calcul du temps écoulé entre les 2 lectures : t1 et t3
     
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
        [Table1[N]].Formula = [Table1[N]].Value
        t(4) = Timer
        ßt(3) = t(4) - t(1)  'Calcul du temps écoulé entre les 2 lectures : t1 et t4
     
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
        [Table1[t]].Formula = "= 10 ^11 * (Cos([@N])/SUM([N]))"
        t(5) = Timer
        ßt(4) = t(5) - t(1)  'Calcul du temps écoulé entre les 2 lectures : t1 et t5
     
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
        [Table1[t]].Formula = [Table1[t]].Value
        t(6) = Timer
        ßt(5) = t(6) - t(1)  'Calcul du temps écoulé entre les 2 lectures : t1 et t6
     
     
    'Réactive le calcule automatique
    Application.Calculation = ModCalc
     
    'Réactive l'affichage
    Application.ScreenUpdating = True
     
     
    MsgBox "Temps écoulé depuis le lancement :" & Chr(10) _
    & "Initialisation :" & " " & Format(ßt(1) * 1000, "#,##0.000") & " ms " & "(durée : " & ßt(1) * 1000 & " ms)" & Chr(10) _
    & "Formule1 :" & " " & Format(ßt(2) * 1000, "#,##0.000") & " ms " & "(durée : " & (ßt(2) - ßt(1)) * 1000 & " ms)" & Chr(10) _
    & "Valeur1 :" & " " & Format(ßt(3) * 1000, "#,##0.000") & " ms " & "(durée : " & (ßt(3) - ßt(2)) * 1000 & " ms)" & Chr(10) _
    & "Formule2 :" & " " & Format(ßt(4) * 1000, "#,##0.000") & " ms " & "(durée : " & (ßt(4) - ßt(3)) * 1000 & " ms)" & Chr(10) _
    & "Valeur2 :" & " " & Format(ßt(5) * 1000, "#,##0.000") & " ms " & "(durée : " & (ßt(5) - ßt(4)) * 1000 & " ms)" & Chr(10)
     
    End Sub
    @NVCfrm,
    Sinon, ce n'est pas si évident que ça comme dit dans l'autre post (formule avec le Sin). Ce qui est intéressant avec les tableaux et références structurées, c'est que c'est super rapide et très pratique à utiliser. écrire [@a] = 2 * [@b] est beaucoup plus simple puisque les [@...] correspondent à une plage en colonne et avec Excel, on peut faire glisser les cellules vers la droite et en bloquant les bonnes variable ça se transforme en Plage.
    Il ne manquerait plus qu'à utiliser les références 3D pour avoir des cubes de données calculées très rapidement (à conditions qu'"ils soient suffisamment petit).

    Mais même sans ça, ça reste plus simple d'utilisation. Le code que j'ai donné calcul tout seul (malgrès le mode de calcul manuel pourtant) les colonnes de données.
    Habituellement, il aurait fallu employer un Autofill pour l'incrémentation des données ou FillDown pour les formules et juste après, utiliser un Calculate (étant en mode Manuel).
    Un des avantages est que le nom de la colonne est constant, à savoir [@a] ici. Excel comprend tout seul que [@a] fait référence à une intersection entre une ligne et une colonne.
    L'inconvénient avec les cellules est que le nom est différents à chaques fois.

    La seul chose qui est dommage est que les tableaux ne semblent pas vouloir de .Value directement. Ils ne prennent (je pense) que des .formula.


    A+ (sans jeu de mot)
    Dernière modification par Invité ; 12/07/2013 à 01h21.

  12. #12
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    bonsoir Nouveau2,

    Content de te retrouver.
    Habituellement, il aurait fallu employer un Autofill pour l'incrémentation des données ou FillDown pour les formules et juste après, utiliser un Calculate (étant en mode Manuel).
    Un des avantages est que le nom de la colonne est constant, à savoir [@a] ici. Excel comprend tout seul que [@a] fait référence à une intersection entre une ligne et une colonne.
    Ceci dépend de la façon dont on passe ses instructions. Note le passage où je fais allusion à l’affectation directe: [données] = 0.

    Le comportement est identique pour tous les cas d'affectation par formule que ce soit une plage ordinaire ou un tableau Excel. L'expression est toujours évaluée par EXCEL à l'insertion.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [A1:A10].Formula = "=2*ROW()"
    Range("A1:A50000").Formula = "=ROW()"
    Range("C1:C50000").FormulaR1C1 = "RC[-2]*COLUMN())"
    L'expression est toujours calculée au remplissage. Indifféremment du mode de calcul.
    Ce qui est différent de rentrer la formule dans C1 et faire un AutoFill qui nécessitera un recalcul. (c'est pratique dans certains cas aussi).

    Il faut juste comprendre que quand tu affectes une plage de cellules avec .Value par une expression de calcul seule la valeur de l'expression est renvoyée pour toute la plage. Si l'expression renvoi un tableau, c'est comme je l'ai déjà dit le premier élément du tableau. La différence avec .Formula est que l'expression est adaptée pour chaque référence de cellule de la plage.

    Sinon j'admets et pratique l'utilisation de références structurées dans mes codes quand c'est opportun. C'est d'ailleurs l'une de mes voies préférées.
    Je n'ai toujours pas compris ce que veut faire Lewis29 qui ne se trouverait pas dans les exemples que tu as posté.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Bonjour,

    Je vois qu'il y a eu du mouvement par ici

    Je vais regarder un peu les différents exemples qui ont été donnés et voir si ca fait l'affaire pour ce que je souhaitais faire.
    Il faut que je me remette dedans car c'est quelque chose que je fais pour mon boulot mais j'en ai pas encore parlé au chef (je vais attendre que ca marche un minimum ^^)

Discussions similaires

  1. Utilisation des tableaux structurés en VBA
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 08/06/2013, 20h31
  2. Réponses: 2
    Dernier message: 18/10/2006, 12h36
  3. Réponses: 2
    Dernier message: 09/06/2006, 14h33
  4. Réponses: 4
    Dernier message: 10/05/2006, 11h36
  5. [EXCEL][VBA] Utilisation des formules Excel en VBA
    Par Amanck dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 16h08

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