2009-11-23 51 views
7

Mã VBA sau dừng tại Me.Show. Từ các thử nghiệm của tôi, có vẻ như là Me.Show dừng tất cả việc thực thi mã, ngay cả khi mã nằm bên trong UserForm.Tại sao Hiển thị UserForm như là Thực thi Mã Dừng Phương thức?

phần này nằm ngoài UserForm:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    objProgress.ShowProgress 
    Unload objProgress 
End Sub 

Phần này là bên trong UserForm:

Private Sub ShowProgress() 
    Me.Show vbModal 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

Mã này dừng lại ở Me.Show, sau khi UserForm được hiển thị. Không có lỗi, nó chỉ ngừng thực thi mã. Có vẻ như rằng cách duy nhất để thực thi mã bên trong một UserForm phương thức trong VBA là bao gồm nó trong thủ tục UserForm_Activate như thế này:

phần này nằm ngoài UserForm:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    Load objProgress 
    Unload objProgress 
End Sub 

Phần này là bên trong UserForm:

Private Sub UserForm_Initialize() 
    Me.Show vbModal 
End Sub 

Private Sub UserForm_Activate() 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

Tất nhiên, tôi không thể đặt Me.Show bên UserForm_Activate vì thủ tục mà chỉ cháy sau khi UserFo rm Hiển thị sự kiện.

Các tài liệu cho UserForm.ShowModal nói "Khi một UserForm là phương thức, người dùng phải cung cấp thông tin hoặc đóng UserForm trước khi sử dụng bất kỳ phần nào khác của ứng dụng. Không có mã tiếp theo được thực hiện cho đến khi UserForm được ẩn hoặc bốc dỡ."

Tôi đang cố gắng sử dụng phương thức UseForm theo phương thức làm thanh tiến trình để ngăn người dùng tương tác với ứng dụng trong khi quá trình chạy. Nhưng điều này sẽ khó thực hiện nếu tất cả mã của tôi phải nằm trong thủ tục UserForm_Activate.

Tôi có thiếu gì đó ở đây không? Tại sao tất cả việc thực thi mã đều dừng tại Me.Show?

Trả lời

2

Tôi nghĩ rằng tôi đã tìm ra điều này.

Sau Me.Show sự kiện UserForm_Activate kích hoạt. Nếu không có mã trong thủ tục UserForm_Activate, không có gì xảy ra vì VBA đang đợi Me.Hide.

Vì vậy, thứ tự của các sự kiện là: Me.Show>UserForm_Activate>Me.Hide

Bất kỳ mã mà tôi muốn chạy phải nằm trong thủ tục UserForm_Activate và phải trướcMe.Hide.

Cấu trúc rất nghiêm ngặt, nhưng tôi có thể sử dụng cấu trúc đó cho lợi thế của mình.

+3

Tất cả những gì bạn thực sự cần làm nếu bạn vẫn muốn có thể tương tác với trang tính trong khi biểu mẫu đang sử dụng mã này khi gọi biểu mẫu người dùng: 'userform.show vbModeless'. – Casey

10

Khi biểu mẫu được hiển thị với vbModal, mã sẽ tạm ngừng thực thi và chờ tương tác của người dùng với biểu mẫu. Ví dụ: nhấp vào nút hoặc sử dụng menu thả xuống.

Nếu bạn cập nhật các hình thức sở hữu

ShowModal = False 

và loại bỏ vbModal từ mã của bạn. Điều này sẽ cho phép thực thi mã để tiếp tục khi biểu mẫu được hiển thị.

+0

Yup, vbModeless UserForms rất dễ, nhưng tôi cần phải khóa tương tác người dùng với ứng dụng cho đến khi quá trình kết thúc. Nó chỉ là vấn đề tìm ra cách cấu trúc mã trong một UserForm vbModal. Quá xấu tài liệu không chỉ nói "nếu bạn sử dụng vbModal hãy chắc chắn để đặt bất kỳ mã bạn muốn thực hiện trong UserForm_Activate và _before_ Me.Hide. Cảm ơn! – Kuyenda

+0

Điều đó đã không làm việc cho tôi. Các cuộc gọi' phụ' không tiếp tục chạy , nhưng hoàn toàn không có thành phần nào được hiển thị, không phải là một nhãn đơn giản. – cbaldan

-3

tôi không thực sự biết whats đi sâu vào tâm trí của bạn bởi vì có rất nhiều mã cho những gì bạn đang yêu cầu nhưng tôi hy vọng rằng điều này có thể giúp

Private Sub cmdSwitch_Click() UserForm1.Hide UserForm2 .Show

End Sub

-2

tôi nghĩ rằng tôi figured it out Hãy thử làm bước này đơn giản Trong bạn tạo nhấp chuột phải vào phần ngân hàng và chọn Properties Thay đổi "ShowModal" False hoặc trong mã VBA khi bạn hiển thị userform sử dụng đoạn mã sau:

UserForm1.Show False

5

tôi đã tìm kiếm một câu trả lời cho lý do tại sao tôi đã nhận được các lỗi sau:

Run time error '5': Invalid procedure call or argument

khi chạy dòng mã này:

UserForm1.Show True 

mặc dù làm việc dòng này:

UserForm1.Show False 

Tất nhiên. True không giống với vbModal! Vì vậy, câu trả lời đơn giản là sử dụng các bảng liệt kê chính xác:

UserForm1.Show vbModal 
UserForm1.Show vbModeless 
Các vấn đề liên quan