2017-06-06 13 views
0

私はこのコードVBAのアクセスがエラー91

Public Sub Production_UpdateStatus(ByVal lngProductionId As Long, _ 
            ByVal NewProductionStatus As eProductionStatus)  
Dim oDb As DAO.Database 
Dim oRst As DAO.Recordset 
Dim StrSql As String 
Dim strProductionStatus As String 

On Error GoTo Err_Infos 

GetCurrentProductionStatusString NewProductionStatus, strProductionStatus 

Set oDb = CurrentDb 

'Mise a jour du staut de production 
StrSql = "UPDATE tProduction SET tProduction.Statut= '" & strProductionStatus & "'" _ 
      & " WHERE (tProduction.IdProduction=" & lngProductionId & ");" 
oDb.Execute StrSql 

'Fermeture des connexions 
oRst.Close 
oDb.Close 
Set oDb = Nothing 
Set oRst = Nothing 

Exit_currentSub: 
    Exit Sub 

Err_Infos: 
    MsgBox "Erreur #" & Err.Number & " : " & Err.Description 
    Resume Exit_currentSub 

End Sub 

にこのコードの作業を実行しますが、エラーに私に

それを設定していない91

オブジェクト変数またはWithブロック変数を与えることを試みます次のSQLクエリを生成します。

UPDATE tProduction SET tProduction.Statut= 'Nouvelle' WHERE (tProduction.IdProduction=2); 

私は直接クエリをテストするとき、私はエラーがありません。このエラーを取り除く手助けをしてもらえますか?

ありがとうございました

+0

エラーとは何ですか? –

+2

oRst.Closeを削除し、oRst = Nothing行を設定します。 oRstは初期化されていないため、エラーが発生しますが、このコードではoRstは必要ありません。 – RADO

+0

このエラーは 'oDb.Execute StrSql'で発生しますか? VBAではセミコロンは必要ありませんが、私はそれが原因だとは思いません。 –

答えて

3

で初期化されていないレコードセットオブジェクトを閉じています。アクションクエリを実行するため、レコードセットは不要であり、以前のコードバージョンのまま残っている可能性があります。同じノートで

、あなたはSQLクエリにリテラル値を渡しているので、連結と引用エンクロージャを回避するDAO QueryDef parametersでパラメータ設定を検討しが:

Dim oDb As DAO.Database, qdef As DAO.QueryDef 
Dim StrSql As String, strProductionStatus As String 

GetCurrentProductionStatusString NewProductionStatus, strProductionStatus 

Set oDb = CurrentDb 

StrSql = "PARAMETERS strProductionStatusParam Text(255), lngProductionIdParam Long;" _ 
      & " UPDATE tProduction SET tProduction.Statut = [strProductionStatusParam]" _ 
      & " WHERE (tProduction.IdProduction = [lngProductionIdParam]);" 

Set qdef = oDb.CreateQueryDef("", StrSql) 

qdef!strProductionStatusParam = strProductionStatus 
qdef!lngProductionIdParam = lngProductionId 

qdef.Execute dbFailOnError 

Set qdef = Nothing 
Set oDb = Nothing 
+0

レコードセットがインスタンス化されていない場合でもオブジェクトは何もありません。宣言されていない(型)を何も設定することができないので、型がある唯一の注意点は "オブジェクト"でなければなりません。レコードセットはここで使用されていないので削除する必要があります。 –

+3

@JimmySmith問題は 'Nothing'に設定することではありません。問題は、null参照でインスタンスメソッド 'Close'を呼び出すことです。また、即座のペインでこれを試してください: 'Set foo = Nothing'と'?IsObject(foo) '。 'True'を出力し、' foo'は定義によって宣言されません。 –

+0

A-ha。そこに私の誤解。そう、技術的には何もないので、クローズラインでそれを殺すだろう。参照して閉じる。エラーが発生した場所を特定していないため、ここで正しい答えが得られます。 –

1

oRst関連のコード行を削除してみてください。この変数は初期化されず、使用されません。

関連する問題