/ / #VALUE помилка при копіюванні листів - excel, vba, user-defined-functions, value, udf

#VALUE помилка під час копіювання листів - Excel, VBA, визначені користувачем функції, значення, udf

Я використовую 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

Я помітив, що іноді при копіюванні аркушів (у тій же книзі) я отримую a #VALUE помилка Якщо я "редагую" комірку в Excel, нічого не міняю, просто використовую F2 і Enter, помилка зникає. Це відбувалося, коли просто змінювали вікна (наприклад, на Firefox, і назад в Excel). Ось чому я використав Caller і Parent так багато в коді. Це майже повністю фіксується, за винятком коли іноді копіюють аркуші. Я не можу знайти джерело помилки. Допоможіть, будь ласка.

Відповіді:

1 для відповіді № 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.VLookup до Application.VLookup - Подивись на це посилання для пояснення)

Як тільки ви зрозумієте це, я хотів би видалити код помилки з функції, оскільки це не найкраща ідея для коду виробництва - просто для налагодження.

Сподіваємося, що ви зможете дати вам відповіді, які ви шукаєте.

Надія, що допомагає ....


UPDATE # 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

0 для відповіді № 2

Немає необхідності використовувати абонента та батьків.

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)