0
votes

Retourner différents types d'une fonction

J'ai donc une fonction que j'ai écrit que les chèques si la chaîne qui est donnée est vraie, fausse ou autre chose. Si c'est vrai, je veux qu'il retourne le booléen vrai, si c'est faux, je veux retourner le falome booléen, et si c'est autre chose, je veux que cela continue de retourner la chaîne.

Public Function ConvertToBoolean(InputString As String) As Variant
Dim TempResults As Variant


    If InputString = "True" Then
        TempResults = True
    ElseIf InputString = "False" Then
        TempResults = False
    Else
        TempResults = InputString
    End If

    ConvertToBoolean = TempResults


End Function


1 commentaires

Les commentaires ne sont pas pour une discussion prolongée; Cette conversation a été déplacé vers chat < / a>.


3 Réponses :


3
votes

1 commentaires

Étant donné que cette Q est très sur les conversions de type variantes et implicites, il convient de noter que et ucase prend et renvoie un variante , tandis que < Code> Trim $ et Ucase $ Prenez et renvoyez une chaîne . Je serais allé avec strcomp au lieu de la mise en hausse de l'entrée, mais ce code n'a aucune raison de faire défaut ou d'échouer autrement, sauvegardez pour une incompatibilité de type si la cellule d'entrée contient réellement une feuille de calcul la valeur, qui ne peut pas être contrainte dans une chaîne - mais Excel gérera cela, je pense. Très élégant, avancé.



-2
votes

Tellement de merci à @Matheuguindon pour m'expliquer exactement comment les variantes ont fonctionné et me dirigeons sur le bon chemin.

avec cela, mon code est maintenant: xxx

bien sûr, comme @Mathieuguindon mentionné, si vous souhaitez faire fonctionner ce code, (par opposition à être un "Forcer l'exercice de type"), vous voudrez ajouter StrComp () (préférable) ou une option Comparer le texte (moins préférable, apparemment en buggy)


2 commentaires

Cette version modifiée (et l'original aussi) fonctionnera si et seulement si vous incluez option comparer le texte . Je sais que vous avez dit que vous aviez cette ligne, mais la seule façon de reproduire votre problème est de l'omettre (identique pour les deux versions de votre code)


@chrisneilsen: Oui, cela fait fonctionner le code de la façon dont il est censé, mais n'a peu rien à voir avec la question que je demandais



3
votes

Par souci de futurs lecteurs:

La racine du problème est la sensibilité des cas, résolus en assurant une comparaison sont par Texte code> et non Binary code> p>

Voici la preuve p>

 Entrez la description de l'image ici p>

Notez que les valeurs booléennes affichent le majuscule, le centre aligné. Valeurs de chaîne dans l'étui d'orignal, laissé aligné, les nombres sont alignés à droite. P>

Voici une version, optimisée pour gérer les erreurs, les numéros et les auto-contenus pour les tests basés sur des textes (c'était pas em> le version utilisée dans les tests ci-dessous, car elle contient des fonctionnalités supplémentaires) p>

Sub Test2()
    Dim n As Long, i As Long, j As Long
    Dim T1 As Single, T2 As Single, T3 As Single, T4 As Single
    Dim res As Variant

    Dim Dat2(1 To 5) As String
    Dat2(1) = "true"
    Dat2(2) = "false"
    Dat2(3) = "   true"
    Dat2(4) = "zx"
    Dat2(5) = ""
    Dim cl As Range

    Application.Calculation = xlCalculationManual

    n = 1000000
    T1 = Timer()
    For i = 1 To n
        For j = 1 To 5
            res = ConvertToBoolean3(Dat2(j))
        Next
    Next
    T2 = Timer()

    T3 = Timer()
    For i = 1 To n
        For j = 1 To 5
            res = ConvertToBoolean4(Dat2(j))
        Next
    Next
    T4 = Timer()

    'Verion 3 mine
    [J22] = (T2 - T1) / n * 1000000#
    'Verion 4 david
    [K22] = (T4 - T3) / n * 1000000#


    n = n / 100
    Set cl = [j10:j15]
    T1 = Timer()
    For i = 1 To n
        cl.Calculate
    Next
    T2 = Timer()

    Set cl = [K10:K15]
    T3 = Timer()
    For i = 1 To n
        cl.Calculate
    Next
    T4 = Timer()

    'Verion 3 mine  UDF
    [J23] = (T2 - T1) / n * 1000000#
    'Verion 4 david UDF
    [K23] = (T4 - T3) / n * 1000000#


End Sub


0 commentaires