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 :

Utiliser un opérateur dans un IF via une variable


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Août 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Août 2017
    Messages : 8
    Par défaut Utiliser un opérateur dans un IF via une variable
    Bonjour,

    J'aimerais pouvoir résoudre le problème suivant. Mon code possède deux boucles t.
    Lors de la première boucle, je veux utiliser l'opérateur ">" dans un IF (en gras rouge) et lors de la deuxième boucle, je veux utiliser l'opérateur "<" dans ce même IF (en gras rouge).
    J'ai tenté le coup avec la variable signe. J'ai tenté d'autres manières mais je n'y parviens pas. Surement juste une question de synthaxe.
    Je pourrais evidemment utiliser un autre If et répéter presque deux fois presque le même code mais ce n'est pas mon but.

    Merci des solutions que vous pourrez m'apporter.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Sub top5_evolution()
        
        For t = 1 To 2
        
        For p = 1 To 3
        
    For w = 1 To 4
    
    If w > 1 Then
        Range("K4").Value = "Product/Period"
        Dim ref As Integer
        ref = 26023 + w - 2 + 5 * (p - 1)
        Range("K5").Formula = "=CONCATENATE(LEFT(D" & ref & ",2*" & w & "-2),""?? *"")"
        Range("A3:I26014").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("K4:K5"), Unique:=False
        
        Range("K4").Value = ""
        Range("K5").Value = ""
        Cells(26025 + w - 2 + 5 * (p - 1), 4).CurrentRegion.Select
        
        selection.Offset(w - 1, 0).Select
        selection.Clear
    End If
    
    Set Table = Range("A1").CurrentRegion
    Table.Offset(3, 0).Resize(Table.Rows.Count - 3, Table.Columns.Count - 0).Copy
    Cells(26025 + w - 2 + 5 * (p - 1) + 15 * (t - 1), 4).PasteSpecial
    selection.Replace What:="", Replacement:="0"
    
    Dim lignes As Integer
    lignes = selection.Rows.Count
    
        selection.End(xlToRight).Select
        selection.Offset(0, 1).Resize(lignes, 1).Select
    
       selection.FormulaR1C1 = "=RC[-3]-RC[-4]"
        
    Dim chiffres As Single
    chiffres = 0
    Set tablecopy = Cells(26025 + w - 2 + 5 * (p - 1) + 15 * (t - 1), 4).CurrentRegion
    Cells(26025 + w - 2 + 5 * (p - 1) + 15 * (t - 1), 13).Activate
    
    Dim signe As String
    
    If t = 1 Then
    signe = ">"
    Else
    signe = "<"
    End If
    
    For i = 1 To tablecopy.Rows.Count
        If ActiveCell & signe & chiffres Then
            chiffres = ActiveCell.Value
            Cells(26024 + w - 2 + 5 * (p - 1) + 15 * (t - 1), 5).Value = chiffres
            ActiveCell.Offset(0, -9).Copy
            Cells(26024 + w - 2 + 5 * (p - 1) + 15 * (t - 1), 4).PasteSpecial
            ActiveCell.Offset(i, 9).Select
        End If
    
    ActiveCell.Offset(1, 0).Select
    Next i
    
    Next w
    
    Cells(26028 + 5 * (p - 1) + 15 * (t - 1), 4).CurrentRegion.Select
    
    selection.Offset(4, 0).Resize(selection.Rows.Count - 4, selection.Columns.Count).Select
    selection.Clear
    
    Next p
    
    Next t
    
    End Sub
    Erreur de type missmatch

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je n'ai pas le temps de corriger ce point, mais travailler à coup de selects pour utiliser Activecell, c'est fortement déconseillé
    il faut également prendre l'habitude d'indiquer la propriété utilisées, ici c'est donc Activecell.Value

    voici une proposition illustrative de ce que pense être ton besoin, si j'ai bien compris
    la fonction Evaluate me semble opportune

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub toto()
    Dim signe As String, chiffre As Long, MaFormule As String
    chiffre = 5
        For t = 1 To 2
            ' attention à ce que la cellule contienne bien un chiffre !!
            ' donc à sécuriser en amont
            MaFormule = ActiveCell.Value & IIf(t = 1, ">", "<") & chiffre
     
            If Evaluate(MaFormule) Then
                MsgBox "condition vérifiée : " & MaFormule
            End If
        Next t
    End Sub
    Mon commentaire au titre de la sécurisation est à prendre en compte également

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Août 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Août 2017
    Messages : 8
    Par défaut
    Merci mais ça ne fonctionne pas.

    Oui la cellule comprend bien un chiffre.

    Le code fonctionnait très bien avant l'introduction de la boucle t. Je me dis donc que l'erreur ne peut venir que de cette variable signe... D'ailleurs, il refonctionne très bien quand je remplace cette variable signe par un opérateur dans le IF. Plus d'erreur mismatch.

    Ou d'une question de synthaxe...

    J'ai introduit cette variable signe pour pouvoir réaliser un même traitement avec des conditions différentes selon que t=1 ou 2

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par cedric.stat Voir le message
    Merci mais ça ne fonctionne pas.
    Oui la cellule comprend bien un chiffre.

    [...]
    Le code fonctionnait très bien avant l'introduction de la boucle t. Je me dis donc que l'erreur ne peut venir que de cette variable signe... D'ailleurs, il refonctionne très bien quand je remplace cette variable signe par un opérateur dans le IF. Plus d'erreur mismatch
    erreur type mismatch (ou incompatibilité de type en français) est à relier à l'usage d'Evaluate dont j'ai parlé
    tu cherches à "estimer" une chaine de caractère qui représente une formule.
    On ne peut pas l'estimer, on doit "l'évaluer"...

    Menhir contourne cet aspect en évitant l'évaluation, il effectue simplement le calcul en utilisant le réel opérateur sans évaluer une formule typée String

    Et si tes cellules ne contiennent pas un nombre, tu obtiendras (même avec Evaluate) une erreur 13
    Sécuriser son code n'est jamais du luxe, même si tu sais qu'il y aura 99,9999% de chance de n'avoir que des nombres.
    Il faut toujours prévoir l'improbable

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Menhir contourne cet aspect en évitant l'évaluation, il effectue simplement le calcul en utilisant le réel opérateur sans évaluer une formule typée String
    Pourquoi s'obstiner dans une voie incertaine et difficile quand il existe une solution fiable, rapide et simple ?

    Sécuriser son code n'est jamais du luxe, même si tu sais qu'il y aura 99,9999% de chance de n'avoir que des nombres.
    Il faut toujours prévoir l'improbable
    Comme l'a énoncé Edward Murphy dans sa célèbre loi : "S'il existe au moins deux façons de faire quelque chose et qu'au moins l'une de ces façons peut entraîner une catastrophe, il se trouvera forcément quelqu'un quelque part pour emprunter cette voie".
    C'est une loi que je garde toujours présente à l'esprit quand je développe une application (ou que je conçois n'importe quoi d'autre).

  6. #6
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Août 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Août 2017
    Messages : 8
    Par défaut
    Merci, ça fonctionne très bien.

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Première chose qui me hérisse le poil : on ne mets JAMAIS de déclaration de variable (Dim) à l'intérieur d'une boucle.
    Pour coder proprement, on ne place pas des déclarations opportuniste à la volée dans le code, on les place en début de code.

    Seconde chose : tu devrais faire des itérations de ligne (décalage vers la droite) plus propres : ça te permettrait (ainsi qu'à d'éventuels lecteurs) de lire plus facilement ton code.

    Cela dit, ceci devrait résoudre ton problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim signe as Long    ' A placer en début de code
     
    [...]
     
    signe = IIf(t=1, 1, -1)
     
    For i = 1 To tablecopy.Rows.Count
      If ActiveCell * signe > chiffres * signe Then

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    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
    Sub test()
    A = 7: B = 6: Operateur = ">"
    If PlusGrandPlusPetit(A, Operateur, B) Then MsgBox A & " " & Operateur & " " & B
     
     
    A = 6: B = 6: Operateur = ">"
    If PlusGrandPlusPetit(A, Operateur, B) Then MsgBox A & " " & Operateur & " " & B
     
     
    A = 6: B = 6: Operateur = "<"
    If PlusGrandPlusPetit(A, Operateur, B) Then MsgBox A & " " & Operateur & " " & B
     
     
    A = 5: B = 6: Operateur = "<"
    If PlusGrandPlusPetit(A, Operateur, B) Then MsgBox A & " " & Operateur & " " & B
    End Sub
    Function PlusGrandPlusPetit(A, Operateur, B) As Boolean
    If (A - B) < 0 And Operateur = "<" Or (A - B) > 0 And Operateur = ">" Then PlusGrandPlusPetit = True
    End Function
    tu peux même rajouter un Or pour "="
    Dernière modification par Invité ; 12/09/2017 à 14h08.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/01/2013, 20h30
  2. Utilisation de final dans les parametres d'une methodes
    Par menzlitsh dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2007, 14h17
  3. [MySQL] Récuperation de données dans un boucle via une requête PHP
    Par bodysplash007 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/04/2007, 11h39
  4. Réponses: 5
    Dernier message: 10/11/2006, 11h00
  5. Mise en forme dans un RTF via une syntaxe personnelle
    Par sqwalichou dans le forum Autres langages
    Réponses: 2
    Dernier message: 24/02/2006, 22h19

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