我知道这不是您的确切问题,但是,如果可能的话,我建议您完全避免使用 VBA(如果这是一个选项),并编写如下公式:
=VLOOKUP(INDIRECT("C"&ROW()),'Escalas Salariales'!$A$3:$DJ$23,XXXXX,false)
并且XXXXX
可以与您Columna
当前的变量相同。
这将保证您的代码按需要工作。
鉴于评论中讨论的内容并尽我所能确保它有效,我实际上没有看到您的代码有任何问题,我只是猜测它可能与Application.Caller
.
当这种事情发生在我身上时,我会尽力使用调试器来找出原因 - 这通常涉及Stop
能够进入代码并查看发生了什么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
为Application.VLookup
- 查看此链接以获取解释)
但是,一旦弄清楚了,我会从函数中删除错误代码,因为这对于生产代码不是一个好主意-仅用于调试。
希望这可以给你你正在寻找的答案。
希望有帮助....
更新#2:
考虑到复制工作表导致此错误的可能性,这里有一个测试,看看该过程是否得到修复:
Function SUELDOBASICO(Columna As Integer) As Double
On Error GoTo ErrorCheck
Dim NumTimesErrored As Integer
Dim StartTime As Double
Dim WaitSeconds As Integer
NumTimesErrored = 0
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:
' This will make it tries this "hack" up to 3 times:
If NumTimesErrored < 3 Then
StartTime = Now
WaitSeconds = 1 ' Wait one second
Loop While Now - TimeStart < TimeSerial(0, 0, WaitSeconds)
DoEvents ' Allows all the other processes to complete
Loop
' Increment the number of times you've tried this:
NumTimesErrored = NumTimesErrored + 1
' Go back to the calculation step that errored
Resume
End If
Stop
Resume
End Function