通过excel vba更新和删除单一访问记录集

时间:2010-08-02 02:22:40

标签: excel vba ado

我有这个工具,需要更新员工信息。我打电话给MDB数据在一张纸上表现出色。现在我使用vlookup来查看它是什么,并在需要时进行更改。

我尝试过一些技巧,但有些事情似乎是错误的......请帮助。

Sub update()
Dim cn As Object
Dim rs As Object
Dim a As String
strFile = "D:\temp excel\EIM.mdb"
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile & ";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
a = Sheet2.Range("D4")
strSQL = "SELECT * FROM EIM WHERE EIM.NBKID=" & a
rs.Open strSQL, cn

strSQL = "UPDATE EIM SET EIM.Person#=('" & Sheet2.Range("D5") & "')WHERE EIM.NBKID=('" & Sheet2.Range("D4")
cn.Execute strSQL
End Sub

在上面的代码中,文件EIM有一个名为EIM的表,带有NBKID和Person#fields。

很抱歉没有明确解释请求,我有这个工具,允许人们更新信息。我无法使用访问来操纵它,因为并非所有访问都可用,即使它可用,我也不想让他们访问master数据库。

当一个人从一个角色转移到另一个角色或有人离开组织时,我们有超过500名员工。经理必须请求层级报告,这需要时间。

我希望这个工具能够保留所有员工的记录,而不是通过这个,这里nbkid只是系统ID而人#是员工编号或身份。

我有一个代码来更新信息,但是如果有人因为角色的某些变化而需要编辑它而不是我需要另一组代码。

通过在excel中进行操作,它易于管理 - 无需额外培训。

我有这个按钮,它应该更新对excel表中更新的vaules所做的更改。我不想让它检查记录是否改变,我只是想让它使用更新。

当我运行上面的代码时,我收到错误消息“没有给出一个或多个所需参数的值。”

3 个答案:

答案 0 :(得分:0)

我同意修改excel中的数据而不是直接访问,但我只是发现你的SQL语句似乎有些错误。尝试更改

WHERE EIM.NBKID=('" & Sheet2.Range("D4")

WHERE EIM.NBKID=" & Sheet2.Range("D4")

请注意删除单引号,原始语句将被视为

WHERE EIM.NBKID=('123456

答案 1 :(得分:0)

您在支架和地址之间缺少空格:

strSQL = "UPDATE EIM SET EIM.Person#=('" & Sheet2.Range("D5") _
       & "') WHERE EIM.NBKID=('" & Sheet2.Range("D4")

如果NBKID是文本字段,则需要单引号:

WHERE EIM.NBKID=('" & Sheet2.Range("D4") & "'"

或者对于数字字段:

WHERE EIM.NBKID=(" & Sheet2.Range("D4") 

我怀疑这是一个日期字段,但如果是,则需要哈希(#)分隔符。

答案 2 :(得分:0)

就效率而言,我不确定为什么你真的打开了记录集。 cn.Execute行自身运行良好。

我还会写一个你可以调用的函数并将它传递给它,具体取决于你想要做什么。如果您传入了ID,strFileName和strSQL,那么您就拥有了一个通用函数。

我在密钥对“SELECT * from tblFoo WHERE tblFoo.ixFoo = {key}”的某个地方有一个预烘焙的SQL字符串。然后我获取参数并在strSQL上执行Replace以插入密钥。

Sub Update(strFile as string, strKey As String, strPerson as string)
Dim cn As Object : Set cn = CreateObject("ADODB.Connection")
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile & ";"
cn.Open strCon
strSQL = "UPDATE EIM SET EIM.Person#="{person}" WHERE EIM.NBKID={key}"
strSQL = Replace(strSQL, {person}, strPerson, 1)
strSQL = Replace(strSQL, {key}, strKey, 1)
cn.Execute strSQL
End Sub

如果代码的速度大于执行速度的需要(这是我可以在这里收集的),那么这种方法可以缓解所有引用/双引号混淆

如果你有一些,我会在书中留出一张包含所有strSQL语句的表。您甚至可以通过它以更快的本机执行速度在Excel中进行替换。

您现在拥有一个可以选择并重复使用的功能。如果您认真使用VBA,请重复使用。它节省了很多时间。 VBA工作往往会给生产带来很大的压力。

我认为你已经删除了错误捕获以节省我们阅读它的麻烦。