Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Access中运行Excel VBA_Excel_Vba_Ms Access - Fatal编程技术网

在Access中运行Excel VBA

在Access中运行Excel VBA,excel,vba,ms-access,Excel,Vba,Ms Access,我已经对此进行了大量研究,但我没有找到任何线索来说明这将如何工作 我已经用Excel编写了代码,希望在MS Access中运行。我已经粘贴了希望在Access中运行的代码 我找到的所有示例或信息都来自2003 Access。我正在使用2016访问 Excel代码 Public Function getworkbook() ' Get workbook... Dim ws As Worksheet Dim Filter As String Dim targetWor

我已经对此进行了大量研究,但我没有找到任何线索来说明这将如何工作

我已经用Excel编写了代码,希望在MS Access中运行。我已经粘贴了希望在Access中运行的代码

我找到的所有示例或信息都来自2003 Access。我正在使用2016访问

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中找到并尝试使用的代码

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项目中,它引用了Excel对象。在Access VBA项目中,未引用。您可以通过查看
工具
->
参考资料
进行比较

这就引出了“早期绑定”和“后期绑定”的概念。当您输入诸如
范围之类的内容时,
,VBA的intellisense会告诉您可以使用
范围
或其他任何东西做什么。但在Access中,默认情况下没有引用Excel对象库。因此,
Range.
将不会产生intellisense,并且您无法运行代码,因为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托管的上下文中访问的所有全局对象现在都必须是一个变量。此外,您将无法访问其他VBA项目中的
ThisWorkbook
,甚至
Sheet1
,因为Excel不再是宿主。你必须做出相应的调整

在早期绑定和后期绑定之间切换 早期绑定的代码使您的开发更加容易,因为您可以获得完整的智能和对象浏览器来帮助您编写代码。但是,在引用其他对象模型时,您可能希望使用后期绑定分发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
(也称早期绑定)或
对象
(也称后期绑定)。要更改,只需更改
0
1
之间的
Const-LateBind

首先,要澄清术语:

  • VBA是一种独立的语言,不与任何MS Office应用程序绑定。在“工具\引用”下,您将看到Visual Basic for Applications通常是第一个选中的对象。在Excel、Access、Word、Outlook等内部运行VBA的不同之处在于对其对象库的默认访问权限。具体而言:

    • 仅查看工作簿、工作表等,而不定义其来源
    • 仅查看表单、报表等,而不定义其来源
    • 只查看文档、段落等,而不定义其来源
  • 在应用程序内运行外部对象库(如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的应用程序混淆。此外,最好的做法是避免


顺便说一句,以上内容可以在任何MS Office应用程序中运行,因为没有使用父应用程序的对象(这里是MS Access)

编译器在哪里告诉您有错误?
.Range(“C2”)。value=“=1+2”
-
Range
不是Excel应用程序的属性,而是工作表的属性。该范围只是我找到的似乎是答案的示例代码。然而,当我插入我的代码时,我得到了一个热的混乱。甜心最后感谢你的拥抱帮助!这完全有道理,您必须指出这是excel代码。当您使用Java编写代码,然后切换到PHP时,您必须执行相同的库引用!我在任何地方都找不到关于如何在VBA应用程序中执行此操作的答案。你是我的英雄谢谢!非常感谢您抽出时间,我不知道是否需要更改参考库我不知道在VBA中您需要调用应用程序!这是有意义的,因为在java中,切换到PHP时,必须引用为代码切换添加的库。我想让这一点,但这一点和下面的信息是答案!非常感谢你!的确VBA与其他COM连接语言(,)完全一样:访问对象库。快乐编码!
Public Function getworkbook()
    ' Get workbook...
    Dim xlApp As Object, targetWorkbook As Object, wb As Object, ws As Object         
    Dim Filter As String, Caption As String
    Dim Ret As Variant

    Set xlApp = CreateObject("Excel.Application")
    Set targetWorkbook = xlApp.Workbooks.Open("C:\Path\To\Workbook.xlsx")

    xlApp.DisplayAlerts = False

    targetWorkbook.Sheets("DATA").Delete

    ' get the customer workbook
    Filter = "Text files (*.xlsx;*.xlsb),*.xlsx;*.xlsb"
    Caption = "Please Select an input file "
    Ret = xlApp.GetOpenFilename(Filter, , Caption)

    If Ret = False Then Exit Function    
    Set wb = xlApp.Workbooks.Open(Ret)

    wb.Sheets(1).Move After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count)    
    Set ws = targetWorkbook.Worksheets(targetWorkbook.Sheets.Count)
    ws.Name = "DATA"

    targetWorkbook.RefreshAll

    xlApp.DisplayAlerts = True
    xlApp.Visible = True                        ' LAUNCH EXCEL APP TO SCREEN
    ' xlApp.Quit

    ' RELEASE RESOURCEES
    Set ws = Nothing: Set wb = Nothing: Set targetWorkbook = Nothing: Set xlApp = Nothing
End Function