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 :

Formulation par VBA d'une colonne de tableau structuré


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut Formulation par VBA d'une colonne de tableau structuré
    Bonjour le Forum,

    Soit
    Une feuille nommée "Entrée"
    ...dotée d'un tableau structuré nommé "lebotablo"
    ...contenant 2 champs "Portf" et "lavaleur"

    Nom : formules_tablo_struct_1.JPG
Affichages : 147
Taille : 17,5 Ko

    Je cherche à reporter les valeurs seules du champ "lavaleur" suite à formulation

    Sachant que la formulation de la 1ère cellule de son objet Range incrémente celle de tous les enregistrements, si je procède à l'exécution de la procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Sub essai_formula_struc()
     
    Dim maformule As String
    maformule = "=[@Portf]*2"
     
    With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
             .ClearContents
             .Cells(1, 1).Formula = maformule
            .Value = .Value
    End With
     
    End Sub
    Ceci en utilisant une formulation "structurée".

    alors j'obtiens les bonnes valeurs

    Nom : formules_tablo_struct_2.JPG
Affichages : 141
Taille : 16,1 Ko

    Dans un 2ème temps, si je conjugue une formulation structurée avec une instruction Evaluate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub essai_formula_struc_2()
     
    Dim maformule As String
    maformule = "=[@Portf]*2"
     
    With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
             .ClearContents
             .Cells(1, 1).Value = Evaluate(maformule)
    End With
     
    End Sub
    alors le code retourne une erreur #VALEUR!.
    Ceci dès la 1ère cellule

    Nom : formules_tablo_struct_3.JPG
Affichages : 153
Taille : 15,9 Ko

    Pourquoi?
    Alors qu'une formulation classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub essai_formula_struc_3()
     
    Dim maformule As String
    maformule = "=2*3"
     
    With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
             .ClearContents
             .Value = Evaluate(maformule)
    End With
     
    End Sub
    ne pose aucun problème (la valeur 6 apparaît dans toute la colonne).

    Nom : formules_tablo_struct_4.JPG
