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 :

Utilisation GoTo & AddressOf - Remplacer "Texte" par Texte


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation GoTo & AddressOf - Remplacer "Texte" par Texte
    Bonjours à tous,

    Alors voilà, je pense que ma question est simple et élémentaire pour ceux d'entre vous qui maîtrise le VBA, mais je ne trouve pas de réponse à cette question qui est la suivante:

    Dans un code VBA, comment fait-on pour remplacer un texte sous forme de variable texte tel que "TEXTE", par un texte écrit en dur tel que TEXTE, pour pouvoir être utilisé dans des fonctions tel que GoTo TEXTE ou AddressOf TEXTE, car certaines fonctions natives tel que ces 2 fonctions ne demande pas de variable texte (String).

    Je sais que le titre du sujet n'est pas clair, mais je ne savais pas l'expliquer simplement, alors voici un CODE exemple illustrant ce que je veux dire:

    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
    Sub Choix()
     
    Dim t(0 To 5) As Single
    Dim ChoixMéthode As Byte, Méthode As String
     
       t(0) = Timer
       ChoixMéthode = 2
     
       Méthode = Choose(ChoixMéthode, "Méthode1", "Méthode2", "Méthode3")
             'GoTo Méthode (Méthode renvoi "Méthode2" dans le cas présent)
             'Suite: J'aimerai pouvoir enlever les guillemets "" à "Méthode2" pour que ça marche
             'Suite2: ou au moins avoir un numéro d'index (ChoixMéthode dans le cas présent) utilisable 
             'Suite3: tel que "Méthode" & 2 où 2 serait un numéro d'index ou un truc dans le genre...
             GoTo Méthode2
     
     
    Méthode1:
       '--- Code pour Méthode1 ---
       GoTo FinMéthode
     
    Méthode2:
       '--- Code pour Méthode2 ---
       GoTo FinMéthode
     
    Méthode3:
       '--- Code pour Méthode3 ---
       GoTo FinMéthode
     
    FinMéthode:
       '--- Code final commun pour chaque Méthode, simple exemple ici avec un timer ---
       t(1) = Timer
       t(2) = t(1) - t(0)
       MsgBox t(2) & " s"
    End Sub

    Voilà, j'espère que vous compris ce que j'aimerai obtenir comme résultat.

    P.S.: Il ne s'agit pas ici de trouver une autre méthode tel qu'une méthode avec les Select Case ou autres fonctions If & Co, mais bien de pouvoir transformer une variable texte en variable utilisable par une fonction utilisant un adressage interne au VBA. Je sais (ou je pense) que le GoTo & AddressOf demande enfaite une variable à nombre entier (Integer, Long ou LongLong). Mais je ne sais pas comment arriver à trouver l'adresse correspondante. Ou plus simplement, si il été possible de remplacer un "TEXTE" par un TEXTE en dur (comme expliqué plus haut), ça serai parfait.



    Merci d'avance à ceux qui auront pris un peu de temps pour lire ce sujet, et à ceux qui pourquoi pas y apporterai une réponse.

    A+
    Dernière modification par Invité ; 22/07/2013 à 15h08.

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Les Goto renvoient là ou les étiquettes sont mises; elles ne sont pas variables puisque c'est des étiquettes.

    Si tu veux utiliser des variables un select case avec des goto à l'intérieur ( mais ma foi les goto sont à éviter)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Oui, ils demandent certainement en interne un nombre, et c'est justement ce que j'aimerai avoir. Enfaite, comme je le disais au dessus, ce qui m'intéresse est la méthode pour trouver en quelque sorte le numéro de ligne se reportant à l'étiquette dans le cas du GoTo ou au numéro de l'adresse se reportant à une procédure.

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Lors de la compil le goto renvoi à la ligne x... tu peux faire une procédure qui rajoute un label à la ligne x du code .... mais faudra recompiler. Je ne pense pas que ce que tu veuilles pour remplacer un simple select case soit possible.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui, mais c'est ça que je cherche justement, l'adresse du Goto ligne x.
    Dernière modification par AlainTech ; 03/08/2013 à 12h41. Motif: Suppression de la citation inutile

  6. #6
    Invité
    Invité(e)
    Par défaut
    Enfaite, pour être un petit peu plus complet, lorsque je fais:

    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
    AAddrrOf("Func", n)
     
    Public Function AAddrrOf(strFuncName As String, n As Byte) As LongPtr
     
           If strFuncName = "Func" Then
              If n = 1 Then
                 AAddrrOf = GetAddress(AddressOf Func1)
              ElseIf n = 2 Then
                 AAddrrOf = GetAddress(AddressOf Func2)
              ElseIf n = 3 Then
                 AAddrrOf = GetAddress(AddressOf Func3)
              ElseIf n = 4 Then
                 AAddrrOf = GetAddress(AddressOf Func4)
              End If
          End If
     
    End Function
     
    Public Function GetAddress(ByRef AddressOf_FunctionName As LongPtr) As LongPtr
      GetAddress = AddressOf_FunctionName
    End Function
     
    Public Sub Func1()
     
    End Sub
     
    Public Sub Func2()
     
    End Sub
     
    Public Sub Func3()
     
    End Sub
    '...etc...
    AAddrrOf("Func", n) me renvoie vers la Fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function AAddrrOf(strFuncName As String, n As Byte) As LongPtr
    , j'ai ainsi un LongPtr grâce à AAddrrOf, puis le Select Case me renvoie vers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function GetAddress(ByRef AddressOf_FunctionName As LongPtr) As LongPtr
    , puis me renvoie le même nombre (un LongPtr), puis AAddrrOf me renvoie un même chiffre ensuite. Enfaite, ça correspond à l'équivalent d'un AddressOf mais compliqué inutilement ici, en plus il y a un Select Case, donc pas intéressant dutout. J'ai bien donc un LongPtr en guise d'un AddressOf Func1 par exemple, mais je cherche une méthode générale pour les GotO également.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Petite rectif: A mettre dans un module

    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
    Sub test()
    Dim a As LongPtr, n As Byte
    n = 2
    a = AAddrrOf("Func", n)
    End Sub
     
    Public Function AAddrrOf(strFuncName As String, n As Byte) As LongPtr
     
           If strFuncName = "Func" Then
              If n = 1 Then
                 AAddrrOf = GetAddress(AddressOf Func1)
              ElseIf n = 2 Then
                 AAddrrOf = GetAddress(AddressOf Func2)
              ElseIf n = 3 Then
                 AAddrrOf = GetAddress(AddressOf Func3)
              ElseIf n = 4 Then
                 AAddrrOf = GetAddress(AddressOf Func4)
              End If
          End If
     
    End Function
     
    Public Function GetAddress(ByRef AddressOf_FunctionName As LongPtr) As LongPtr
      GetAddress = AddressOf_FunctionName
    End Function
     
    Public Sub Func1()
     
    End Sub
     
    Public Sub Func2()
     
    End Sub
     
    Public Sub Func3()
     
    End Sub
    Public Sub Func4()
     
    End Sub
    '...etc...
    @ BlueMonkey,

    Comme je l'ai dis un peu plus haut, je ne souhaite pas de Select Case ou If Fonction.

    tu ne pourrais jamais faire un Goto sur cette variable.
    Mais pourquoi justement
    J'aimerai savoir.

    Ici, les Fonction montré plus me donne une variable LongPtr correspondant à l'adresse interne du VBA. J'aimerai savoir comment ça marche enfaite.

    C'est bien la même chose pour les Handle par exemple ?
    Dernière modification par AlainTech ; 03/08/2013 à 12h45. Motif: Fusion de 2 messages

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Salut,

    Le compilateur VBA exige une constante en paramètre à l'instruction Goto.

    Donc même tu parvenais à trouver un moyen dynamique pour récupérer la ligne correspondant à un label (addressOf ne le permet pas),
    tu ne pourrais jamais faire un Goto sur cette variable.

    Comme l'a indiqué EngueEngue une solution à base de Select/Case pour remplacer le Choosepeut te permettre d'avoir une écriture équivalente sans trop de bidoulle.
    Mais ce type d'écriture de programme est obsolète depuis des années.
    (Source de nombreuses erreur en cas d'ajout d'imbrication de test..)

    Donc en dehors de la gestion d'erreur, le Goto n'est plus guère utilisé.

    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
        Dim choix As Integer
        choix = 4
     
      Select Case choix
        Case 1: GoTo Methode1
        Case 2: GoTo Methode2
        Case 3: GoTo Methode3
        Case 4: GoTo Methode4
      End Select
     
    Methode1:
        MsgBox "Methode1"
        GoTo Fin_Methode
    Methode2:
        MsgBox "Methode2"
        GoTo Fin_Methode
    Methode3:
        MsgBox "Methode3"
        GoTo Fin_Methode
    Methode4:
        MsgBox "Methode4"
        GoTo Fin_Methode
     
    Fin_Methode:
    A+

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