اگر تعداد زیادی کتاب کار دارید که میخواهید با استفاده از ماکروها پردازش کنید، ممکن است وسوسه شوید که ماکرو پردازش را در هر کتاب کار قرار دهید (به عنوان یک ماکرو Auto_Open)، و سپس نوعی روتین برای بارگیری هر کتاب بنویسید. به نوبه خود، و آن را ذخیره کنید.
اگرچه این ممکن است در تئوری خوب به نظر برسد، اما در عمل کار نخواهد کرد. چرا؟ زیرا هنگامی که یک کتاب کار را تحت کنترل ماکرو باز می کنید، ماکرو Auto_Open در کتاب کاری که باز می شود به طور خودکار اجرا نمی شود. سه راه برای حل این مشکل وجود دارد.
اولین مورد این است که ماکرو خود را دوباره انجام دهید تا در هر کتاب کار به ماکروهای 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
به دلایلی که قبلا توضیح داده شد، این کار نمی کند. یک راه حل این است که به سادگی کد مشترک 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
رویکرد سوم و حتی بهتر از آن این است که در هر یک از کتاب های کاری خود به ماکروهای Auto_Open تکیه نکنید. در عوض، به رویداد Workbook_Open به عنوان راهی برای اجرای ماکرو خود تکیه کنید. رویداد Workbook_Open به طور خودکار فعال می شود، صرف نظر از اینکه کتاب کار به صورت دستی یا در ماکرو دیگری باز شود. کدی که رویداد حاوی آن است به طور خودکار اجرا می شود، درست همانطور که از یک ماکرو Auto_Open انتظار دارید.