2009-11-11 5 views
1

J'ai essayé de trouver pourquoi dans le code suivant, la troisième fois à travers la boucle, je reçois une erreur de type 13 non concordance lorsque la ligne "Pour lCount = 0 à maxCount" est en cours évalué. Au départ, je pensais que le problème était d'obtenir la valeur du vArray, mais le test montre qu'il est déclenché par la ligne "For". Je n'ai aucune idée de la façon dont le type serait en train de changer pendant le traitement de la boucle. Merci!VB6 Incompatibilité de type dans la condition de boucle For

Public Function FindCodeIndex(vArray As Variant, MatchValue As String) As Integer 
    ''This function locates a value in a combo box returning the index or -1 if not found 
    Dim lCount As Long 
    Dim maxCount As Long 
    Dim arrayStr As String 


    On Error GoTo ErrorHandler 

    maxCount = UBound(vArray) 


    For lCount = 0 To maxCount 
    arrayStr = vArray(1, lCount) 

     If UCase$(arrayStr) = UCase$(MatchValue) Then 
      FindCodeIndex = Int(lCount) 
      Exit Function 
     End If 
    Next lCount 

    FindCodeIndex = -1 

    Exit Function 


ErrorHandler: 

MsgBox "Unexpected error in frmComment::FindCodeIndex()" & vbCrLf & _ 
      "Error Code: " & CStr(Err.Number) & " Error Desc: " & Err.Description 
+1

Vous n'attribuez 'arrayStr' à aucune valeur. Êtes-vous sûr que ce n'est pas le problème? – Dan

+0

Affectation ajoutée (de la mémoire, pas au travail PC maintenant) à arrayStr. Les tests montrent que la boucle échoue à l'instruction For au troisième passage. – Timbuck

+0

Tim, pouvez-vous utiliser la fenêtre Locals pour voir les données dans le tableau qui est utilisé dans la troisième passe, et éditez votre question pour inclure cette information. –

Répondre

1
Public Function FindCodeIndex(Array() As String, ByVal MatchValue As String) As Long 

    Dim index As Long 
    Dim upper_bound As Long 

    upper_bound= UBound(Array) 
    MatchValue = UCase(MatchValue) 

    For index = 0 To upper_bound 
     If UCase(Array(index)) = MatchValue Then 
      FindCodeIndex = index 
      Exit Function 
     End If 
    Next index 

    FindCodeIndex = -1 

End Function 
+0

VB n'aime vraiment pas cette solution, se plaignant de Array() n'étant pas défini. Le test le plus récent montre que définir un Long = -1 renvoie également une erreur (?) – Timbuck

+0

@Timbuck. 'Array' n'est pas un identifiant valide dans VB6, car il est en conflit avec la fonction' Array' intégrée. –

+0

Exactement, c'est pourquoi je ne sais pas pourquoi ChaosPandion a mis ce code ici, à moins que je ne manque quelque chose. – Timbuck

0

La fonction mentionne que le code est en cours d'écriture pour une zone de liste déroulante (vous copiez en fait chaque élément dans la méthode Liste() dans un tableau et d'envoyer ceci à votre fonction?). Cela semble un peu trop compliqué si vous utilisez le standard VB ComboBox. Utilisez simplement le code suivant:

Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal uMsg As Long, ByRef wParam As Any, ByRef lParam As Any) As Long 

Private Const CB_FINDSTRINGEXACT As Long = &H158 

Public Function FindCodeIndex(ByRef cmb As ComboBox, ByRef sMatchValue As String) As Long 
'This function locates a value in a combo box returning the index or -1 if not found 

    FindCodeIndex = SendMessage(cmb.hWnd, CB_FINDSTRINGEXACT, ByVal -1, ByVal sMatchValue 

End Function 

Il est beaucoup plus rapide et plus petit d'utiliser l'API Windows dans ce cas.

+0

C'est un peu mauvais commentaire de ma part - et aussi lié à une mauvaise décision prise il y a environ dix ans par un autre développeur. Effectivement ce que j'ai est un tableau avec deux lignes, la première étant une liste de descriptions de code et la seconde étant la liste de codes associée. La fonction ci-dessus examine le tableau pour la valeur de code correspondante et définit la liste déroulante listindex = sur la position du tableau où l'élément a été trouvé. La liste déroulante affiche les descriptions de code. – Timbuck

Questions connexes