2009-08-21 80 views
0

所有,問題與VLOOKUP在VBA

我想在一個簡單的VBA函數使用VLOOKUP,但它不斷地返回#VALUE!

下面是代碼:

Public Function getAreaName(UBR As Integer) As String 

    Dim result As String 
    Dim sheet As Worksheet 
    Set sheet = ActiveWorkbook.Sheets("UBR Report") 
    ' check level 3 then 2 then 4 then 5 
    result = Application.WorksheetFunction.VLookup(UBR, sheet.Range("UBRLookup"), Application.WorksheetFunction.Column(sheet.Range("UBRLookup[Level 3]")), False) 
    getAreaName = result 

End Function 

有什麼想法?

回答

2

我不太清楚你想用「UBRLookup [Level 3]」引用做什麼,但正如約瑟夫指出的那樣,這是你做錯的一點。

[不是Excel中命名區域的有效字符。

您引用的列需要是一個數值,這是您定義爲命名範圍的表數組的起始位置的偏移量。

如果您想要拉出的列是您命名範圍中的第二列(例如您所指的[level 3]在第二列中),下面的內容應該可以工作。

Public Function getAreaName(UBR As Integer) As String 

    Dim result As String 
    Dim sheet As Worksheet 
    Set sheet = ActiveWorkbook.Sheets("UBR Report") 
    result = Application.WorksheetFunction.VLookup(UBR, sheet.Range("UBRLookup"), 2, False) 
    getAreaName = result 

End Function 

更新:
我看了一下Excel 2007中,從我所看到的列函數不公開爲Application.WorksheetFunction。 您可以在=Column(D4)的工作表上使用它,但是當嘗試在vba編輯器中自動完成時,該功能不存在。這可能是由於版本的差異,所以現在我會忽略它。

它仍然看起來像你錯在使用第三個參數。如果你真的不想使用數字引用,我們需要找出函數出錯的地方。

線沿線的一些測試

Debug.Print Application.WorksheetFunction.Column(D4) 
Debug.Print sheet.Range("UBRLookup[Level 3]") 

應該有希望幫助告訴你究竟到哪裏去錯了 - 我相信它會反對上述兩種的,但如果它,然後返回一些有用的信息我們可能會更接近您的解決方案。

+0

我使用excel 2007 tablename [column]語法和column()函數來自動確定偏移量。不過,我會嘗試使用手動設置。 – jwoolard 2009-08-21 15:13:22

+0

更新了上述內容。 Debug.Print註釋是否在您的Excel 2007版本上運行? – Andy 2009-08-25 08:51:55

1

打破你的功能到更多的作品。然後調試它並確保每件作品都按照您的期望設置。

例子:

Public Function getAreaName(UBR As Integer) As String 
    Dim result As String 
    Dim sheet As Worksheet 
    Set sheet = ActiveWorkbook.Sheets("UBR Report") 
    Dim range as Range = sheet.Range("UBRLookup") 
    Dim column as Column = Application.WorksheetFunction 
      .Column(sheet.Range("UBRLookup[Level 3]")) 
    result = Application.WorksheetFunction.VLookup(UBR, range, column, False) 
    getAreaName = result 
End Function 

事實上,僅僅通過這樣做,我發現了一些奇怪的。你在兩個不同的地方使用範圍,但在一個地方你要找UBRLookup,而在另一個地方,你正在尋找UBRLookup [Level 3],那是對的嗎?

+0

無法正常工作。列不是有效的數據類型。 -1 – 2009-08-22 11:59:09

+0

@iDevlop它的空碼。一個例子來向他展示我的意思是分手。我不知道Application.WorksheetFunction.Column()返回的結果是一個猜測,這是OP找出的結果。 – Joseph 2009-08-22 14:32:13

1

我被
Dim column as Column =
Application.WorksheetFunction.Column(sheet.Range("UBRLookup[Level 3]"))

你應該昏暗列長,我想,也許用一個變量名,這並不是一個屬性混淆,像lngCol不安。

+0

我很驚訝原始版本甚至編譯。我在Excel 2003中得到「用戶定義類型未定義」,並且在Excel 2007對象模型中看不到一個Column對象 – barrowc 2009-08-22 05:43:43

+0

Right。 它應該是: dim lngCol as long lngCol = sheetx.range(「xxx」)。column – 2009-08-22 12:00:46

0

此部分:sheet.Range(「UBRLookup [Level 3]」)被懷疑爲「UBRLookup [Level 3]」不是有效的範圍名稱。