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 :

Problème d'opérateur dans variable [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 21
    Par défaut Problème d'opérateur dans variable
    Bonjour et Bonne année à tous

    Après plusieurs heures à m'arracher les cheveux sur un problème de variable, je me tourne vers vous (avant de devenir chauve)


    Classeur_Doublons_essais.xls

    Sur ma macro - Sub a_Inventaire_H_input()
    Dans le module N° 1 :

    J'ai une formule qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If ncond = 1 Then: If Cells(i, cond1) <> Cells(i - 1, cond1) Then GoTo 4 'Si la cellule X1 est différente de X1 -1 …
     
    If ncond = 1 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): If (q) <> (v) Then GoTo 4 '(Fonctionne aussi)
     
    If ncond = 2 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): Set r = Cells(i, cond2): Set w = Cells(i - 1, cond2): If (q) <> (v) Or (r) <> (w) Then GoTo 4 '(Marche très bien également)
    Je désire pouvoir choisir l'opérateur de comparaison et donc, l'utiliser sous forme d'une variable, pour pouvoir choisir l'opérateur désiré (<> ou = ou < ou >)

    J'ai donc essayé comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ncond = 1 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): If (q) (oper) (v) Then GoTo 4
    Conclusion : ça ne fonctionne pas

    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If ncond = 1 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): If ((q) (oper) (v)) Then GoTo 4
     
    'If ncond = 1 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): If (q) & (oper) & (v) Then GoTo 4
     
    If ncond = 1 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): If (q) (oper) (v) Then GoTo 4
    Puis de bien d'autres façons, en ajoutant ou retirant des & ou des ( ) ou des [ ] ou des virgules : Nada

    La macro plante, mais lorsque je mets le pointeur de souris sur chaque variable : la variable est OK : j'ai bien le contenu de ma première cellule, l'opérateur désiré et le contenu de ma 2 ème cellule.
    Je tourne en rond et ne comprend pas pourquoi ça ne fonctionne pas.

    Y a-t-il une astuce que je ne connais pas ?

    J'ai essayé avec « evaluate »

    Pour ne pas avoir d'erreur, il m'a fallu mettre la variable de l'opérateur entre parenthèses.
    Mais j'ai toujours un problème : ça ne fonctionne pas sur mon tableau.

    Je me suis aperçu que ça ne fonctionne Que si la totalité de ma colonne contient uniquement des chiffres, en ce cas là, c'est OK

    (Si je choisis la colonne la colonne H au lieu de la colonne J (ou d'une autre), ça fonctionne)

    Mais si j'ai un titre de colonne avec du texte ou si j'ai du texte ailleurs dans ma colonne, comme c'est le cas dans mon tableau : ça ne fonctionne pas ==> Erreur d'exécution "13" ; incompatibilité de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Ne fonctionne qu'avec des chiffres uniquement :
    If ncond = 1 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): If Evaluate(q & (oper) & v) Then GoTo 4
    Alors que la formule ci-dessous fonctionne, que ce soit avec du texte ou des chiffres (mais sans pouvoir choisir l'opérateur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Fonctionne avec chiffres ou lettres:
    If ncond = 1 Then: Set q = Cells(i, cond1): Set v = Cells(i - 1, cond1): If (q) <> (v) Then GoTo 4
    Celle ci, fonctionnant, évidement très bien aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ncond = 1 Then: If Cells(i, cond1) <> Cells(i - 1, cond1) Then GoTo 4

    (J'ai mis des valeurs par défaut aux input-box, pour gagner du temps)

    (c'est certainement tout bête, mais je débute…)

    J'ai consulté de très nombreux sites et n'ai toujours pas trouvé de solution.

    Plus tard je referai une autre macro par Userform, mais pour l'instant, je souhaite garder les inputsBox.

    Merci de votre aide
    Bonne journée

  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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu ne dis pas que contient NCond, Cond1, etc. mais je devine qu'il s'agit de nombres entiers
    Tu utilises l'instruction Goto qui est à proscrire, cela rend un programme très vite illisible et est une source d'erreur. On ne l'utilise que pour les On Error
    Privilégie les instruction Exit For, Exit Sub on des procédures décisionnelles comme Select Case
    Pour revenir à ton problème, je passerais par une fonction booléenne telle que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function IsCondition(Elem1 As Double, Elem2 As Double, Optional Operator As String = "=") As Boolean
     Select Case Operator
      Case "=": IsCondition = Elem1 = Elem2
      Case "<>": IsCondition = Elem1 <> Elem2
      Case "<": IsCondition = Elem1 < Elem2
      Case ">=": IsCondition = Elem1 >= Elem2
      Case ">": IsCondition = Elem1 > Elem2
      Case "<=": IsCondition = Elem1 <= Elem2
      Case Else: MsgBox "Erreur : Condition " & Operator & " Non prévue"
     End Select
    End Function
    que tu invoques depuis une ligne de code comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub t()
     Dim Oper As String
     Oper = "<"
     If IsCondition(Cells(2, 4), Cells(2, 5), Oper) Then MsgBox "Ok" Else MsgBox " Pas ok"
     End Sub
    J'ai utilisé les objets Cells(Ligne, Colonne) comme dans ton exemple mais il est hautement recommandé de préciser la filiation complète des objets Range, à savoir Feuille et classeur au risque de te retrouver avec de solides soucis.
    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 averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 21
    Par défaut
    Merci de t'être penché sur mon problème
    Je vais tâcher de modifier demain, mon code selon tes conseils
    (ça va me prendre quelques heures, le temps d'en assimiler le fonctionnement)

    Bonne soirée à tous

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

Discussions similaires

  1. [PHP 5.2] problème de tirer dans variable transmise par url
    Par kidas dans le forum Langage
    Réponses: 4
    Dernier message: 08/11/2009, 14h42
  2. problème avec espace dans variable
    Par REMACC1 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 18/08/2009, 10h47
  3. [Problème] Recherche précise dans variable
    Par maloute80 dans le forum Langage
    Réponses: 12
    Dernier message: 10/12/2007, 13h37
  4. PRoblème d'apostrophe dans variable.
    Par jbidou88 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/06/2007, 14h57
  5. Réponses: 4
    Dernier message: 29/08/2006, 16h37

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