将DBEngine与运行时访问一起使用

时间:2015-09-29 10:42:53

标签: vba excel-vba dao excel

我尝试将我的xls与access数据库连接起来。当我在我的机器上安装完全访问程序时,下面的代码工作变得很大。问题是当我尝试在机器上使用它时,只安装了运行时版本的访问权限。

我使用了这个引用:


Visual Basic For Applications
Microsoft Excel 14.0 Object Library
OLE Automation
Microsoft Office 14.0 Object Library
Microsoft Forms 2.0 Object Library

当我尝试在代码下面运行时,我得到错误: ActiveX组件无法创建对象或返回对此对象的引用(错误429)

Sub mcGetPromoFromDB()
    Application.ScreenUpdating = False

    Dim daoDB            As DAO.Database
    Dim daoQueryDef      As DAO.QueryDef
    Dim daoRcd           As DAO.Recordset

    'Error on line below
    Set daoDB = Application.DBEngine.OpenDatabase("K:\DR04\Groups\Functional\DC_Magazyn\Sekcja_Kontroli_Magazynu\Layout\dbDDPiZ.accdb")
    Set daoRcd = daoDB.OpenRecordset("kwPromoIDX", dbOpenDynaset)

    Dim tempTab() As Variant

    For Each Article In collecArticle
        daoRcd.FindNext "IDX = " & Article.Index
        Article.PromoName = daoRcd.Fields(1).Value
        Article.PromoEnd = "T" & Format(daoRcd.Fields(2).Value, "ww", vbMonday, vbUseSystem)
    Next

    Application.ScreenUpdating = True
End Sub

1 个答案:

答案 0 :(得分:0)

IDX是索引字段吗?

kwPromoIDX是否已针对此特定目的进行了优化?我的意思是,它仅包含此更新所需的字段,还是您要拉出多余的无用字段?也许像“ SELECT IDX, [Field1Name], [Field2Name] FROM kwPromoIDX这样的东西会更有效。

由于您只读取表记录,似乎不需要实际编辑它们而不是dbOpenDynaset,所以请使用dbOpenSnapshot

只是在这里抛出一个想法,您必须测试一下它是否有任何作用,但是也许您可以尝试颠倒您的逻辑。在记录集中一对一地循环浏览,并在工作表中找到IDX。

我过去做过的另一件事是使用.CopyFromRecordset并将整个记录集复制到一个临时工作表中,并完全在Excel中来回移动,以消除来回移动。

最后,另一种方法可以是快速遍历整个记录集并填充数组,集合等,然后使用它代替Access。这样,数据全部是虚拟的,您可以通过Access来回减少事务。

您需要进行一些测试,以查看哪种方法最适合您的情况。