2017-08-21 62 views
2

我從一個Excel工作表中提取值到另一個。我用下面的公式:Excel自定義公式與IF語句和INDEX,MATCH返回一個#VALUE錯誤

= IF(ISBLANK(IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1));Error2;IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1)) 

因爲我需要做的計算與提取的數據,我想創建一個自定義功能,將不再需要鍵入其保持不變每次參數簡化了提取過程。所以我建立了以下功能:

Function DataCap(Dates As Variant, Row As Variant) As Variant 

    Dim Range1 As Range 'Define the whole lookup table 
     Set Range1 = Range("Data!A1:P151") 

    Dim Range2 As Range 'Define the date lookup table 
     Set Range2 = Range("Data!A3:P3") 

    Dim Error1 As Range 'Define the error 1; if no value 
     Set Error1 = Range("X16") 

    Dim Error2 As Range 'Define the error 2; if blank 
     Set Error2 = Range("Y16") 

    DataCap.Formula "= IF(ISBLANK(IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1));Error2;IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1))" 


End Function 

當我運行它時,我得到#VALUE錯誤。如果我直接在單元格中粘貼方程(使用相同的參數),它會按預期工作。所以,我認爲問題在於VBA無法進行計算。任何建議如何解決這個問題?

感謝您的幫助提前

+0

您是否將'Range','Range2','Error1'和'Error2'定義爲命名範圍? –

+0

您不能在公式中使用VBA變量名稱,並且您需要在公式字符串中使用逗號而不是分號。 – Rory

+0

@RobinMackenzie,範圍,範圍2等僅在代碼中定義,而不是在Excel表格中定義。 – Mark

回答

1

沒有能夠測試它在你的數據我不能肯定這是否會工作,但它可能至少能夠更你指出正確的方向。

Public Function DCap(xDates As Variant, xRow As Variant) 
Dim Range1 As Range, Range2 As Range, Error1 As Range, Error2 As Range 

Set Range1 = ActiveWorkbook.Sheets("Data").Range("A1:P151") 
Set Range2 = ActiveWorkbook.Sheets("Data").Range("A3:P3") 

Set Error1 = ActiveWorkbook.ActiveSheet.Range("X16") 
Set Error2 = ActiveWorkbook.ActiveSheet.Range("Y16") 

On Error Resume Next 
If IsError(WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0))) Then 
    DCap = Error1 
ElseIf Len(WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0))) = 0 Then 
    DCap = Error2 
Else 
    DCap = WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0)) 
End If 
On Error GoTo 0 

End Function 
+0

這是完美的。非常感謝你。 – Mark

+0

你能否也請解釋一下,在我原來的腳本中是什麼導致了問題,所以我知道下一次? – Mark

+1

VBA函數將始終返回一個值,而不是一個公式(因爲實質上函數是公式),所以試圖圍繞該模型構建主要是我做的不同。我只是將公式分解到它的基本部分,並在VBA中重新編寫它,使用WorksheetFunction(在適用的情況下保持它的操作與它原來的寫法類似)。第一個If'檢查'Index'是否是錯誤,如果是,則返回Error1;第二個'If'檢查'Index'是否爲空(即長度= 0),如果是,則返回Error2;如果這兩個都不正確,則返回索引。 –