2017-06-06 92 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.

對象變量或帶塊變量未設置

它生成以下SQL查詢:

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

當我測試直接查詢時,我沒有任何錯誤。你能幫我消除這個錯誤嗎?

謝謝

+0

什麼錯誤? –

+2

刪除oRst.Close並設置oRst =沒有行。 oRst未初始化並導致錯誤,但您不需要此代碼的oRst。 – RADO

+0

這個錯誤是否發生在'oDb.Execute StrSql'上? VBA中不需要分號,儘管我不認爲這是因爲這裏的原因。 –

回答

3

您正在關閉一個記錄集對象oRst,該對象從未使用Set進行過初始化。因爲你運行一個動作查詢,你不需要一個記錄集,它可能與以前的代碼版本有關。

在那相同的音符,因爲要傳遞文字值的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

你應該能夠設置該對象什麼也不做,即使Recordset沒有被實例化。唯一需要注意的是類型必須是一個「對象」,因爲您無法將未聲明的類型設置爲無效。雖然RecordSet應該被刪除,因爲它在這裏沒有被使用。 –

+3

@JimmySmith問題不在於將其設置爲「Nothing」。問題是在空引用上調用實例方法'Close'。也可以在直接窗格中試試這個:'Set foo = Nothing',然後'?IsObject(foo)'。按照定義,輸出「True」和「foo」未聲明。 –

+0

A-ha。我在那裏誤解了。是的,.Close會殺死它,因爲它在技術上沒有任何內容。關閉以引用。因爲他們從未指定錯誤發生的位置,所以在這裏您可能是正確的答案。 –

1

嘗試刪除oRst相關的代碼行。這個變量沒有被初始化,也沒有被使用。