重用VBA Sub打开Excel文件

时间:2017-02-20 22:02:02

标签: excel vba excel-vba

我正在慢慢学习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对象。

这样的事情是否可能,我的一部分感觉就像我在那里,我的一部分感觉我已经完全搞砸了,而我的一部分认为它不可能......

任何人都可以帮忙吗?

百万。

3 个答案:

答案 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