我使用的UDF基本上是一个简化的vlookup。这是代码:
Function SUELDOBASICO(Columna As Integer) As Double
SUELDOBASICO = Application.WorksheetFunction.VLookup(Application.Caller.Parent.Cells(Application.Caller.Row, 3), Application.Caller.Parent.Parent.Sheets("Escalas Salariales").Range("A3:DJ23"), Columna, False)
End Function
我注意到有时在复制工作表(在同一工作簿中)时,出现#VALUE
错误。如果我在Excel中“编辑”单元格,只更改任何内容,只需使用F2
和Enter
,错误就会消失。它曾经发生在简单地改变窗口(例如Firefox,然后回到Excel)。这就是我在代码中使用Caller
和Parent
这么多的原因。它几乎完全固定,除非有时复印纸张。我似乎无法找到错误的来源。
请帮助。
答案 0 :(得分:1)
我知道这不是你的确切问题,但是,如果可能的话,我建议完全避免使用VBA,如果这是一个选项,并按如下方式编写公式:
=VLOOKUP(INDIRECT("C"&ROW()),'Escalas Salariales'!$A$3:$DJ$23,XXXXX,false)
和XXXXX
可以与您当前的Columna
变量相同。
这可以保证您的代码可以根据需要运行。
鉴于评论中讨论的内容并尽力确保其有效,我实际上并没有发现您的代码有任何问题,我只是认为它可能与Application.Caller
有关。
当我遇到这种情况时,我会尽量使用调试器找出原因 - 这通常涉及Stop
语句,以便能够进入代码并查看发生的情况或{{ 1}}消息。
无论哪种方式,我试图打破每个部分,所以,至少你可以看到问题的来源。 为此,我重新处理了你的功能(有一些重大的矫枉过正)....
Debug.Print Err.Description
(另请注意,我已将Function SUELDOBASICO(Columna As Integer) As Double
On Error GoTo ErrorCheck
Dim CellRef As Range
Dim LookupRef As Range
Set CellRef = Cells(Application.Caller.Range("A1").Row, 3)
Set LookupRef = Application.Caller.Worksheet.Parent.Sheets("Escalas Salariales").Range("A3:DJ23")
SUELDOBASICO = Application.VLookup(CellRef, LookupRef, Columna, False)
Exit Function
ErrorCheck:
Stop
Resume
End Function
更改为Application.WorksheetFunction.VLookup
- 请查看this link以获取解释)
一旦你搞清楚了,我会从函数中删除错误代码,因为这对于生产代码来说不是一个好主意 - 只是为了调试。
希望能为您提供所需的答案。
希望有所帮助....
更新#2:
考虑到复制工作表导致此错误的可能性,这里是一个测试,看看该过程是否得到修复:
Application.VLookup
答案 1 :(得分:0)
不需要使用来电者和父母。
Function SUELDOBASICO(Cell as Range, LookupRange as range, Columna As Integer) As Double
' When you call the function :
' set Cell to be the cell in column C in the same row
' Set LookupRange to Sheets("Escalas Salariales").Range("$A$3:$DJ$23")
SUELDOBASICO = Application.WorksheetFunction.VLookup(Cell, LookupRange, Columna, False)
End Function
单元格中的公式示例...
= SUELDOBASICO(C10,' Escalas Salariales'!$ 3澳元:$ DJ $ 23)