在Access中运行Excel VBA

问题描述 投票:0回答:2

这是针对Office 2016的,我将打开此页面以获取更多信息,下面是整体答案!我研究了一段时间,没有找到答案!如果您还有其他信息要添加,请执行!

我一直在对此进行大量研究,但实际上并没有找到任何可行的方法。我已经在Excel中编写了要在MS Access中运行的模块。我已经粘贴了希望在Access中运行的代码。我发现的所有示例或信息均来自2003 Access。我正在使用2016 Access,并且代码无法正常工作。

Excel代码

Public Function getworkbook()
    ' Get workbook...
    Dim ws As Worksheet
    Dim Filter As String
    Dim targetWorkbook As Workbook, wb As Workbook
    Dim Ret As Variant


    Application.DisplayAlerts = False

    Sheets("DATA").Delete
    '   Sheets("DATA").Cells.Clear




    Set targetWorkbook = Application.ActiveWorkbook

    ' get the customer workbook

    Filter = "Text files (*.xlsx;*.xlsb),*.xlsx;*.xlsb"
    Caption = "Please Select an input file "
    Ret = Application.GetOpenFilename(Filter, , Caption)

    If Ret = False Then Exit Function

    Set wb = Workbooks.Open(Ret)

    wb.Sheets(1).Move After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count)

    ' ActiveSheet.Paste = "DATA"


    ActiveSheet.Name = "DATA"

    ThisWorkbook.RefreshAll

    ' Application.Quit
    Application.DisplayAlerts = True


End Function

我已经找到并尝试在Access中使用它的代码来帮助我在Access中运行它。

Public Function runExcelMacro(wkbookPath)
    Dim XL As Object
    Set XL = CreateObject("Excel.Application")
    With XL
        .Visible = False
        .displayalerts = False
        .Workbooks.Open wkbookPath
        'Write your Excel formatting, the line below is an example
        .Range("C2").value = "=1+2"
        .ActiveWorkbook.Close (True)
        .Quit
    End With
    Set XL = Nothing
End Function
excel vba ms-access
2个回答
1
投票

首先需要处理的概念很少。

图书馆参考和范围

您的原始代码是用Excel编写的。因此,在该VBA项目中,它引用了Excel对象。在您的Access VBA项目中,没有引用。您可以通过查看Tools-> References进行比较。

这使我们想到了“早期绑定”和“后期绑定”的概念。当您输入Range.之类的内容时,您会得到VBA的智能提示,告诉您可以使用Range或其他方式做什么。但是在Access中,默认情况下没有引用Excel对象库。因此,Range.不会产生智能感知,并且您无法运行代码,因为Access在其对象模型中没有Range,并且您的VBA项目很可能没有包含它的引用。 >因此,如果您不想添加对Excel对象模型的引用,并且无论如何都希望这样做,则需要将代码调整为在后期运行。

不合格的参考文献

您原始的Excel代码包含对Excel的对象模型中可用的各种全局对象的不合格引用。

Application.DisplayAlerts = False ... Sheets("DATA").Delete ... Set wb = Workbooks.Open(Ret) ...

这些在不一定由Excel之外的其他主机托管的VBA项目中不一定能始终如一地工作,并且在某些后期绑定代码中也很可能无法正常工作。此外,如果您选择添加对Excel对象模型的引用,则最终仍然会泄漏Excel实例,这可能会导致虚假实例,因为对全局对象的不合格引用将隐式创建一个您无法交互的Excel实例,这也可能导致其他运行时错误。为了使您的代码更晚绑定,您需要类似:

Set ExcelApp = CreateObject("Excel.Application") ExcelApp.DisplayAlerts = False ... Set MyBook = ExcelApp.Workbooks("Whatever") MyBook.Sheets("DATA").Delete ... Set wb = ExcelApp.Workbooks.Open(Ret) ...

请注意,您现在可以在Excel托管的上下文中访问的所有全局对象都必须是自己的变量。此外,由于Excel不再是主机,您将无法访问其他VBA项目中的ThisWorkbook或什至Sheet1。您必须进行相应的调整。

在早装和晚装之间切换

早期绑定的代码使您可以更轻松地进行开发,因为您可以获得完整的智能和对象浏览器来帮助您编写代码。但是,在引用其他对象模型时,您可能希望使用后期绑定来分发VBA代码,以避免版本问题和引用损坏。但是,您可以两全其美:

#Const EarlyBind = 1 #If EarlyBind Then Dim ExcelApp As Excel.Application #Else Dim ExcelApp As Object #End If Set ExcelApp = CreateObject("Excel.Application")

这说明了

条件编译参数的使用,使您可以使用ExcelApp变量,该变量可以是Excel.Application(又称早绑定)或Object(又称晚绑定)。要进行更改,只需在Const LateBind0之间更改1行。

首先,要清除术语:

  • VBA是一种独立的语言,不与

    any

MS Office应用程序绑定。在“工具\参考”下,您将看到Visual Basic for Applications
通常是第一个选中的对象。在Excel,Access,Word,Outlook等内部运行VBA之间的区别是对对象库的默认访问。具体来说:工作表等,但未定义其来源Access看到
  • 表单
  • 报告等,但未定义其来源Word看到
  • 文档
  • 段落等,但未定义其来源
  • [当在应用程序中运行外部对象库(例如MS Access访问Excel对象时,您必须通过引用使用早期或晚期绑定来定义和初始化外部对象:
  • ' EARLY BINDING, REQUIRES EXCEL OFFICE LIBRARY UNDER REFERENCES Dim xlApp As Excel.Application Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Set xlApp = New Excel.Application Set wb = xlApp.Workbooks.Open(...) Set ws = wb.Worksheets(1) ' LATE BINDING, DOES NOT REQUIRE EXCEL OFFICE LIBRARY UNDER REFERENCES Dim xlApp As Object, wb As Object, ws As Object Set xlApp = CreateObject("Excel.Application") Set wb = xlApp.Workbooks.Open(...) Set ws = wb.Worksheets(1)

    话虽如此,只需保持原始代码几乎完整即可,但更改定义和初始化。值得注意的是,所有Application调用现在都指向Excel.Application对象,并且不要与Access的应用程序混淆。另外,避免.Select/ .Activate/ Selection/ ActiveCell/ ActiveSheet/ ActiveWorkbook的最佳做法。

    .Select/ .Activate/ Selection/ ActiveCell/ ActiveSheet/ ActiveWorkbook

    顺便说一句,上面的代码可以在

    any MS Office应用程序中运行,因为不使用父应用程序的对象(此处为MS Access)!


    0
    投票
    首先,要清除术语:

    • VBA是一种独立的语言,不与

      any

    © www.soinside.com 2019 - 2024. All rights reserved.