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 :

Exécuter variable en tant qu'instruction


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 41
    Par défaut Exécuter variable en tant qu'instruction
    Bonjour


    Mettons que j'ai le code suivant dans ma cellule A1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Feuil1").range("A2").value = 12
    je précise que dans mon exemple je récupère le code dans une cellule, mais je pourrais très bien avoir à le récupérer dans une variable ou dans une BDD

    j'ai un bouton quelconque qui doit me permettre après clic d'exécuter le code récupéré dans la cellue A1

    comment faire ?

  2. #2
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut
    Salut,
    ton post m'a interpellé, mais j'ai vu des discussions plus avancées sur le sujet que ce que je pourrais te dire.
    => cherche dans ce forum avec les mots clef "dynamiquement", "dynamique" et "Silkyroad"

    En effet, ce que tu cherche à faire, c'est de la programmation dynamique. Il y a des solutions +- proches de ton besoin avec des command button.

    Silkyroad a semble-t-il écrit des choses très complètes sur le sujet car il est cité plusieurs fois.

    Bon courage
    A+
    Dam2P

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 41
    Par défaut
    après avoir fais quelques recherches dans ses messages, je n'ai pas trouvé ce que je recherchais.

    pour être plus clair, j'aimerai exécuter une variable en tant qu'instruction. La valeur de cette variable peut être issue d'une cellule ou d'une BDD, peu importe, et j'aimerai l'exécuter comme si j'avais écrit le code en dur

  4. #4
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut
    J'avais bien compris ton besoin. Je confirme, c'est ce qu'on appellle de la programmation dynamique. C'est comme-si tu écrivais la macro pendant son exécution, puisque dynamiquement pendant l'exécution de la macro tu veux aller chercher une ligne de code hors de visual basic (elle vient d'une cellule, ou même d'une base de données)

    C'est très atypique car normalement le code est écrit d'abord, puis ensuite il est exécuté sur des données.

    Je vois une alternative (qui est de mon niveau de compétences, car je ne maîtrise pas ces notions de programmation dynamique) : supposons que les insructions que tu souhaite récupérer soient toujours à peu près du même type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Feuil1").range("A2").value = 12
    alors tu peux dans ta macro analyser la chaîne de caractère lue (avec instr, left, mid, right, etc.) , en extraire la valeur de l'adresse de la cellule à changer et la valeur à lui attribuer.
    Un truc dans ce genre là :
    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
    72
    73
    74
    75
     
    Option Explicit
     
    Sub scanToutesLesInstructions()
    ' scanne les instructions dans la feuille 2 et les applique
    '
    Dim l_l_nbLignes, l_l_ligneCur As Long
    Dim l_s_adresseModifiee As String
     
     
        l_l_nbLignes = Sheets("Feuil2").Range("A65536").End(xlUp).Row
     
        'Sheets("Feuil1").Activate
     
     
        'scan à proprement parler de chaque instruction dans la feuille 1
        For l_l_ligneCur = 1 To l_l_nbLignes
            'c'est ici que l'instruction est exécutée
            l_s_adresseModifiee = DecrypteInstructionVBA(Sheets("Feuil2").Range("A" & l_l_ligneCur).Value)
            If l_s_adresseModifiee <> "" Then
                'l'exécution était correcte
            Else
                Sheets("Feuil2").Activate 'debug
                Sheets("Feuil2").Range("A" & l_l_ligneCur).Select 'debug
                MsgBox "erreur dans l'instruction " _
                       & Range("Feuil1!A" & l_l_ligneCur) _
                       & Chr(10) _
                       & " située à l'adresse : Feuil2!A" & l_l_ligneCur
            End If
        Next l_l_ligneCur
     
    End Sub
    Function DecrypteInstructionVBA(p_s_myInstruction As String) As String
    '
    'décrypte des instruction du type worksheets("Feuil1").range("A2").value = 12
    '
     
    Dim l_s_myAddress As String
    Dim l_s_mySheet As String
    Dim l_l_posGuillemets1, l_l_posGuillemets2, l_l_posEgal As Long
    Dim l_l_valeurAttribuee As Long
    '
     
    On Error GoTo Erreur
     
        'p_s_myInstruction = Range(p_s_celluleAnalysee).Value
     
        'récupération du nom de la feuille à modifier
        l_l_posGuillemets1 = InStr(1, p_s_myInstruction, """", vbTextCompare)
        l_l_posGuillemets2 = InStr(l_l_posGuillemets1 + 1, p_s_myInstruction, """", vbTextCompare)
        l_s_mySheet = Mid(p_s_myInstruction, l_l_posGuillemets1 + 1, l_l_posGuillemets2 - l_l_posGuillemets1 - 1)
     
        'récupération de l'adresse à modifier
        l_l_posGuillemets1 = InStr(l_l_posGuillemets2 + 1, p_s_myInstruction, """", vbTextCompare)
        l_l_posGuillemets2 = InStr(l_l_posGuillemets1 + 1, p_s_myInstruction, """", vbTextCompare)
        l_s_myAddress = Mid(p_s_myInstruction, l_l_posGuillemets1 + 1, l_l_posGuillemets2 - l_l_posGuillemets1 - 1)
     
        'récupération de la valeur qui doit ^^etre attribuée à cette adresse
        l_l_posEgal = InStr(l_l_posGuillemets2 + 1, p_s_myInstruction, "=", vbTextCompare)
        l_l_valeurAttribuee = Val(Right(p_s_myInstruction, Len(p_s_myInstruction) - l_l_posEgal - 1))
     
        'attribution de la valeur à la cellule identifiée par l'adresse
        Sheets(l_s_mySheet).Activate 'debug
        Sheets(l_s_mySheet).Range(l_s_myAddress).Select  'debug
        Sheets(l_s_mySheet).Range(l_s_myAddress).Value = l_l_valeurAttribuee
     
     
        'valeur retournée par la fonction
        DecrypteInstructionVBA = l_s_mySheet & "!" & l_s_myAddress
     
    GoTo Fin
    Erreur:
        DecrypteInstructionVBA = ""
    Fin:
    End Function

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    Tu peux faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub EcrireEtLancerMacro()
        Dim Instructions(), i As Integer
        Instructions = Array("Sub NouvelleMacro()", "MsgBox Date", "End Sub")
        With ThisWorkbook.VBProject.VBComponents.Add(1).CodeModule
            For i = 0 To UBound(Instructions)
                .InsertLines i + 1 + .CountOfLines, Instructions(i)
            Next
        End With
        i = Len(Instructions(0))
        Application.Run Right(Left(Instructions(0), i - 2), i - 6)
    End Sub
    A adapter concernant la source de tes instructions.

    Attention toutefois à ne pas créer plusieurs macros portant le même nom, d'autre part si les instructions sont incorrectes ...

    Cordialement,

    Tirex28/

  6. #6
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2020
    Messages : 3
    Par défaut Enrico
    Bonjour, je voudrais faire la même chose sous Access
    J'ai une table "Types de Pièces" avec les formules, les exceptions...
    J'ai une autre table "Commande" ou le client entre les dimensions,

    J'aimerais que quand le je choisi le type de pièces dans commande, il me prend les formules, les exceptions... et les interprète comme du code!

    ou une solution comparable

    Quelqu'un peu m'aider

    Merci

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 549
    Par défaut
    bonjour,
    sur les nouvelle version il faut les droits administrateur, et on peut le comprendre, pour activer ScriptControl!
    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
    Sub test() Set sc = CreateObject("ScriptControl")
       sc.Language = "VBScript"
       sc.AddObject "This", ActiveSheet, True
       ' Ajoute un module.
       Set M = sc.Modules.Add("Module1")
       ' Ajoute du code au module.
       M.AddCode MacroName
       ' Exécute le script.
       M.Run "MacroName", "toto", "titi"
    End Sub
    Function MacroName()
    MacroName = "Sub MacroName(toto,titi)" & vbCrLf
    MacroName = MacroName & "Dim TOTO2,TITI2" & vbCrLf
    MacroName = MacroName & " TOTO2=toto:TITI2=titi" & vbCrLf
    MacroName = MacroName & "Msgbox ""TOTO2 : "" & TOTO2" & vbCrLf
    MacroName = MacroName & "Msgbox ""TITI2 : "" & TITI2" & vbCrLf
    MacroName = MacroName & "Msgbox ""This.name : "" & This.name" & vbCrLf
    MacroName = MacroName & "End sub"
    End Function

  8. #8
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2020
    Messages : 3
    Par défaut Enrico
    Merci, mais se code pause beaucoup de problèmes, peut-être parce qu'il est en script

    Il me faudrait la même chose, mais en VBA

    Encore merci

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/03/2006, 08h49
  2. utilisation d"une variable en tant que motif de
    Par bilout dans le forum Langage
    Réponses: 4
    Dernier message: 26/03/2006, 21h19
  3. [javascript] exécution de fonct. avec l'instruction onload
    Par TERRIBLE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/03/2006, 18h40
  4. [FTP] Définir une variable en tant que constante
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 15/01/2006, 12h39

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