/ / #VALUE błąd podczas kopiowania arkuszy - excel, vba, funkcje zdefiniowane przez użytkownika, wartość, udf

Błąd #VALUE podczas kopiowania arkuszy - excel, vba, funkcje zdefiniowane przez użytkownika, wartość, udf

Używam UDF, który jest w zasadzie uproszczony vlookup. Oto kod:

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

Zauważyłem, że czasami podczas kopiowania arkuszy (w tym samym skoroszycie) dostaję #VALUE błąd. Jeśli "edytuję" komórkę w Excelu, nic nie zmieniając, tylko za pomocą F2 i Enter, błąd znika. Zdarzyło się to po prostu przy zmianie okna (na przykład do przeglądarki Firefox i z powrotem do Excela). Właśnie dlatego użyłem Caller i Parent tyle w kodzie. Jest prawie całkowicie naprawiony, z wyjątkiem sytuacji, gdy czasami kopiujesz arkusze. Nie mogę znaleźć źródła błędu. Prosimy o pomoc.

Odpowiedzi:

1 dla odpowiedzi № 1

Wiem, że to nie jest twoje dokładne pytanie, ale jeśli w ogóle to możliwe, proponuję po prostu całkowicie uniknąć VBA, jeśli to w ogóle opcja i napisać swoją formułę w następujący sposób:

=VLOOKUP(INDIRECT("C"&ROW()),"Escalas Salariales"!$A$3:$DJ$23,XXXXX,false)

i XXXXX może być taki sam jak twój Columna zmienna obecnie.

To zagwarantowałoby, że twój kod zadziała w razie potrzeby.


Biorąc pod uwagę to, co zostało omówione w komentarzach i staram się jak najlepiej to zagwarantować, w rzeczywistości nie widzę niczego złego w twoim kodzie i po prostu PODKREŚLAJĄ, że może to mieć coś wspólnego z Application.Caller.

Kiedy takie rzeczy mi się przydarzą, staram się po prostu użyć debuggera, aby dowiedzieć się, dlaczego tak się dzieje Stop oświadczenia, aby móc wkroczyć w kod i zobaczyć, co się stało lub Debug.Print Err.Description rodzaj wiadomości.

Tak czy inaczej, próbowałem złamać każdą część, więc przynajmniej możesz zobaczyć, skąd bierze się ten problem. Aby to zrobić, ponownie przepracowałem twoją funkcję (z poważną przesadą) ....

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

(Zwróć też uwagę, że się zmieniłem Application.WorksheetFunction.VLookup do Application.VLookup - Patrzeć na ten link dla wyjaśnienia)

Gdy się zorientujesz, to jednak usunę kod błędu z funkcji, ponieważ nie jest to dobry pomysł na kod produkcyjny - tylko do debugowania.

Mam nadzieję, że może dać ci odpowiedzi, których szukasz.

Nadzieję, że pomaga ....


AKTUALIZACJA # 2:

Biorąc pod uwagę możliwość, że kopiowanie arkusza powoduje ten błąd, tutaj jest test, aby sprawdzić, czy proces zostanie naprawiony:

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 dla odpowiedzi nr 2

Nie ma potrzeby korzystania z rozmówcy i rodzica.

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

przykład formuły w komórce ...

= SUELDOBASICO (C10, "Escalas Salariales"! $ A 3 $: DJ 23 $)