- VBA是一种独立的语言,不与
any
这是针对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项目中,它引用了Excel对象。在您的Access VBA项目中,没有引用。您可以通过查看Tools
-> References
进行比较。
这使我们想到了“早期绑定”和“后期绑定”的概念。当您输入 不合格的参考文献Range.
之类的内容时,您会得到VBA的智能提示,告诉您可以使用Range
或其他方式做什么。但是在Access中,默认情况下没有引用Excel对象库。因此,Range.
不会产生智能感知,并且您无法运行代码,因为Access在其对象模型中没有Range
,并且您的VBA项目很可能没有包含它的引用。 >因此,如果您不想添加对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 LateBind
或0
之间更改1
行。
any
' 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)!
any