0

我正在使用一个基本上是简化的 vlookup 的 UDF。这是代码:

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 中“编辑”单元格,不做任何更改,只使用F2and Enter,错误就会消失。它曾经在简单地更改窗口时发生(例如,切换到 Firefox,然后再切换回 Excel)。这就是为什么我在代码中使用CallerParent这么多。它几乎完全固定,除了有时复印纸张时。我似乎无法找到错误的根源。请帮忙。

4

2 回答 2

1

我知道这不是您的确切问题,但是,如果可能的话,我建议您完全避免使用 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.VLookupApplication.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
于 2015-08-06T14:32:31.577 回答
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'!$A$3:$DJ$23)

于 2015-08-06T14:30:17.270 回答