/ / #VALUE Fehler beim Kopieren von Blättern - Excel, VBA, benutzerdefinierte Funktionen, Wert, udf

#VALUE Fehler beim Kopieren von Blättern - Excel, VBA, benutzerdefinierte Funktionen, Wert, udf

Ich benutze eine UDF, die im Grunde ein vereinfachtes vlookup ist. Hier ist der Code:

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

Ich habe festgestellt, dass manchmal beim Kopieren von Blättern (innerhalb derselben Arbeitsmappe) ein Fehler auftritt #VALUE Error. Wenn ich die Zelle in Excel "bearbeite", ändere nichts, nur mit F2 und Enter, der Fehler verschwindet. Früher kam es dazu, wenn man einfach Fenster wechselte (zum Beispiel nach Firefox und zurück nach Excel). Deshalb habe ich gebraucht Caller und Parent so viel im Code. Es ist fast vollständig behoben, außer wenn manchmal Blätter kopiert werden. Ich kann nicht die Quelle des Fehlers finden. Hilfe bitte.

Antworten:

1 für die Antwort № 1

Ich weiß, das ist nicht Ihre genaue Frage, aber, wenn möglich, würde ich vorschlagen, VBA vollständig zu vermeiden, wenn das überhaupt eine Option ist und schreiben Sie Ihre Formel wie folgt:

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

und XXXXX kann genauso sein wie du Columna Variable derzeit.

Das würde garantieren, dass Ihr Code nach Bedarf funktioniert.


Angesichts dessen, was in den Kommentaren besprochen wurde, und ich versuche mein Bestes, um sicherzustellen, dass das funktioniert, sehe ich wirklich nichts falsches mit deinem Code und glaube nur, dass es etwas damit zu tun haben könnte Application.Caller.

Wenn mir so etwas passiert, versuche ich mein Bestes, den Debugger einfach zu benutzen, um herauszufinden, warum Stop Aussagen in der Lage sein, in Code zu gehen und zu sehen, was passiert ist oder Debug.Print Err.Description Art von Nachrichten.

So oder so, ich habe versucht, jeden Teil zu brechen, so dass Sie zumindest sehen können, wo das Problem herkommt. Um dies zu tun, habe ich Ihre Funktion überarbeitet (mit einigen großen Overkill) ....

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

(Beachten Sie auch, dass ich mich geändert habe Application.WorksheetFunction.VLookup zu Application.VLookup - Ansehen dieser Link für eine Erklärung)

Sobald Sie es herausfinden, würde ich, obwohl, den Fehlercode von der Funktion entfernen, da das keine gute Idee für Produktionscode ist - nur für das Debugging.

Hoffentlich kann das Ihnen die Antworten geben, nach denen Sie suchen.

Hoffentlich hilft das....


UPDATE # 2:

Unter Berücksichtigung der Möglichkeit, dass das Kopieren des Blattes diesen Fehler verursacht, ist hier ein Test, um zu sehen, ob der Prozess behoben wird:

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 für die Antwort № 2

Das Verwenden von Anrufer und Eltern ist nicht erforderlich.

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

Beispiel für Formel in einer Zelle ...

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