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 d'une variable définie dans une formule classique [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut Utilisation d'une variable définie dans une formule classique
    Bonjour à toutes et tous,

    Dans une macro toute simple, je fais définir par les utilisateurs une devise, qu'ils sont libres de rentrer via une InputBox. J'ai nommé cette variable Curr.
    Elle me permet par la suite dans une succession de formule de remplacer des vides par cette variable. Problème, lors de l'exécution de la macro, au lieu de voir la réponse entrée (par ex. "EUR"), Excel me renvoie #NOM. Ci-dessous le code entré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            With .Range("M2:M" & LR1)
                .Formula = "=IF(LEFT(RC[-11], 5)<>""Solde"", RC[-8], Curr)"
                .Value = .Value
            End With
    J'ai pensé à "figer" le résultat de l'InputBox dans une cellule puis me référer à celle-ci dans ma formule par la suite mais je voulais savoir si je pouvais directement utiliser cette variable dans ma formule.

    PS: J'aurai d'autres questions (deux je pense) par la suite mais je ne veux pas vous embrouiller et vous remercie déja par avance pour celles que vous pourrez me donner pour ce souci là.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    C'est parce que la partie Excel qui évalue les formules de cellules ne sait absolument pas ce qu'est 'Curr'!
    Essaie peut-être de lui donner une portée 'Public' pour voir si elle est reconnue (il me semble que l'on peut définir des fonctions en VBA et les appeler depuis la formule d'une cellule donc ça doit être possible avec des variables).

    Sinon, le plus simple serait peut-être de faire entrer la devise dans une case de ta feuille et d'utiliser une formule classique.

    Et avec un 'If...Then', c'est faisable également en VBA.

    Au fait, la ligne suivante n'a aucune utilité:

    Tu affectes à ta cellule la valeur qu'elle contient déjà!

  3. #3
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Merci pour ta réponse Sclarckone, je vais donc ramener la variable dans une cellule et l'utiliser ensuite. Cependant, je ne suis pas d'accord avec toi sur

    Au fait, la ligne suivante n'a aucune utilité:
    Tu affectes à ta cellule la valeur qu'elle contient déjà!
    N'y voit aucune insolence de ma part, tes connaissances devant largement dépasser les miennes. Si je ne fais pas ça, la formule reste sous sa forme et comme je supprime les colonnes auxquelles elle fait référence, j'ai donc un #REF à la place des valeurs.

    Ce .Value = .Value me permet de faire un copier / coller en valeur en gros.
    Si tu as une autre solution pour un même résultat, je suis preneur !

    Vous saluant bien bas

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Je comprends mais c'est exotique en tout cas!

    Ça implique en tout cas que dans le modèle objet d'Excel, le résultat d'une formule est différent de la propriété Value...je serai curieux de savoir comment ça marche exactement.

  5. #5
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    As-tu essayé avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Formula = "=IF(LEFT(RC[-11], 5)<>""Solde"", RC[-8],""" & Curr & """)"
    Cordialement.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Excel te renvoie #NOM, car il cherche un Nom définie dans le classeur ainsi:"Curr" qui n'existe pas.

    Essaie de remplacer ta formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "=IF(LEFT(RC[-11], 5)<>""Solde"", RC[-8], Curr)"
    par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "=IF(LEFT(RC[-11], 5)<>""Solde"", RC[-8]," & Curr & ")"
    En fait je concataine la première Chaine à la variable Cur et à la chaine ")".

    ça devrait marcher. Tiens moi au courant.
    Cordialement,
    Octaves.

  7. #7
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Bonjour Octaves, bonjour gFZT82,

    Merci à tous les deux pour vos réponses, j'ai testé les deux et c'est celle de gFZT82 qui fonctionne parfaitement.
    Je vais continuer à profiter de vos connaissances pour parfaire ma macro.
    Je souhaiterai "vérouiller" la devise entrée par les utilisateurs finaux afin qu'ils ne rentrent pas n'importe quoi. Comme ensuite je compile plusieurs fichiers, il faut absolument que la devise entrée dans l'InputBox soit composée de 3 caractères, qui ne peuvent être qu'alphabétique. Pour l'instant, mon code se résume au plus simple, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim LR1 As Long, Curr As String
        With Sheets("Final Data")
     
        Curr = InputBox("Quelle est la devise locale de la société dont vous traitez les données ?", "Définition de la devise locale")
    J'aimerai pouvoir faire un contrôle sur Curr afin que si l'utilisateur entre par exemple "AAAAA" ou encore "A2A", la macro retourne en début de ligne afin d'entrer une nouvelle devise.
    J'espère que ma demande est suffisament claire. Je vous remercie par avance !

    Au fait Sclarckone, c'est exotique sûrement mais je vais t'avouer, je ne fais qu'appliquer bêtement cette solution que m'a un jour donné mercatog dans un bout de code qu'il m'a corrigé. Etant donné qu'il maîtrise plus que bien, je ne me suis jamais essayé à faire autre chose...

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Et tant que ça fonctionne il n'y a pas de raison de se priver. Surtout que du coup c'est beaucoup plus rapide que de se taper la collection de cellules et définir les valeurs unes à unes...

    Pour ton problème de saisie de devise, je te conseille de t'intéresser aux expressions régulières qui te permettront de résoudre très simplement ton problème:

    http://cafeine.developpez.com/access/tutoriel/regexp/

  9. #9
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Re Scklarckone,

    Merci pour ton lien , ça m'a aidé à débroussailler un peu tout ça.
    En y allant pas à pas, j'ai réussi au résultat escompté pour la première partie (la plus simple), à savoir contrôler qu'il y ait bien trois caractères. Ensuite, j'ai tenté d'intégrer le contrôle de ces caractères pour déterminer si oui ou non ils sont bien alphabétiques, mais ça ne fonctionne pas et ça me fait tout planter. Ci-dessous le code utilisé. Je vous demande d'être indulgent, j'imagine que c'est très sioux mais vos réponses (j'espère !) m'aideront à le simplifier et le rendre plus propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim LR1 As Long, Curr As String
        With Sheets("Final Data")
     
    DefineCurr:
        Curr = InputBox("Quelle est la devise locale de la société dont vous traitez les données ?", "Définition de la devise locale")
        If Len(Curr) <> 3 Then
            MsgBox "La devise entrée n'est pas correcte !", vbCritical, "Erreur !"
            GoTo DefineCurr
        Else
            If Left(Curr, 1) <> (A - Z) Or Right(Left(Curr, 2), 1) <> (A - Z) Or Right(Curr, 1) <> (A - Z) Then
                MsgBox "La devise entrée n'est pas correcte !", vbCritical, "Erreur !"
            GoTo DefineCurr
            End If
        End If
    Je vais être pénible, je voudrais également respecter la casse, à savoir que je vourais que la devise entrée soit absolument en majuscule, pas de "eur" par exemple mais bien "EUR"
    Je vous remercie d'avance pour votre contribution !

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Tu n'as pas du tout utilisé d'expressions régulière en tout cas! C'est pas obligé mais c'est très puissant une fois qu'on les maitrise (ce qui n'est pas mon cas malheureusement).

    Le plus simple pour être sûr que la devise est en majuscules (pas besoin de test):


  11. #11
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Mince, je suis pris !
    En effet, je n'ai pas utilisé d'expressions régulières car bien qu'ayant lu le tutoriel (qui m'a donné la piste du (A - Z)), je n'ai pas compris, je ne maîtrise pas du tout VBA (je fais ma petite tambouille de débutant).
    Merci pour ton code sur la façon de transformer en majuscule la variable si toutefois cette dernière était entrée en minuscule.
    Aurais-tu une idée de la façon de faire mon contrôle sur le type de caractère entré par l'utilisateur (en l'occurence de l'alphabétique) ?
    Merci !

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Citation Envoyé par Runsh63 Voir le message
    Aurais-tu une idée de la façon de faire mon contrôle sur le type de caractère entré par l'utilisateur (en l'occurence de l'alphabétique) ?
    Merci !
    Avec des expressions régulières justement...comme je le sous-entendais, je connais le principe de fonctionnement mais je n'en ai jamais utilisé (et là je n'ai malheureusement pas le temps de me pencher dessus).

    Un tuto qui en explique bien le principe (mais en PHP donc la syntaxe doit légèrement différer en VBA): http://g-rossolini.developpez.com/tutoriels/php/regex/
    Sinon faudrait que quelqu'un qui connait la syntaxe en VBA te file un coup de main...

  13. #13
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Je suis long à la détente... Excuse-moi pour avoir redemandé ce à quoi tu avais déja répondu. Merci pour tous tes liens je vais essayer de trouver une parade à tout ça, déja comprendre les tutos.
    Encore merci pour ton aide, au plaisir d'une prochaine discussion !

  14. #14
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Sclarckone,

    A force de tâtonnement, j'ai fini par arriver au résultat escompté. On peut probablement trouver des raccourcis mais je te donne pour info le code qui me convient et répond à mon problème :

    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
        Dim LR1 As Long, Curr As String
        With Sheets("Final Data")
     
    DefineCurr:
        Curr = InputBox("Quelle est la devise locale de la société dont vous traitez les données ?", "Définition de la devise locale")
        Curr = UCase(Curr)
        If Len(Curr) <> 3 Then
            MsgBox "La devise entrée doit comporter 3 caractères !", vbCritical, "Erreur !"
            GoTo DefineCurr
        Else
            If IsNumeric(Left(Curr, 1)) = True Or IsNumeric(Right(Left(Curr, 2), 1)) = True Or IsNumeric(Right(Curr, 1)) = True Then
                MsgBox "La devise entrée ne doit pas comporter de caractères numériques !", vbCritical, "Erreur !"
                GoTo DefineCurr
            End If
        End If
    Je te remercie une fois de plus pour l'aide apportée et espère pouvoir un jour maîtriser les Regex.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Oui mais à ceci près que ton code est pris en défaut si l'utilisateur entre des caractères du style ?/:;,."#~& ...

    M'enfin faudrait tomber sur un vicieux. Bon courage!

    Juste pour chipoter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Curr = InputBox("Quelle est la devise locale de la société dont vous traitez les données ?", "Définition de la devise locale")
        Curr = UCase(Curr)
    se "compacte" en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Curr = UCase(InputBox("Quelle est la devise locale de la société dont vous traitez les données ?", "Définition de la devise locale"))

  16. #16
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Entièrement d'accord avec toi, faudrait tomber sur un vicieux (ou un abruti !) mais je ne pense pas que ce soit le cas. Je pense même que le contrôle des valeurs numériques est de trop mais on ne sait jamais...
    Merci pour le raccourci, j'aurai pu faire l'effort de concaterner les deux opérations en une seule en effet !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/06/2011, 11h30
  2. Réponses: 6
    Dernier message: 21/07/2009, 11h37
  3. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  4. [XSLT] Réutiliser une variable définie dans une boucle
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/10/2006, 16h49
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

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