/ / #VALORE errore durante la copia di fogli - excel, vba, funzioni definite dall'utente, valore, udf

Errore #VALORE durante la copia di fogli - excel, vba, funzioni definite dall'utente, valore, udf

Sto usando un UDF che è fondamentalmente un vlookup semplificato. Ecco il codice:

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

Ho notato che a volte quando copio i fogli (all'interno della stessa cartella di lavoro), ottengo a #VALUE errore. Se "modifica" la cella in Excel, non cambio nulla, semplicemente usando F2 e Enter, l'errore scompare. Succedeva quando si cambiava semplicemente Windows (per Firefox, e di nuovo su Excel, per esempio). È per questo che l'ho usato Caller e Parent così tanto nel codice. È quasi completamente fisso, tranne quando si copiano i fogli a volte. Non riesco a trovare la fonte dell'errore. Aiuto per favore.

risposte:

1 per risposta № 1

So che questa non è la tua domanda esatta, ma, se possibile, ti suggerirei di evitare completamente VBA se questa è assolutamente un'opzione e scrivi la tua formula come segue:

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

e XXXXX può essere uguale al tuo Columna variabile al momento.

Ciò garantirebbe al tuo codice di funzionare secondo le necessità.


Dato ciò che è stato discusso nei commenti e facendo del mio meglio per assicurarmi che funzioni, in realtà non vedo nulla di sbagliato nel tuo codice e sto solo INDURIZZANDO che potrebbe avere qualcosa a che fare con Application.Caller.

Quando mi succede questo genere di cose, faccio del mio meglio per usare il debugger per capire perché - questo di solito coinvolge entrambi Stop dichiarazioni per essere in grado di entrare nel codice e vedere cosa è successo o Debug.Print Err.Description tipo di messaggi.

Ad ogni modo, ho provato a rompere ogni parte, quindi, per lo meno puoi vedere da dove viene il problema. Per fare ciò, ho rielaborato la tua funzione (con qualche overkill importante) ....

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

(Nota anche che ho cambiato Application.WorksheetFunction.VLookup a Application.VLookup - Guarda a questo link per una spiegazione)

Una volta individuato, rimuoverei il codice di errore dalla funzione in quanto non è una buona idea per il codice di produzione - Solo per il debug.

Spero che questo possa darti le risposte che stai cercando.

Spero che sia d'aiuto....


AGGIORNAMENTO # 2:

Tenendo conto della possibilità che la copia del foglio provochi questo errore, ecco un test per vedere se il processo viene corretto:

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 per risposta № 2

Non è necessario utilizzare il chiamante e il genitore.

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

esempio di formula in una cella ...

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