重新使用VBA Sub打开Excel文件
我正在慢慢学习VBA,并且已经实现了一些本质上从论坛切割和粘贴的好东西,但现在我被卡住了。
在这里使用这个脚本: WordMVP我可以从Word打开Excel文件。 没问题。 但是现在我已经重复使用了这个脚本,好多次我的模块开始变长了。 我可以把它分成不同的潜艇吗? 当我需要他们的时候打电话给零件? 例如:(将链接的代码窃取到位)
把它放在一个单独的子文件中:
Sub WorkOnAWorkbook(str As String) Dim oXL As Excel.Application Dim oWB As Excel.Workbook Dim oSheet As Excel.Worksheet Dim oRng As Excel.Range Dim ExcelWasNotRunning As Boolean 'If Excel is running, get a handle on it; otherwise start a new instance of Excel On Error Resume Next Set oXL = GetObject(, "Excel.Application") If Err Then ExcelWasNotRunning = True Set oXL = New Excel.Application End If On Error GoTo Err_Handler 'Open the workbook Set oWB = oXL.Workbooks.Open(FileName:=str) Exit Sub Err_Handler: MsgBox WorkbookToWorkOn & " caused a problem. " & Err.Description, vbCritical, _ "Error: " & Err.Number End Sub
这在另一个:
Sub release() 'Make sure you release object references. Set oRng = Nothing Set oSheet = Nothing Set oWB = Nothing Set oXL = Nothing End Sub
并在需要时使用它们,例如:
Sub test() Call WorkOnAWorkbook("somefile.xls") oWB.Application.Run "Module1.TestMacro", "JasonX" Call release() End Sub
我在oWB.Application.Run“Module1.TestMacro”,“JasonX”得到一个424的对象。
是否有这样的可能,我的一部分感觉就像我几乎在那里,我的一部分感觉就像我已经完全搞砸了,我的一部分认为它是不可能的…
任何人都可以帮忙吗?
Thx一百万。
你不能只是分解代码,因为你的对象引用需要存在于你正在使用的子。不过,你可以使用函数来返回一个对象,因此可以做一些事情,如把所有的代码找/在一个返回对象的函数中创buildExcel对象。
Function OpenExcelInstance() As Excel.Application Dim oXL As Excel.Application 'If Excel is running, get a handle on it; otherwise start a new instance of Excel On Error Resume Next Set oXL = GetObject(, "Excel.Application") If Err Then ExcelWasNotRunning = True Set oXL = New Excel.Application End If On Error GoTo Err_Handler Set OpenExcelInstance = oXL Exit Function Err_Handler: MsgBox WorkbookToWorkOn & " caused a problem. " & Err.Description, vbCritical, "Error: " & Err.Number Set OpenExcelInstance = Nothing End Function
然后你的testing子将被减less到(尽pipe这个代码没有错误检查,如果由于某种原因没有创buildExcel引用或工作簿无法打开)。
Sub test() Dim oXL As Excel.Application Dim oWB As Excel.Workbook Set oXL = OpenExcelInstance() Set oWB = oXL.Workbooks.Open(FileName:="somefile.xls") oWB.Application.Run "Module1.TestMacro", "JasonX" Set oXL = Nothing Set oWB = Nothing End Sub
你可以缩短它到这样的(GetObject打开文件,如果它尚未打开):
Dim oWB As Object Set oWB = GetObject("C:\somefile.xls", "Excel.Application") oWB.Application.Visible = True ' optional show the Excel Application to check the full path to the Macro oWB.Application.Run "Module1.TestMacro", "JasonX" If oWB.Application.Workbooks.Count = 1 Then oWB.Application.Quit Else oWB.Close ' optional close the Excel Application or the Workbooks Set oWB = Nothing
在你的情况下发生错误,因为oWB没有在你正在调用的子中声明。 昏暗(声明),调用/执行,并释放所有需要发生在同一个子。