Affichages : 125
Taille : 15,9 Ko

    En résumé, le tableau structuré ne semble pas apprécier l'instruction "Evaluate" basée sur une formulation structurée (Ici "=[@Portf]*2")
    2 étapes sont nécessaires
    - formulation
    - collage de valeurs (.Value = .Value) (Voir 1er code)

    Le but de mon propos étant:
    - dans une première phase, de reporter les valeurs obtenues ci-dessus par formulation structurée sur toute la colonne directement.
    - dans une seconde phase (soit, sans doute, une autre discussion) d'utiliser une fonction adjacente à un type de variable défini (Public lafonction(…) As letype) directement sur une colonne de tableau structuré, sans balayage de cellules.

    Merci à vous et bonne soirée.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Bonjour Marcel,

    Tu as vu également que tu avais le même résultat que ta première procédure avec :
    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
     
     
    Public Sub essai_formula_struc_3()
     
    Dim maformule As String
     
        maformule = "=[@Portf]*2"
     
        With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
                 .ClearContents
                 .Cells(1, 1).Value = maformule
                 .Value = .Value
        End With
     
    End Sub
    C'est à dire .Cells(1, 1).Formula ou .Cells(1, 1).Value, tu obtiens la même chose.

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut Evaluate(...) non, mais [...] oui
    Bonjour Marcel,
    Bonjour Eric,

    Curieusement, Evaluate ne fonctionne pas mais les [] fonctionnent (je croyais que c'était des syntaxes équivalentes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub essai_formula_struc_2()
    Dim maformule As String
      maformule = "=[@Portf]*2"
      With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
        .ClearContents
        .Cells(1, 1).Value = [maformule]
      End With
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  4. #4
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour Eric et Patrice, merci pour vos réponses

    Bonjour le Forum,

    (Je réponds tour à tour)

    Eric,

    Je viens de tester
    Il est vrai que les propriétés Formula et Value relatives donne le même résultat
    Et ce que ce soit pour une formulation structuré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
    19
    20
    Option Explicit
    Const discusssion As String = "https://www.developpez.net/forums/d2056614/logiciels/microsoft-office/excel/macros-vba-excel/formulation-vba-d-colonne-tableau-structure/"
     
    Public Sub essai_formula_struc_4()
     
    'Eric Kergresse dans discusssion
     
    Dim maformule As String
    maformule = "=[@Portf]*2"
     
    With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
             .ClearContents
              '.Value et .Formula = même impact....
             .Cells(1, 1).Value = maformule
             '.....mais ligne obligatoire pour coller les valeurs
            .Value = .Value
     
    End With
     
    End Sub
    ou même classique

    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
    Public Sub essai_formula_struc_5()
     
    ''Eric Kergresse dans discusssion
     
    Dim maformule As String
    maformule = "=2*3"
     
    With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
             .ClearContents
             '.Value et .Formula = même impact....
             .Cells(1, 1).Value = maformule
             '.....mais ligne obligatoire pour coller les valeurs
             .Value = .Value
    End With
     
    End Sub
    Il n'empêche que la ligne
    reste obligatoire si l'on souhaite ne voire apparaître que les valeurs.

    Ce qui rend donc obligatoire 3 fois l'utilisation de la propriété

    Jamais vu en 11 ans!
    Si quelqu'un détient la clé du mystère…

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  5. #5
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Patrice,

    Tu as raison.
    Contrairement à l'instruction Evaluate, la notation entre crochets n'entraîne pas d'erreur.

    Alors que, comme pour toi, dans mon esprit de toujours C'est la raison pour laquelle, d'ailleurs, je n'utilise cette notation entre crochets que pour le report d'une valeur d'un objet Range
    (Voir les inconvénients de ce type de notation soulignés par Tonton Pierre dans son billet)

    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
    Option Explicit
    Const discusssion As String = "https://www.developpez.net/forums/d2056614/logiciels/microsoft-office/excel/macros-vba-excel/formulation-vba-d-colonne-tableau-structure/"
     
    Public Sub essai_formula_struc_6()
     
    'Patrice740 dans discusssion
     
    Dim maformule As String
    maformule = "=2*3"
     
    With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
             .ClearContents
             'Les crochets, contrairement à l' instruction "Evaluate"
             'n'entraîne pas d'erreur!...
             .Cells(1, 1).Value = [maformule]
             '.....mais ligne obligatoire pour coller les valeurs
             .Value = .Value
    End With
     
    End Sub
     
    Public Sub essai_formula_struc_7()
     
    'Patrice740 dans discusssion
     
    Dim maformule As String
    maformule = "=[@Portf]*2"
     
    With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
             .ClearContents
             'Les crochets, contrairement à l' instruction "Evaluate"
             'n'entraîne pas d'erreur!...
             .Cells(1, 1).Value = [maformule]
             '.....mais ligne obligatoire pour coller les valeurs
             .Value = .Value
    End With
     
    End Sub
    Là encore

    Si quelqu'un détient la clé du mystère...

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Re,

    VBA est plein de curiosités.
    Par exemple pour écrire des numéros :
    Code VBA : 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
    Public Sub essai_formula_struc_1()
    Dim mavaleur As String
      mavaleur = "0025"
      With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
        .ClearContents
        .Value = mavaleur
      End With
    End Sub
     
    Public Sub essai_formula_struc_2()
    Dim mavaleur(1 To 1, 1 To 1) As String
      mavaleur(1, 1) = "0025"
      With ThisWorkbook.Worksheets("Entrée").Range("lebotablo[lavaleur]")
        .ClearContents
        .Value = mavaleur
      End With
    End Sub

    Il n'est pas logique que la première syntaxe, avec .formula ne fonctionne pas
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

Discussions similaires

  1. Insérer une formule par VBA
    Par Carmiel dans le forum Excel
    Réponses: 7
    Dernier message: 13/12/2016, 22h55
  2. Trier par ordre croissant une colonne de tableau
    Par c.piette dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 12/05/2015, 21h21
  3. [XL-2003] Remplacer texte d'une formule par VBA
    Par Marc_27 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/08/2011, 15h21
  4. Réponses: 2
    Dernier message: 14/09/2009, 17h47
  5. Réponses: 4
    Dernier message: 06/02/2008, 18h20

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