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
3 Réponses :
sauf si je manque quelque chose: < img src = "https://i.stack.imgur.com/lqrer.png" alt = "Entrez la description de l'image ici"> p> p>
Étant donné que cette Q est très sur les conversions de type variantes et implicites, il convient de noter que code> code> et ucase code> prend et renvoie un variante code>, tandis que < Code> Trim $ code> et Ucase $ code> Prenez et renvoyez une chaîne code>. Je serais allé avec strcomp code> 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 code> la valeur, qui ne peut pas être contrainte dans une chaîne code> code> - mais Excel gérera cela, je pense. Très élégant, avancé.
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: p> 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) p> p>
Cette version modifiée (et l'original aussi) fonctionnera si et seulement si i> vous incluez option comparer le texte code>. 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
Par souci de futurs lecteurs:
La racine du problème est la sensibilité des cas, résolus en assurant une comparaison sont par Voici la preuve 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> Texte code> et non Binary code> 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
Les commentaires ne sont pas pour une discussion prolongée; Cette conversation a été déplacé vers chat < / a>.