2011-11-30 60 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