2012-03-28 14 views
9

Tôi đang lập trình trong Microsoft VBA. Lúc đầu, tôi cần phải tạo ra một QueryTable với sự giúp đỡ của một vĩ mô (tôi đã có mã cho điều đó) và sau đó với sự giúp đỡ của các macro tôi cần phải áp dụng các công thức sử dụng dữ liệu trong QueryTable. Vấn đề mà tôi đang phải đối mặt là QueryTable chỉ xuất hiện sau Sub, trong đó mã của nó là, đã hoàn thành công việc. Điều đó có nghĩa là tôi không thể bao gồm mã tạo công thức trong đó, bởi vì không có dữ liệu cho các công thức được tạo ra trên đó.Mô-đun VBA chạy các mô-đun khác

Ý tưởng ngay bây giờ là viết một module có thể chạy các module khác:

Sub moduleController() 
    Run "Module1" 
    Run "Module2" 
End Sub 

này cung cấp cho các lỗi:

Run time error 1004 - cannot run the macro "macroname". The macro may not be available in this workbook or all macros may be disabled.

gì có thể là giải pháp? Có lẽ có một giải pháp khác cho vấn đề tải QueryTable của tôi?

+0

Có hai vấn đề có thể xảy ra với QueryTable của bạn. 1.) Bạn có làm mới truy vấn sau khi thêm nó không? 2.) Theo mặc định các truy vấn mới được thiết lập để làm mới trong nền. Nếu bạn không thay đổi điều đó thì macro của bạn không chờ truy vấn hoàn tất. Hãy thử làm mới truy vấn của bạn bằng '.Refresh BackgroundQuery: = False'. – mischab1

Trả lời

16

Miễn là các macro được đề cập nằm trong cùng sổ làm việc và bạn xác minh tên tồn tại, bạn có thể gọi các macro đó từ bất kỳ mô-đun nào khác theo tên, không phải theo mô-đun.

Vì vậy, nếu trong Module1 bạn có hai macro Macro1 và Macro2 và module2 bạn có Macro3 và Macro 4, sau đó trong một macro khác bạn có thể gọi cho họ tất cả:

Sub MasterMacro() 
    Call Macro1 
    Call Macro2 
    Call Macro3 
    Call Macro4 
End Sub 
+0

Ngoài ra, nếu Macro1 - Macro4 không nằm trong cùng một mô-đun như MasterMacro, thì Macro1 - Macro4 cần được khai báo là công khai, không phải riêng tư. – mischab1

+0

Cảm ơn bạn, Jerry! Bạn đã giải quyết nó! Cần lưu ý rằng một vấn đề khác mà tôi gặp phải là tên của macro không thể giống như tên của mô-đun. Họ phải khác! – ositra

2

Phần "Module1" của cùng một sổ làm việc có chứa "moduleController" chưa?
Nếu không, bạn có thể gọi phương thức công khai là "Module1" sử dụng Application.Run someWorkbook.xlsm!methodOfModule.

+0

Có, nó nằm trong cùng một sổ làm việc. Tuy nhiên, cảm ơn bạn cho dòng mã! Tôi đã học được điều gì đó mới mẻ. – ositra

1

Tôi chỉ học được một cái gì đó mới nhờ Artiso . Tôi đã đặt cho mỗi mô-đun một tên trong hộp thuộc tính. Những tên này cũng là những gì tôi đã khai báo trong mô-đun. Khi tôi cố gắng gọi mô-đun thứ hai của mình, tôi đã gặp phải lỗi: Lỗi biên dịch: Biến hoặc thủ tục dự kiến, không phải là mô-đun

Sau khi đọc lại mô tả thứ hai của tôi, tôi đã đổi tên mô-đun thứ hai của mình đầu tiên, và vấn đề được giải quyết. Công cụ thú vị! Cảm ơn thông tin Artiso!

Trong trường hợp kinh nghiệm của tôi là không rõ ràng:

Tên Module: AllFSGroupsCY Public Sub AllFSGroupsCY()

Mô-đun Tên: AllFSGroupsPY Public Sub AllFSGroupsPY()

Từ AllFSGroupsCY()

Public Sub FSGroupsCY() 

    AllFSGroupsPY 'will error each time until the properties name is changed 

End Sub 
Các vấn đề liên quan