Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Ptitdark

[Résolu]2 variables égales mais pas équivalentes

Messages recommandés

Yo !

 

Alors dans un tableau excel je récupère la valeur d'une cellule, je stock cette valeur dans un variable de type string, le format de cette variable est du texte.

 

Je la compare à une autre variable qui est l'extraction d'une chaine de caractères d'un nom de feuille excel, cette variable est aussi une string.

 

Quand je les affiche dans une msgbox les 2 variables sont identiques. Mais si je fais un test d'égalité ça me dit faux.

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

 

  Dim NumColQuartile As Integer, NumLigneAllExec As Integer, NumLigneQuartile As Integer

  Dim PlaceTiret As Integer

  Dim FeuilleDonnees As Worksheet, FeuilleQuartile As Worksheet, FeuilleEnCours As Worksheet

  Dim NomFeuilleEnCours As String

  Dim TypeBand As String, TypeSalaire As String

  Dim NomCol As String, FonctionCol As String, Entite As String

  Dim Bande As String, Fct As String, WkEnt As String

 

  'Je récupère le nom de la feuille qui contient les données pour un usage futur

  Set FeuilleDonnees = Worksheets("All exec.")

  'Je récupère le nom de la feuille active

  Set FeuilleEnCours = ActiveSheet

  NomFeuilleEnCours = FeuilleEnCours.Name

 

  'Je regarde si cette feuille contient un tableau à remplir le tiret sert d'indicateur

  PlaceTiret = InStr(1, NomFeuilleEnCours, "-")

 

  ' et de la feuille où on va mettre les données

  Set FeuilleQuartile = Worksheets("Tableaux Quartiles")

 

  'Si on est dans une feuille concerné

  If PlaceTiret <> 0 Then

 

    'Je récupère le type du salaire et la band à vérifier

    TypeSalaire = Left(NomFeuilleEnCours, InStr(1, NomFeuilleEnCours, " ") - 1)

    TypeBand = Right(NomFeuilleEnCours, Len(NomFeuilleEnCours) - PlaceTiret - 1)

   

    NumColQuartile = 1

   

    'Tant qu'il y a une colonne à parcourir

    Do Until IsEmpty(FeuilleQuartile.Rows(1).Cells(NumColQuartile))

     

      'Je récupère le nom de la colonne courante

      NomCol = FeuilleQuartile.Rows(1).Cells(NumColQuartile)

     

      'Je récupère la fonction et l'entité

    FonctionCol = Left(NomCol, Len(NomCol) - 2)

      Entite = Right(NomCol, 2)

 

      'J'efface les données précédentes dans la colonne

      'Worksheets("Tableaux Quartiles").Range(NomCol).Clear

     

      NumLigneAllExec = 1

      NumLigneQuartile = 0

     

      'Tant qu'il y a des données dans la feuille All Exec.

      Do Until IsEmpty(FeuilleDonnees.Range("Name").Cells(NumLigneAllExec))

       

        'MsgBox "Ligne Données " & NumLigneAllExec & ": " & FeuilleDonnees.Range("Name").Cells(NumLigneAllExec)

        'Si l employé en cours fait parti de la band, de l entite et de la fonction, son salaire est mis dans la feuille quartile

        Bande = Format(FeuilleDonnees.Range("Reference_Band").Cells(NumLigneAllExec), "")

        Fct = FeuilleDonnees.Range("Function").Cells(NumLigneAllExec)

        WkEnt = FeuilleDonnees.Range("Working_In_Entity").Cells(NumLigneAllExec)

 

        'cette ligne m'a servi a testé si les valeurs sont égales une fois rentré à la main

        'Bande = "toto"

        'TypeBand = "toto"

       

        MsgBox "Test Bande: **" & Bande & "** - TypeBand : **" & TypeBand & "**"

        MsgBox "Test Bande: " & Bande = TypeBand

        MsgBox "Test Fct: " & Fct = FonctionCol

        MsgBox "Test Wkent: " & WkEnt = Entite

        MsgBox "Test if : " & (Bande = TypeBand And Fct = FonctionCol And WkEnt = Entite)

       

        '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                                            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        '                                    C'est ici que le *¤$#§ de if fonctionne pas

        ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                                            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

       

        If Bande = TypeBand And Fonction = FonctionCol And WkEnt = Entite Then

          MsgBox "Je passse dans le If"

          NumLigneQuartile = NumLigneQuartile + 1

          FeuilleQuartile.Columns(NumColQuartile).Cells(NumLigneQuartile) = FeuilleDonnees.Range(TypeSalaire).Cells(NumLigneAllExec)

        End If

       

        NumLigneAllExec = NumLigneAllExec + 1

       

      Loop

     

      NumColQuartile = NumColQuartile + 1

     

    Loop

  End If

End Sub

 

J'ai mis en gras les variables en question.

Pour comprendre le code (que j'ai commenté) :

On a une feuille appelé "All Exec." qui contient un tableau de gens avec leur département, la bande de salaire et leur Entité et les salaires. Le but est lorsqu'on click sur une autre feuille dont le nom est "xxx - TypeBande" où xxx est le type du salaire, il me remplisse une feuille appelée "Tableau Quartiles".

 

A priori c'est un problem de format. Si je fais format (Variable, "") ça ne change pas.

 

Au secours euuuuuh

Modifié par Ptitdark

Partager ce message


Lien à poster
Partager sur d’autres sites

salut,

 

regarde si dans tes variables il y a pas des espaces en trop qui trainent...

 

quand tu les affiches pour débugger ajoute des caractères fixes en début et en fin de chaines comme ça tu passeras pas à coté :P

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

es tu sur que les deux chaines sont du même type? N'y aurait il pas un nombre et une chaine de caractères? Si tu mets Val() ça te convertirait ça non?

 

If Val(Bande) = Val(TypeBand) And Fonction = FonctionCol And WkEnt = Entite

Partager ce message


Lien à poster
Partager sur d’autres sites

Bof, je crois pas. :P

On a tous connu ce genre de pb insoluble :P un jour ou l'autre.

Pour ta gouverne, je crois qu'il y a une autre fonction (que Val()) qui permet également de changer le type d'une chaine. Regarde dans l'aide de VBA (touche F1), je trouve qu'elle est bien faite.

Partager ce message


Lien à poster
Partager sur d’autres sites

Tiens, en VB aussi deux chaines sont comparées par leur référence et non par leur contenu ?

 

<troll>

En C# ils ont embrouillé tout le monde en permettant la comparaison de chaines par "valeur", c'est super-déroutant (pour quiconque a déjà fait du Java ou un n'importe quel autre vrai langage à objets) : prenez deux variables strMachin et strBidule, les deux chaines qu'elles référencent sont identiques, que renvoie la comparaison des références "strMachin == strBidule" ? ... Chez Microsoft, true !

</troll>

Partager ce message


Lien à poster
Partager sur d’autres sites

en fait le val (variable) renvoyait 0 alors forcément c'était égal...

je me suis débrouillé ac StrCompr (à l'orthographe près) qui renvoit 0 si 2 chaines de caractères sont équivalentes.

Donc on a var1 = var2 => faux et strcompr (var1, var2) = 0 => vrai

 

Mouarf mouarf mouarf

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.

×