2011-11-30 59 views
1

編輯:改變我有相同的代碼不同的問題創建和寫入數據到一個表的MS Access

2日編輯:添加額外的代碼,這似乎是casuing

我所創建的問題訪問中的vba程序,它聚合來自多個外部源的數據並將結果寫入新表。理想情況下,當我運行該程序時,我想清除當前表中的所有數據,並將其替換爲新數據。我目前正在刪除所有數據表中的...然後寫我的新數據

這裏是代碼以供參考

Function getTestFixtures(FixtureName As String) As Recordset 
Dim db As Database 

Set db = OpenDatabase(GetDBPath & "TestFixtures.xlsx", False, False, "Excel 12.0;HDR=Yes;") 

If db Is Nothing Then 
    MsgBox "Can't find the file!", vbExclamation, ThisWorkbook.Name 
    Exit Function 
End If 

Set getTestFixtures = db.OpenRecordset("Select * from [" & FixtureName & "$]") 

End Function 

上面創建的記錄被修改,輸出數據被放置在一個字典並傳遞給這個函數。

Sub Write_OTDC_Data(POlist As Dictionary) 
Dim Rst As Recordset 


DoCmd.SetWarnings False 
DoCmd.runsql "Delete * from [OTDC Results]" 
DoCmd.SetWarnings True 


Set Rst = CurrentDb.OpenRecordset("OTDC Results") 

With Rst 

    For Each key In POlist.Keys 
    .AddNew 
    For i = 0 To 9 
     .Fields(i).value = POlist(key)(i) 
    Next 
    .Update 
    Next 
.Close 
End With 
End Sub 

我的問題是,我得到以下錯誤,如果我試圖改變任何東西后運行上述兩個procuedures。

Error Message

孤立運行的是不產生錯誤。

+1

是否有你不希望運行刪除查詢而不是刪除表的原因? – Fionnuala

+0

與數據的數據丟失@Remou不....我有問題,從鍵衝突上傳。我會試一試,因爲這是一個簡單的修復 – Pynner

+0

我不認爲數據上傳表上的密鑰是一個好主意。它減緩了事情的速度,並且可以像你發現的那樣令人討厭。你不能把鑰匙留下嗎? – Fionnuala

回答

0

我不能確定這個問題是否仍然懸而未決。如果不是的話,我有一些建議讓你嘗試,但不是很有信心他們會治好這個問題。

嘗試DoCmd.TransferSpreadsheet到工作表的數據導入到一個臨時表,而不是使用的openDatabase與工作簿。

在您的MsgBox中,我想知道ThisWorkbook.Name是否對Access應用程序有任何意義。除此之外,我會檢查工作簿是否存在,然後打開它(或從導入表)僅當文件被發現。

If Len(Dir(GetDBPath & "TestFixtures.xlsx")) = 0 Then 
    'not found 
Else 
    'use it 
End If 

其實我不清楚爲什麼你,如果工作簿文件不存在,不從OpenDatabase得到一個錯誤。這讓我懷疑DoCmd.SetWarnings False永遠不要關掉SetWarnings。這樣做會壓制重要信息。而這完全沒有必要。設置一個DAO.DATABASE對象變量CurrentDB(),然後用這個來代替:

dbObjectVariable.Execute "Delete from [OTDC Results]", dbFailOnError 

添加錯誤處理程序來處理任何問題dbFailOnError暴露。

最後,值得重複,因爲它是如此的重要。 NEVER轉SetWarnings關閉。

+0

感謝您查看我的代碼。我會澄清這個錯誤究竟是什麼。上面的代碼運行正常(並且我沒有關閉警告)。不知何故,在上述運行後,它將數據庫鎖定爲不可用狀態。我同意你關於msgbox的說法,如果缺少文件,它可能無法正常運行 – Pynner