/ / #VALUE pri kopírovaní hárkov - excel, vba, užívateľom definované funkcie, hodnota, udf

#VALUE chyba pri kopírovaní hárkov - excel, vba, užívateľom definované funkcie, hodnota, udf

Používam UDF, ktorý je v zásade zjednodušený vlookup. Tu je kód:

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

Všimol som si, že niekedy pri kopírovaní hárkov (v rámci toho istého pracovného zošitu) dostanem a #VALUE chyba. Ak "upravím" bunku v programe Excel, nemením nič, len pomocou F2 a Enter, chyba zmizne. Stalo sa to, keď ste jednoducho menili okná (napríklad do Firefoxu a späť do programu Excel). Preto som použil Caller a Parent toľko v kóde. Je takmer úplne pevná, s výnimkou niekedy pri kopírovaní hárkov. Nemôžem nájsť zdroj chyby. Pomoc prosím.

odpovede:

1 pre odpoveď č. 1

Viem, že to nie je vaša presná otázka, ale ak je to možné, odporúčam jednoducho vyhnúť sa VBA úplne, ak to vôbec nie je, a napíšte svoj vzorec nasledovne:

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

a XXXXX môže byť rovnaké ako vaše Columna premennej momentálne.

To by zaručilo, že váš kód pracuje podľa potreby.


Vzhľadom na to, čo bolo diskutované v komentároch a snažiť sa o svoje absolútne najlepšie zabezpečiť, aby to fungovalo, v skutočnosti nevidím nič zlé s vaším kódom a som len HĽADAŤ, že to môže mať niečo spoločné s Application.Caller.

Keď sa mi to stane, pokúsim sa čo najlepšie len použiť ladiaci nástroj, aby som zistil, prečo to zvyčajne zahŕňa Stop vyhlásenia, aby ste mohli prejsť do kódu a zistiť, čo sa stalo alebo Debug.Print Err.Description druh správ.

Či tak alebo onak, som sa pokúsil zlomiť každú časť dolu, takže aspoň vidíte, odkiaľ pochádza otázka. Aby som tak urobil, opätovne som pracoval na svojej funkcii (s nejakou veľkou nadmernou prácou) ....

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

(Tiež si všimnite, že som sa zmenil Application.WorksheetFunction.VLookup na Application.VLookup - Pozri na tento odkaz pre vysvetlenie)

Akonáhle to príde na to, tak by som odstrániť kód chyby z funkcie, pretože to nie je dobrý nápad pre výrobný kód - Len pre ladenie.

Dúfajme, že vám dá odpovede, ktoré hľadáte.

Dúfam, že to pomôže ....


UPDATE # 2:

Ak zoberieme do úvahy možnosť, že táto chyba spôsobuje kopírovanie hárku, je tu test na zistenie, či sa proces opravený:

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 pre odpoveď č. 2

Nie je potrebné používať volajúceho a rodičov.

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

príklad vzoru v bunke ...

= SUELDOBASICO (C10, "Escalas Salariales" $ A $ 3: $ DJ 23 dolárov)