/ シートをコピーするときの/ #VALUEエラー - Excel、VBA、ユーザー定義関数、値、udf

シートをコピーするときの#VALUEエラー - Excel、VBA、ユーザー定義関数、値、udf

基本的にvlookupを簡略化したUDFを使用しています。ここにコードがあります:

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

私はときどき(同じブック内の)シートをコピーするときに、 #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.VLookupApplication.VLookup - 見る このリンク 説明のために)

いったんそれを理解すれば、私は、生産コードのための良いアイデアではなく、単にデバッグのために関数からエラーコードを取り除いてしまいます。

うまくいけば、それはあなたにあなたが探している答えを与えることができます。

希望は役立ちます....


更新#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

回答№2の場合は0

呼び出し元と親を使用する必要はありません。

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

セル内の数式の例...

= SUEL​​DOBASICO(C10、 "Escalas Salariales"!$ A $ 3:$ DJ $ 23)