2016-12-05 13 views
1

내 함수가 서브 루틴 내에서 완벽하게 작동하는 이상한 문제가 있습니다. 그러나 셀에서 사용하려고하면 첫 번째 값만 반환됩니다. 의도 한 기능은 vlookup과 유사하게 작동하지만 모든 고유 값을 갖는 쉼표로 구분 된 문자열을 제공합니다.VBA : 함수는 서브 루틴 내에서 작동하지만 시트에는 작동하지 않습니다

루프를 do 루프로 좁혔습니다. 나는 또한 while 루프를 사용하여 루프 재 작성을 시도했지만 동일한 결과를 얻었다.

Option Explicit 

Function vconc(ByVal val_ As String, ByVal rng As Range, ByVal offset_ As Integer) As String 
Dim s As String 
Dim col_ As Variant 
Dim c As Range 
Dim firstAddress As String 

Set col_ = New Collection 
' combination of the .find function and a collection to get a unique list of values 
' works similar to a vlookup, but adds all the unique values to a collection 
With rng 
    Set c = .Find(val_, LookIn:=xlValues) 
    If Not c Is Nothing Then 
     firstAddress = c.Address 
     col_.Add c.Offset(0, offset_), CStr(c.Offset(0, offset_).value) 

     Do 
      ' adding a value with the same key to the collection gives us an error 
      ' but I am interested in a list of unique values, so we simply ignore it 
      On Error Resume Next 
      Set c = .FindNext(c) 
      col_.Add c.Offset(0, offset_).value, CStr(c.Offset(0, offset_).value) 

      ' this debug line only runs if the function is run within a subroutine 
      Debug.Print c.Offset(0, offset_).value 

     Loop While Not c Is Nothing And c.Address <> firstAddress 
    End If 
End With 

' concatenate the strings, seperate by , 
Dim item_ As Variant 
For Each item_ In col_ 
    If s = "" Then 
     s = item_ 
    Else 
     s = s & ", " & item_ 
    End If 
Next item_ 

vconc = s 

End Function 

편집 : SJR의 조언에 따라 나는

Set c = .Find(val_, after:=c, LookIn:=xlValues) 
+2

어떤 이유로 FindNext가 UDF에서 제대로 작동하지 않습니다. 찾기를 사용해야합니다. – SJR

+0

할렐루야! 정말 고맙습니다. 인터넷 검색에 대해 생각하지 않으 셨습니다 ... 왜 이것이 아직 해결되지 않은 지 궁금합니다 ... – doge

답변

0

내가 가상 맥주를 내기 할 수있다이 라인으로 findnext 라인

Set c = .FindNext(c) 

을 대체하여이 문제를 해결 할 수 있었다 그 오류는 다음에 있습니다.

With rng 
,210

적는다 버전 (모듈 및 시트) 모두

debug.print rng.address 
debug.print rng.parent.name 

하여 결과를 확인한다.

+0

불행히도 같은 범위, $ B : $ B 및 동일한 시트 이름을 얻을 수 있습니다. 제안이오고있어,이 일은 나를 미치게한다. – doge