我正在慢慢学习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对象。
这样的事情是否可能,我的一部分感觉就像我在那里,我的一部分感觉我已经完全搞砸了,而我的一部分认为它不可能......
任何人都可以帮忙吗?
百万。
答案 0 :(得分:1)
你可以将它缩短为这样的东西(如果文件尚未打开,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
答案 1 :(得分:0)
在您的情况下,发生错误是因为未在您调用的子语句中声明oWB。 Dim(声明),调用/执行,并释放所有需要在同一个子中发生。
答案 2 :(得分:0)
你不能随意分解代码,因为你的对象引用需要存在于你正在使用它们的子中。但是你可以使用函数来返回一个对象,因此可以做一些像放入所有代码的东西用于在返回对象的函数中查找/创建Excel对象。
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
然后你的测试子将减少到(虽然这个代码没有错误检查,如果由于某种原因没有创建Excel引用或者无法打开工作簿)。
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