Nếu bạn có khá nhiều sổ làm việc mà bạn muốn xử lý thông qua việc sử dụng macro, bạn có thể muốn đặt macro xử lý trong mỗi sổ làm việc (dưới dạng macro Auto_Open), sau đó viết một số loại quy trình để tải từng sổ làm việc, lần lượt, và lưu nó.

Mặc dù điều này có vẻ tốt trên lý thuyết, nhưng nó sẽ không hoạt động trong thực tế. Tại sao?

Bởi vì khi bạn mở sổ làm việc dưới điều khiển macro, macro Tự động mở trong sổ làm việc đang được mở sẽ không tự động chạy. Có ba cách xung quanh vấn đề này.

Đầu tiên là làm lại macro của bạn để bạn không phụ thuộc vào macro Auto_Open trong mỗi sổ làm việc. Nếu macro Auto_Open trong mỗi sổ làm việc giống nhau, thì tại sao không chỉ cần di chuyển mã sang một thủ tục riêng biệt trong sổ làm việc điều khiển? Ví dụ: giả sử bạn đang sử dụng mã tuân theo quy trình này:

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

Điều này sẽ không hoạt động, vì những lý do đã được giải thích. Một giải pháp là chỉ cần di chuyển mã Auto_Open thông thường sang một thủ tục khác, rồi gọi nó sau khi mở sổ làm việc, như được hiển thị ở đây:

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

Cách tiếp cận này hoạt động tốt, miễn là quy trình giống nhau sẽ được chạy trên tất cả các sổ làm việc khác nhau của bạn. Nếu các quy trình khác nhau trong mỗi sổ làm việc, thì bạn có thể buộc VBA chạy macro Auto_Open. Điều này được thực hiện bằng cách sử dụng phương thức RunAutoMacros ngay sau khi mở sổ làm việc:

Workbooks.Open sTarget ActiveWorkbook.RunAutoMacros xlAutoOpen

Với cách tiếp cận này, bạn có thể dễ dàng nghĩ ra một macro chỉ cần mở từng sổ làm việc (để các macro Auto_Open có thể chạy) và sau đó lưu chúng. Một macro như vậy sẽ xuất hiện như sau:

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

Cách tiếp cận thứ ba, và thậm chí tốt hơn, là không dựa vào các macro Tự động Mở trong mỗi sổ làm việc của bạn. Thay vào đó, hãy dựa vào sự kiện Workbook_Open như một cách để chạy macro của bạn. Sự kiện Workbook_Open được kích hoạt tự động, bất kể sổ làm việc được mở theo cách thủ công hay trong macro khác. Mã của sự kiện chứa được chạy tự động, giống như bạn mong đợi về macro Auto_Open.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (1850) áp dụng cho Microsoft Excel 2007, 2010 và 2013. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện menu cũ hơn của Excel tại đây: