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? Вызывайте имя на нем: MsgBox TypeName (a1) – Rob

ответ

1

Первая нота:

Ваша функция возвращает Type mismatch, потому что вы используете аргумент .Columns("C") для TRange Parametr (для .Range("C:C") он работает).

В строке For Each cell In TRange вы фактически прокручиваете столбцы, но не ячейки. Это означает, что переменная cell содержит всю колонку.

Вы можете легко проверить это, добавив строку Debug.Print cell.Address сразу после For Each cell In TRange - вы получите сообщение $C:$C.

enter image description here

Второе примечание:

Ваш код весьма неэффективен ..для 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

Это решение является более общим, чем одно из симоко, но я выбрал его (ее?), Потому что это лучше объяснить. – Envite

+0

в следующий раз прошу подробный причина, и оставлю. Я ответил, почему вы не можете называть cstr(). – Sorceri

Смежные вопросы