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