マクロを使用して処理するワークブックがかなりある場合は、処理マクロを各ワークブック内に(Auto_Openマクロとして)配置してから、各ワークブックをロードするための何らかのタイプのルーチンを記述したくなる場合があります。順番に、それを保存します。

これは理論的には良いように聞こえるかもしれませんが、実際には機能しません。どうして?

マクロ制御下でブックを開くと、開いているブックのAuto_Openマクロが自動的に実行されないためです。この問題を回避するには3つの方法があります。

1つ目は、各ブックのAuto_Openマクロに依存しないようにマクロをやり直すことです。各ブックのAuto_Openマクロが同じである場合は、コードを制御ブックの別のプロシージャに移動してみませんか?たとえば、次のプロセスに従ったコードを使用していたとします。

Sub MyMacro()

Dim J As Integer     Dim sTarget As String

Application.ScreenUpdating = False     For J = 1 To 999         sTarget = "Book" & Format(J, "000") & ".xls"

Workbooks.Open sTarget         'Auto_Open runs here         Workbooks(sTarget).Save     Next J     Application.ScreenUpdating = True End Sub

すでに説明した理由により、これは機能しません。 1つの解決策は、次のように、一般的なAuto_Openコードを別のプロシージャに移動し、ブックを開いた後に呼び出すことです。

Sub MyMacro()

Dim J As Integer     Dim sTarget As String

Application.ScreenUpdating = False     For J = 1 To 999         sTarget = "Book" & Format(J, "000") & ".xls"

Workbooks.Open sTarget         Workbooks(sTarget).Activate         DoCommonCode         Workbooks(sTarget).Save     Next J     Application.ScreenUpdating = True End Sub
Sub DoCommonCode()

'Common code goes here End Sub

このアプローチは、ルーチンがすべての異なるワークブックで実行されるものと同じであれば、正常に機能します。ブックごとにルーチンが異なる場合は、VBAにAuto_Openマクロを実行させることができます。これは、ブックを開いた直後にRunAutoMacrosメソッドを使用して実行されます。

Workbooks.Open sTarget ActiveWorkbook.RunAutoMacros xlAutoOpen

このアプローチを考えると、各ワークブックを開くだけのマクロを簡単に思い付くことができ(Auto_Openマクロを実行できるように)、それらを保存することができます。このようなマクロは次のように表示されます。

Sub RunAutoOpenMacrosInBooks()

Dim J As Integer     Dim sTarget As String

Application.ScreenUpdating = False     For J = 1 To 999         sTarget = "Book" & Format(J, "000") & ".xls"

On Error Resume Next         Workbooks.Open sTarget         Windows(sTarget).Activate         With ActiveWorkbook             If .Name <> ThisWorkbook.Name Then                 .RunAutoMacros xlAutoOpen                 .Save                 .Close             End If         End With     Next i     Application.ScreenUpdating = True End Sub

3番目の、さらに優れたアプローチは、各ブックのAuto_Openマクロに依存しないことです。代わりに、マクロを実行する方法としてWorkbook_openイベントに依存してください。 Workbook_openイベントは、ブックが手動で開かれたか別のマクロで開かれたかに関係なく、自動的にトリガーされます。 Auto_Openマクロに期待するのと同じように、イベントに含まれるコードは自動的に実行されます。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(2278)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。