2014-02-17 6 views
0

는이 코드가 있습니다왜이 유형이 일치하지 않습니까?

Public Function MultiVLookup(MatchWith As String, TRange As Range, col_index_num As Integer) 
    If (MatchWith = "") Then 
     MultiVLookup = "" 
    Else 
     For Each cell In TRange 
      a1 = cell.Value 
      a2 = CStr(a1) 'FAILURE IN THIS LINE 
      b = CStr(MatchWith) 
      If (a2 = b) Then 
       x = x & cell.Offset(0, col_index_num).Value & ", " 
      End If 
     Next cell 
     If (x = "") Then 
      MultiVLookup = "" 
     Else 
      MultiVLookup = Left(x, Len(x) - 2) 
     End If 
    End If 
End Function 

을 나는 다음과 같이 호출 :

L_CurrentService = MultiVLookup(L_CurrentCI, Sheets("Servicios").Columns("C"), 2) 

을하지만 형식 불일치 위에서 표시 줄에 실패하고 그 이유를 찾을 관리하지 않습니다.

왜 CStr()을 그렇게 호출 할 수 없습니까?

+0

a1의 유형은 무엇입니까? 그것에 대한 typename을 호출하십시오 : MsgBox TypeName (a1) – Rob

답변

1

먼저 메모를 할 해결하려면 : 당신이 TRange parametr (.Range("C:C") 것이 작동)에 대한 인수 .Columns("C")을 사용하고 있기 때문에

함수가 Type mismatch를 반환합니다.

라인 For Each cell In TRange에서 실제로는 으로 반복되지만 셀은 그렇지 않습니다. 즉, cell 변수에 전체 열이 포함되어 있음을 의미합니다.

For Each cell In TRange 바로 뒤에 추가하여 쉽게 확인할 수 있습니다. $C:$C 메시지가 표시됩니다.

enter image description here

둘째 주 :

귀하의 코드는 매우 uneffective ..For Excel 2007의 하고 나중에 당신이하는 모든 1048576 개 세포를 통해 루프. 대신 Find 방법을 사용하는 것이 좋습니다.

Public Function MultiVLookup(MatchWith As String, TRange As Range, col_index_num As Integer) As String 
    Dim rng As Range 
    Dim res As String   
    Dim sAddr As String 

    MultiVLookup = "" 

    If MatchWith = "" Then Exit Function 

    With TRange 
     Set rng = .Find(What:=MatchWith, LookAt:=xlWhole, MatchCase:=False) 
     If Not rng Is Nothing Then 
      sAddr = rng.Address 
      Do 
       res = res & rng.Offset(0, col_index_num).Value & ", " 
       Set rng = .FindNext(rng) 
       If rng Is Nothing Then Exit Do 
      Loop While rng.Address <> sAddr 
     End If 
    End With 

    If res <> "" Then MultiVLookup = Left(res, Len(res) - 2) 
End Function 
1

for 루프를 변경하여 셀을 참조해야합니다. 현재로서는 배열로 가져옵니다. 이

'add the .Cells to the TRange to reference each cell 
For Each cell In TRange.Cells 
+0

이 솔루션은 simoco에서 제공하는 것보다 더 일반적입니다. 그러나이 방법은 더 잘 설명 되었기 때문에 그의 (hers?)를 선택했습니다. – Envite

+0

다음에 자세한 이유를 묻는다면 나는 그 중 하나를 남겨 둘 것입니다. 나는 왜 그런 식으로 cstr()을 호출 할 수 없는지에 대답했다. – Sorceri

관련 문제