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-Comparaison du signe de nombres entiers


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
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2016
    Messages : 16
    Par défaut VBA-Comparaison du signe de nombres entiers
    Bonjour à tous et à toutes,

    Après avoir cherché quelques temps je ne suis pas sûr qu'une fonction répondant à mes problèmes existe sous VBA ou sous Excel. Mon souci est pourtant, en apparence, tout simple :
    Je cherche à savoir si deux nombres sont du même signe, et à poser une condition du type "If (a-b) est du même signe que (c-d) Then..." 'où a, b, c et d sont des entiers, ou dans le cas qui me préoccupe, les valeurs contenues dans des cellules).
    J'avais tout d'abord posé la condition suivante (i et j sont des entiers permettant de passer d'une ligne/colonne à l'autre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If (Cells(i, 3).Value - Cells(i, 4).Value > 0 And Cells(i, j).Value - Cells(i, j + 1).Value > 0) Or 
       (Cells(i, 3).Value - Cells(i, 4).Value < 0 And Cells(i, j).Value - Cells(i, j + 1).Value < 0) Or 
       (Cells(i, 3).Value - Cells(i, 4).Value = 0 And Cells(i, j).Value - Cells(i, j + 1).Value = 0) Then
    En utilisant cette condition, ma macro ne donne pas ensuite la bonne valeur, et vu sa taille, je préfèrerais avoir quelque chose de moins confus, pour rechercher plus efficacement l'erreur par moi-même... Avez-vous des pistes qui pourraient m'aider?
    Merci beaucoup et bonne journée.

  2. #2
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Peut-on avoir la totalité du code? La partie à réaliser si la condition est vérifiée.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2016
    Messages : 16
    Par défaut
    Bonjour,

    Merci de votre réponse. Je vous mets la macro en entier, mais elle est peut-être un peu dense...

    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
    Option Explicit
     
    Sub Test_Points()
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''' INITIALISATION DES VARIABLES '''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim pasligne As Integer
    Dim numNom As Integer
    Dim compteur As Integer
    compteur = 3
     
    Dim ComptPoints() As Integer
    ReDim ComptPoints(compteur - 1)
    For i = 0 To compteur - 1
        ComptPoints(i) = 0
    Next i
     
    Dim Noms(2) As String
    Noms(0) = "fgfrgfgfgr"
    Noms(1) = "dddszdsd"
    Noms(2) = "Félix"
     
     
     
     
    'Maintenant on compare les résultats réels aux pronostics de chacun (feuille "Poules")
    'On comptabilise les points dans une liste (points/joueurs)
    'On entre ensuite le total des points pour le joueur correspondant dans la feuille "Prono-Points"
     
    'For pasligne = 9 To 64 Step 11  'Boucle pour regarder tous les groupes
        pasligne = 9
        For i = pasligne To pasligne + 5    'Boucle pour regarder tous les matchs d'un groupe
            For j = 20 To (20 + 6 * (compteur - 1)) Step 6 'Boucle pour regarder tous les noms, valeur de fin arbitraire
     
                'On ne regarde que les matchs dont le résultat a été correctement pronostiqué.
                'On affine aussi en regardant les matchs où le score a été correctement pronostiqué.
                If (Cells(i, 3).Value - Cells(i, 4).Value > 0 And Cells(i, j).Value - Cells(i, j + 1).Value > 0) Or (Cells(i, 3).Value - Cells(i, 4).Value < 0 And Cells(i, j).Value - Cells(i, j + 1).Value < 0) Or (Cells(i, 3).Value - Cells(i, 4).Value = 0 And Cells(i, j).Value - Cells(i, j + 1).Value = 0) Then
                    'On regarde les scores devinés parfaitement
                    If Cells(i, 3).Value = Cells(i, j).Value And Cells(i, 4).Value = Cells(i, j + 1).Value Then
                        For k = 0 To compteur - 1
                            If Cells(3, j).Value = Noms(k) Then
                                ComptPoints(k) = ComptPoints(k) + 3
                            End If
                        Next k
                    End If
     
                    'Le score est faux mais le résultat est bon
                    Else
                        For k = 0 To compteur - 1
                            If Cells(3, j).Value = Noms(k) Then
                                ComptPoints(k) = ComptPoints(k) + 1
                            End If
                        Next k
                End If
            Next j
        Next i
    'Next pasligne
     
    For i = 0 To compteur - 1
        MsgBox ("Le nombre de points de " & Noms(i) & " est " & ComptPoints(i) & " points")
    Next i
     
     
     
     
    End Sub
    Il s'agit d'un fichier contenant des tableaux de rencontres d'équipes de foot. La macro compare les pronostics aux résultats réels, et ajoute tant de points dans une liste (ComptPoints). Il y a aussi une condition qui assure qu'on attribue le bon nombre de points à chaque joueur (dont les noms sont contenus dans Noms).
    La boucle For sur pasligne est en commentaire : normalement elle assure qu'on passe d'un tableau de rencontres à l'autre, mais j'ai d'abord préféré regarder la fiabilité de ma macro en me basant sur un seul tableau.

  4. #4
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Bonjour,

    Je te conseille d'utiliser la fonction Sgn(nombre)
    Elle renvoie 1 si le nombre est positif, 0 s'il est égal à 0 et -1 s'il est négatif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Sgn(Cells(i, 3).Value - Cells(i, 4).Value) =  Sgn(Cells(i, j).Value - Cells(i, j + 1).Value) then
    Bonne journée !

  5. #5
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Une proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function MemeSigne(ByVal a As Double, ByVal b As Double) As Boolean
        Select Case a
            Case Is > 0
                MemeSigne = b > 0
            Case Is < 0
                MemeSigne = b < 0
            Case 0
                MemeSigne = b = 0
        End Select
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
        Dim a&, b&
            With ActiveSheet
            '    For i
            '        For j
                        a = .Cells(i, 3) - .Cells(i, 4)
                        b = .Cells(i, j) - Cells(i, j + 1)
                        If MemeSigne(a, b) Then
                            'suite du code
                        End If
            '        Next j
            '    Next i
            End With
    End Sub

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2016
    Messages : 16
    Par défaut
    Merci pour ces réponses, toutes rapides et claires! Cela va beaucoup me servir, y compris le récapitulatif des fonctions dans l'aide VBA...
    Bonne après-midi!

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Juste pour l'exercice. Là tu à même la direction du déséquilibre !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function ComparSigne(v1 As Double, v2 As Double) As Integer
    Dim v As Double
        v = (Sqr(v1 ^ 2) / v1) - (Sqr(v2 ^ 2) / v2)
        ComparSigne = v
    End Function
    Sub test()
    Debug.Print ComparSigne(1, 1)
    Debug.Print ComparSigne(-1, -1)
    Debug.Print ComparSigne(-1, 1)
    Debug.Print ComparSigne(1, -1)
    End Sub
    retourne Vrai/Faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    Debug.Print MemeSigne(1, 1)
    Debug.Print MemeSigne(-1, -1)
    Debug.Print MemeSigne(-1, 1)
    Debug.Print MemeSigne(1, -1)
    End Sub
    Function MemeSigne(v1 As Double, v2 As Double) As Boolean
    '((Abs(v1) / v1)= 1 ou -1 ;  (Abs(v2) / v2))=1 ou -1 ; 1-1=0 : -1 - -1 =0 : 1 - -1=2: -1 - 1 = -2 ; 
    MemeSigne = Not CBool((Abs(v1) / v1) - (Abs(v2) / v2))
     End Function
    Dernière modification par Invité ; 08/06/2016 à 14h36.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2016
    Messages : 16
    Par défaut
    Merci, je garde tout ça dans un coin de ma tête!

  9. #9
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Sgn(Cells(i, 3).Value - Cells(i, 4).Value) = Sgn(Cells(i, j).Value - Cells(i, j + 1).Value) Then
    N'oublie pas que dans l'aide VBA se trouve la liste de toutes les fonctions.
    https://msdn.microsoft.com/fr-fr/lib.../jj692811.aspx

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/07/2015, 09h48
  2. comparaison entre deux nombres entier
    Par info.pascal dans le forum Débuter
    Réponses: 6
    Dernier message: 08/02/2013, 02h07
  3. Réponses: 6
    Dernier message: 08/06/2012, 14h42
  4. Réponses: 9
    Dernier message: 12/10/2006, 01h36
  5. [LG]Former un nombre entier à partir de chiffre naturel.
    Par lecanardjaune dans le forum Langage
    Réponses: 2
    Dernier message: 12/11/2003, 23h36

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