2012-09-06 6 views
5

私はVBAアプリケーションを作成しています、と私は次のコードを持っている:Object required error at getEffort(previousCell):私は、エラーメッセージが表示されますなぜオブジェクトに必要なエラーエクセルVBA


Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort (previousCell) '**Here i get object required** 

ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private Function getEffort(ByVal cell As range) 

' do soemthing 

End Sub 

を私はわかりません。私がTargetを渡すと、それは動作します。ターゲットはあなたにエラーを与えているオブジェクトのインスタンスに設定されていないように見えます

おかげ

+0

_Private Function_は_Private Sub_を返す必要があります。返される値の取得に関係なく、プライベート関数は "END SUB"で終了しますか? – ray

+2

getEffortを呼び出すときにかっこを使用しないでください。 –

+0

注:サブ名の前に 'Call'と入力すると、paranthesesを使うことができます - ' getEffort(previousCell) 'を呼び出す –

答えて

0

。ターゲットを渡すと、関数関数(引数)の引数がオブジェクトのインスタンスに設定されます。 previouscell = targetターゲットを実際に設定する必要があります。そうしないと、execエラーが発生します。

は設定previouscell = ActiveCellの

0

2つのことを試してみてください:まず、あなたが()を使用するか、または関数としてgetEffortを呼び出すときに、戻り値のいくつかの並べ替えを含まないようにする必要があります。また、サブ/ファンクションにするかどうかを決定する必要があります。現在は両方を使用しています。おそらくあなたはそれをサブにしていますか?

Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort previousCell '**Here i get object required** 
'or... 
call getEffort(previousCell) 

'add this too.. 
'exit sub 
ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private sub getEffort(ByVal cell As range) 

' do soemthing 

End sub 

また、あなたのメインプログラムは、あなたのエラー文の前に終了したことがないので、それは常にそのメッセージボックスをポップアップ表示されます。空白のメッセージボックスが常に表示されないように、エラーラベルの前にExit Subを追加してください。

18

他の人も示唆しているように、問題はカッコです。誰も十分に説明していないのは、それが括弧である理由です。

あなたが言うとき、この:次に、あなたがgetEffort手順にpreviousCellRangeオブジェクトを渡している

getEffort previousCell 

。それがプロシージャが期待するものなので、それは幸せです。あなたはこの言う

previousCell原因VBA周り

getEffort (previousCell) 

括弧はpreviousCellオブジェクトを評価します。 VBA がオブジェクトを評価すると、そのオブジェクトの既定のプロパティが返されます。 Rangeオブジェクトのデフォルトのプロパティは.Valueです。これは文字列です。

したがって、previousCellが評価され、文字列がgetEffortに渡されます。もちろん、getEffortはRangeオブジェクトを期待しているため、エラーメッセージが表示されます。

TargetpreviousCellを割り当てるというのは赤ちゃんです。 previousCellに切り替えるとかっこが導入された可能性があります。あなたは私を信じていない場合は、これを試してみてください。

getEffort (Target) 

あなたは、同じエラーメッセージが表示されます。

+3

+1は素晴らしいです。説明。 –

+2

詳細については、別の質問への私の答えを参照してください:[ByRefはVBA 6.0の値ではなく参照を受け取るようです。](http://stackoverflow.com/a/4877030/154439) – mwolfe02