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 :

[VBA] Condition de IF définie dans un String [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Par défaut [VBA] Condition de IF définie dans un String
    Bonjour,

    Pour l'un de mes codes j'ai besoin de passer un string en tant que condition pour un IF.

    Par exemple, je tente de faire fonctionner une macro de ce type :

    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
    Sub test()
     
    Dim StrTest As String
    Dim shExport As Worksheet 'variable permettant l’accès à la feuille Export.
    Set shExport = ThisWorkbook.Worksheets("Export")
     
    StrTest = "shExport.Cells(2, 2).Value = ""hello"" Or shExport.Cells(2, 2).Value = ""bonjour"""
    'MsgBox StrTest
     
    If StrTest Then
        MsgBox "OK"
    Else
        MsgBox "KO"
    End If
     
    End Sub
    Quand je compile je me retrouve avec une Incompatibilité de type dans la ligne du If.

    Note : En réalité pour mon code j'ai même shExport.Cells(i, j) à la place de shExport.Cells(2, 2) avec i et j variables.

    Note 2 : Pour ceux qui peuvent se demander à quoi ca sert, c'est pour permettre à un utilisateur de créer ses propres conditions if (avec uniquement des Or au milieu) sans avoir à taper du code.

    En gros, j'ai un tableau comme celui ci dessous qui est rempli par l'utilisateur avec les conditions qu'il veut mettre sur la colonne rentrée.

    Nom : Capture2.PNG
Affichages : 2766
Taille : 8,2 Ko

    Par exemple, avec ces infos rentrées si la colonne "Identifiant" (située dans une autre feuille) contient des cellules égales à hello ou égales à bonjour ou différentes de test ou ... alors le script me renvoie "OK" sinon il me renvoie "KO".

    Donc je construis une chaine de caractère qui contient toutes mes conditions à partir de ce tableau (chose que j'arrive à faire assez simplement) et après j'aimerais faire le test sur la colonne "Identifiant" à partir de mon String.

    Ma variable string "StrTest" contient la condition je la construis à partir du tableau excel (en faisant entre autre des split dans les cases).

    Ma variable StrTest ressemble à ca :

    Nom : Capture.PNG
Affichages : 2879
Taille : 31,8 Ko


    Quelqu'un à des idées pour contourner l'erreur ?

    Merci d'avance pour votre aide.


    Cordialement.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 151
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La syntaxe de la ligne 7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StrTest = "shExport.Cells(2, 2).Value = ""hello"" Or shExport.Cells(2, 2).Value = ""bonjour"""
    n'est pas correcte.
    De plus tu déclares la variable comme un String alors que ta ligne de code sous-entend que tu effectues un test logique donc tu dois utiliser une variable de type Booleen
    sans l'avoir testé, je dirais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable = shExport.Cells(2, 2).Value = "hello" Or shExport.Cells(2, 2).Value = "bonjour"
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Par défaut
    Merci pour ta réponse super rapide Philippe.

    Ca semble en effet marcher avec une variable booléenne.

    Je suis un peu stupide de ne pas y avoir pensé alors que j'ai testé des choses comme " If StrTest = True Then" avec StrTest en string, ce qui n'a... pas de sens en fait.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 151
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Petit complément.
    Lorsque l'on teste une variable booléenne la valeur True est implicite. Ainsi If VariableBoolean = True Then est équivalent à If VariableBoolean Then
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Par défaut
    Merci à toi

    Petite question subsidiaire, a laquelle j'espère avoir trouvé la solution quand tu me répondras :

    Comment je peux faire pour convertir mon string en boolean ?

    La fonction CBool semble être faite pour ça mais je n'arrive pas à faire fonctionner la chose pour l'instant.

    Je suis parti sur ce genre de code (qui sert a rien en l'état, c'est juste pour tester)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim StrTest As String
    Dim test As Boolean
    Dim shExport As Worksheet 'variable permettant l’accès à la feuille Export.
    Set shExport = ThisWorkbook.Worksheets("Export-flux")
     
    StrTest = "shExport.Cells(2, 2).Value = ""hello"""
    MsgBox StrTest
    test = CBool(StrTest)
    Et je me paie une incompatibilité de type sur la dernière ligne.

    Cordialement.

  6. #6
    Invité
    Invité(e)
    Par défaut
    bonjour,

    un informaticien c'est un fainéant au même titre que les utilisateur des application qu'il développe!
    il s'économise en écrivant pas plus de ligne de code que nécessaire!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
     With ThisWorkbook.Worksheets("Export")
        MsgBox Array("Ko", "OK")(Abs(.Cells(2, 2).Value = "hello" Or .Cells(2, 2).Value = "bonjour"))
     End With
    End Sub
    Dernière modification par Invité ; 29/05/2017 à 15h37.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 151
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comment je peux faire pour convertir mon string en boolean ?
    La fonction CBool semble être faite pour ça mais je n'arrive pas à faire fonctionner la chose pour l'instant.
    Il n'y a pas lieu de convertir ta variable mais tout simplement d'utiliser la variable Test déclarée comme boolean (C'est à cela que sert une variable booléenne)

    Je t'avais pourtant indiqué dans ma première réponse que ta syntaxe n'était pas correcte et je t'avais montré un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable = shExport.Cells(2, 2).Value = "hello" Or shExport.Cells(2, 2).Value = "bonjour"
    Correction de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim StrTest As String
    Dim test As Boolean
    Dim shExport As Worksheet 'variable permettant l’accès à la feuille Export.
    Set shExport = ThisWorkbook.Worksheets("Export-flux")
     
    StrTest = "shExport.Cells(2, 2).Value = ""hello"""
    test = shExport.Cells(2, 2).Value = "hello"
    MsgBox test
    MsgBox StrTest
    test = CBool(StrTest)
    Attention correction faite de mémoire donc procédure non testée
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Par défaut
    Bonjour Dysorthographie,

    Je ne comprends pas du tout ta réponse.

    Pourquoi utiliser Abs ? En quoi cela peut m'aider pour passer ma variable string en booléen ?

    Merci pour ton aide

    Cordialement

    Edit : Philippe, je viens de voir ta réponse. En fait, pour le procédure que je vous ai donné en guise d'exemple déclarer la variable booléenne comme tu l'indiques marche très bien. En fait, dans mon vrai code, le string qui contient ma condition est créé de façon un peu plus costaud et je voulais m'éviter de devoir modifier tout le code.
    Ceci dit, je pense que je vais tout de même partir sur ce que tu m'indiques, c'est à dire utiliser directement des booléens.

    Dans mon cas, le string qui contenait les condition je le construisais de façon itérative c'est à dire que j'ajoutais un élément à la fin de mon string à chaque itération avec une ligne de ce genre dans un boucle qui parcours tous les éléments du tableau TabEgal (bon, juste avec cette ligne on aura forcément un "Or" en trop à la fin du String mais dans mon code je gère ce genre de cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StrEgal = StrEgal & "shExport.Cells(IndiceExportL, IndiceExportC).Value = """ & TabEgal(i) & """ Or "
    Ce qui me met un peu des bâtons dans les roues c'est de transposer ca avec des booléens (que je manipule quasiment jamais). Est ce que je peux construire une expression booléenne en rajoutant à chaque itération d'une boucle un élément au bout de l'expression ? Je ne vois entre autre pas comment remplacer le caractère de concaténation "&".





    Merci à tous les deux

  9. #9
    Invité
    Invité(e)
    Par défaut
    en soit ça c'est un booléen! ça donne True/False! voire le MsgBox test de Philippe!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shExport.Cells(2, 2).Value = "hello" Or shExport.Cells(2, 2).Value = "bonjour"
    un booléen retourne 0 ou -1 selon!

    abs convertit le -1 en +1 (1)!

    array c'est un tableau qui commence à zéro(False) en occurrence mon tableau à deux valeur array("Ko","Ok") array("Ko","Ok") (fase) retourne "Ko" array("Ko","Ok")(abs(true)) retourne "Ok"!

  10. #10
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Par défaut
    Merci pour ton éclaircissement, je ne savais pas que le booléen retournais -1 en cas de True, je pensais qu'il retournait directement 1.

    Me reste plus qu'à comprendre comment je peux concaténer les expressions booléennes dans une même variable booléenne (voir édit dans mon message précédent qui concerne la construction itérative de ma condition).

  11. #11
    Invité
    Invité(e)
    Par défaut
    maintenant que tu as compris que true/false = -1/0 tu peux le additionner true + true = -2 = true!

    true c'est toutes valeurs différente de 0!

    (true Or true) and (true or true) => (true + true) * (true + true)

  12. #12
    Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Par défaut
    Merci pour ton aide (et à toi aussi Philippe). J'ai réussi à faire ce que je souhaitais et ca m'a permis au passage d'alléger considérablement mon code.

    Cordialement.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/06/2007, 07h45
  2. [vba]modifier un caratère dans une string
    Par megapacman dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2006, 18h12
  3. [VBA-E] trouver caractere dans un string
    Par gigs dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/04/2006, 14h12
  4. [VBA-E]Inserer des guillemets dans un string
    Par repié dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/02/2006, 10h47
  5. [VBA] Un caractère dans un string
    Par Neilos dans le forum Access
    Réponses: 5
    Dernier message: 23/06/2005, 14h58

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