Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/09/2011, 17h44   #1
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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 :
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à.
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 18h06   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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à!
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 18h16   #3
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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

Citation:
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
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 18h38   #4
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 20h02   #5
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

As-tu essayé avec

Code :
.Formula = "=IF(LEFT(RC[-11], 5)<>""Solde"", RC[-8],""" & Curr & """)"
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/09/2011, 22h23   #6
Invité de passage
 
Inscription : décembre 2005
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3
Points : 1
Points : 1
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 :
"=IF(LEFT(RC[-11], 5)<>""Solde"", RC[-8], Curr)"
par celle-ci :
Code :
"=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.
MONISTROL H est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 09h06   #7
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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 :
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...
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h11   #8
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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/
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h15   #9
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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 :
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 !
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h37   #10
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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):

Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 13h56   #11
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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 !
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 14h53   #12
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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...
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 15h00   #13
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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 !
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 15h58   #14
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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 :
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.
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 16h06   #15
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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 :
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 :
    Curr = UCase(InputBox("Quelle est la devise locale de la société dont vous traitez les données ?", "Définition de la devise locale"))
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 16h47   #16
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
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 !
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h25.


 
 
 
 
Partenaires

Hébergement Web