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
    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"



    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



    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



    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).



    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

    Envoi d'un bloc de messageries Outlook utilisant des paramètres variables


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



  2. #2
    Expert éminent sénior
    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.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  3. #3
    Expert confirmé
    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
    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
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    .Value = .Value

    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é
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    .Value




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

    Bien Cordialement.

    Marcel

    Envoi d'un bloc de messageries Outlook utilisant des paramètres variables


    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
    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
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     [] = Evaluate


    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

    Envoi d'un bloc de messageries Outlook utilisant des paramètres variables


    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é
    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