2017-06-16 46 views
1

我知道這個函數可以正常工作,但是當我試圖在我的電子表格中填充時,它幾乎立即導致Excel崩潰。當我進入調試模式時,它告訴我End If有一個問題。我相信這是正確的,因爲End If結束了前面的If語句。VBA:Excel結束時崩潰如果

Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long) 

'Update 20150310 
Dim rng As Range 
Dim xResult As String 

xResult = "" 
For Each rng In pWorkRng 
    If rng = pValue Then 
     xResult = xResult & " " & rng.Offset(0, pIndex - 1) 
    End If '<-- crashes here 
Next 
MYVLOOKUP = xResult 
End Function 
+0

)只是一個供參考,這可以在辦公室完成365 Excel中與新TEXTJOIN(公式作爲數組'= TEXTJOIN(「」,TRUE,IF(LookupRange = pValue,ResultRange,「」))'用Ctrl-Shift-Enter確認。 –

+0

'結束如果'沒問題,確切的錯誤是什麼?通過崩潰你的意思是崩潰到桌面或運行時錯誤,如果是這樣的話是什麼? –

+0

內存不足? –

回答

1

允許極限的循環來僅在第一列和關於片材所使用的區域:

Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long) 

'Update 20150310 
Dim rng As Range 
Dim xResult As String 
'resets the range to only the first column and the used range. 
'this will limit the cycling to the smallest possible range. 
Set pWorkRng = Intersect(pWorkRng.Columns(1), pWorkRng.Parent.UsedRange) 

xResult = "" 
For Each rng In pWorkRng 
    If rng = pValue Then 
     xResult = xResult & " " & rng.Offset(0, pIndex - 1) 
    End If 
Next 
MYVLOOKUP = xResult 
End Function 
+0

也許也可以將它改成一個數組,然後再使用這個數組.. –

+0

@Nathan_Sav我想到了這一點,但不知道OP如何使用這個公式,這使得它很難。如果OP沒有把整個範圍的值,但只有第一列,並讓偏移做第二維的工作,這使得很難把數組。 –

+0

我相信這有效。對於那些想知道的情況,我正在匹配一個約有525個名字的清單,其中有7000個名字,每個名字前面都有一個角色。我需要將這些角色附加到525個名稱中的每一個。基本上在一個電子表格上Bob是一個經理,而在另一個表上Bob可以扮演很多角色 –