2016-11-30 23 views
0

エラー91をスローし続けるコマンドボタンクリックイベント用のコードがあります。コードをステップ実行すると、 'Setvalueue 'コードが実行されます。下記のコードスニペットを参照してください。私はコード自体の検査でそれを理解することはできません。UserFormコマンドボタンコード - エラー91:オブジェクト変数またはWithブロック変数が設定されていません

「findvalue」は範囲オブジェクトとしてディメンション化されています。 'DataSH'はレコードID(列B)の列で始まるマスターデータテーブルが存在するワークシートです。ユーザーフォーム要素は、DataSHのデータテーブルのそれぞれの列に設定されます。

Private Sub cmdEdit_Click() 
    'declare the variables 
    Dim findvalue As Range 
    Dim cNum As Integer 
    Dim DataSH As Worksheet 
    'error handling 
    On Error GoTo errHandler: 
    'hold in memory and stop screen flicker 
    Application.ScreenUpdating = False 
    Set DataSH = Sheet1 

このスニペットをから取られることがクリックイベントサブルーチンは、それらUF要素(の値に基づいてDataSHで選択したレコードID(行番号識別子)の行に適切な列データを更新するための設定であります変更または削除された値)。要点は、UF要素(テキストボックスとコンボボックス)で行った変更をDataSHのマスターデータテーブルに更新することです。

Set findvalue = DataSH.Range("B:B"). _ 
    Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole) 
    'update the values 
    findvalue = tbRecID.Value 
    findvalue.Offset(0, 1) = tbRecDate.Value 
    findvalue.Offset(0, 2) = cmbRecLoc.Value 
    findvalue.Offset(0, 3) = cmbRecCust.Value 
    findvalue.Offset(0, 4) = tbRecAmt.Value 
    findvalue.Offset(0, 5) = cmbRecComm.Value 
    findvalue.Offset(0, 6) = cmbRecPrin.Value 
    findvalue.Offset(0, 7) = tbRecTerr.Value 
    findvalue.Offset(0, 8) = tbRecRep.Value 
+1

あなたは、Setステートメントを使用してfindvalueを設定し、それに別の値を代入しようとした:それは名前である場合、あなたはこのようにDataSHを設定する必要があります。 – Rdster

+1

@Rdsterしかし、現在の「findvalue」値を確認しているだけなので、エラーは発生しません。 – user3598756

+0

@Rdsterテキストボックスとコンボボックスの要素は、レコードがリストボックス内でダブルクリックされると(別のサブルーチン) DataSHのデータテーブルから)を同じUF上に作成します。 'findvalue'は、そのイベントのtbRecIDテキストボックス要素に入力されたレコードIDに設定されます。残りのコードは、 'findvalue'オブジェクトを参照ポイントとして使用して、UF要素(つまり変更された要素)の値をDataSHテーブルの適切なフィールド(および拡張子はリストボックス)に返します。少なくとも私はそれを正しく説明したと思う。 –

答えて

1

に設定されている場合、私はDataSHがsettedされていないと思います。 "Sheet1"はシートの名前ですか、それともワークシートの変数ですか?

Set DataSH = thisworkbook.worksheets("Sheet1") 

なくSet DataSH = Sheet1

+0

これは、 "Set DataSH = Sheet1"ステートメント – user3598756

+0

からエラーが発生する可能性があります。データシートがSheet1である限り。 1つはプロパティウィンドウのシートの名前、もう1つは(名前)です。 – Rdster

+0

@ user3598756これはチケットです!私はそれをExcelのデフォルトのSheet1名に設定していました。シート名が変更された場合に備えて、これまでの問題なしにこれを行っています。しかし、私はあなたのソリューションのように実際のシート名に設定すると、魅力のように動作します。問題が解決しました。多くのありがとう1! –

0

エラー(この状況では)91のポップアップ、あなたが設定されていないので、あなたのMe.tbRecID.ValueDataSH.Range("B:B")に存在しないいくつかの範囲に値を代入しようとしているため。この問題を回避するには、例えば、いくつかのエラーの例外を追加することができます。

Set findvalue = DataSH.Range("B:B"). _ 
    Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole) 
    'update the values 
On Error GoTo ErrHand: 
    findvalue = tbRecID.Value 
On Error GoTo 0 
    findvalue.Offset(0, 1) = tbRecDate.Value 
    findvalue.Offset(0, 2) = cmbRecLoc.Value 
    findvalue.Offset(0, 3) = cmbRecCust.Value 
    findvalue.Offset(0, 4) = tbRecAmt.Value 
    findvalue.Offset(0, 5) = cmbRecComm.Value 
    findvalue.Offset(0, 6) = cmbRecPrin.Value 
    findvalue.Offset(0, 7) = tbRecTerr.Value 
    findvalue.Offset(0, 8) = tbRecRep.Value 
ErrHand: 
[rest of your code] 

これは、この変数に割り当てられた範囲がない場合findvalueを使用してラインをバイパスするために、プログラムを強制します。

0

あなたのコードでは、単に「DataSH.Range(」B:B「)」で「Me.tbRecID.Value」を見つけることに失敗している

だから、実行する「場合は次に場合は終了」で、あなたのコードをラップfindvalueが実際に有効な範囲

Set findvalue = DataSH.Range("B:B"). _ 
Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole) 
If Not findvalue Is Nothing Then 
    findvalue.Offset(0, 1) = tbRecDate.Value 
    findvalue.Offset(0, 2) = cmbRecLoc.Value 
    findvalue.Offset(0, 3) = cmbRecCust.Value 
    findvalue.Offset(0, 4) = tbRecAmt.Value 
    findvalue.Offset(0, 5) = cmbRecComm.Value 
    findvalue.Offset(0, 6) = cmbRecPrin.Value 
    findvalue.Offset(0, 7) = tbRecTerr.Value 
    findvalue.Offset(0, 8) = tbRecRep.Value 
End If 
+0

私の答えがあなたの質問を解決したら、あなたはそれをaccepetとしてマークしたいかもしれません。ありがとうございました! – user3598756

関連する問題