2017-02-20 13 views
0

私はVBAをゆっくりと学んでおり、本質的にフォーラムからカットアンドペーストすることができましたが、今は固執しています。VBA Subを再利用してExcelファイルを開く

ここでこのスクリプトを使用してください:WordMVP WordからExcelファイルを開くことができます。問題ない。しかし、今ではこのスクリプトを何度も再利用してきたので、モジュールが長くなっています。これを別のサブシステムに分割することはできますか?そして私がそれらを必要とするとき、部品を呼んでください?例えば:(ビットにリンクされたコードをハッキング)

1つの別個のサブでこれを入れて:例えば、

Sub release() 

'Make sure you release object references. 
Set oRng = Nothing 
Set oSheet = Nothing 
Set oWB = Nothing 
Set oXL = Nothing 

End Sub 

と私はそれらを必要なときにそれらを使用する:別で

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 test() 

Call WorkOnAWorkbook("somefile.xls") 
oWB.Application.Run "Module1.TestMacro", "JasonX" 
Call release() 

End Sub 

私はoWB.Application.Run "Module1.TestMacro"、 "JasonX" で必須の424オブジェクトを取得します。

は誰...私はほとんどそこだように私のこの可能性、一部が感じるように、私は完全に台無しにしましたように私の一部が感じる、と私の一部は、その可能性はないと考えて

何でもできることです助けてください??

Thx100万。

+0

何が 'Class'のような音を求めている - (http://www.cpearson.com/Excel/Classes.aspx) –

答えて

0

は、あなたがこのような何かにそれを短縮することができ
+0

ありがとうウェッジ。それは完璧に動作します。私は、この答えが一番好きです。私がやろうとしていたコードの多くを「アウトソース」しています。また、他の人と共有するときに重大なエラーを処理するために、エラー処理を調整することもできます。そうでなければ、私が元に戻すつもりは... "それはうまくいかない..." – NotJasonStatham

0

エラーが発生するのは、呼び出すサブフォルダにoWBが宣言されていないためです。 Dim(宣言)、呼び出し/実行、およびすべてのリリースを同じサブで行う必要があります。あなたのオブジェクト参照を内に存在する必要があるので、あなたはちょうどあなたがしたいしかし、コードを分割することはできません

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 
+0

- [CPearson.com HERESに良いはあなたの研究を開始したいです]アドバイスのためのThxは、物事をより明確にします。 – NotJasonStatham

1

(GetObjectがまだ開いていない場合は、ファイルを開きます) 関数を使用してオブジェクトを返すことができます。したがって、オブジェクトを返す関数で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 
関連する問題