2011-12-23 30 views
7

Tôi đang cố tạo thông báo Please Wait trong Excel-VBA. Điều này là để nhắc nhở người dùng xử lý một truy vấn sql rằng quá trình này vẫn đang tiếp diễn.Excel VBA "Vui lòng chờ" Thông báo bật lên

Tôi muốn thông báo này được hiển thị trong biểu mẫu người dùng.

Hiện tại, người dùng kết nối với sql db, chọn db và một số tùy chọn khác, nhấn Go ... và biểu mẫu không tải. Tại điểm Go tôi có một biểu mẫu khác bật lên với thông báo Please Wait, nhưng biểu mẫu này không tải xuống, tức là lệnh thực thi sql không chạy.

Mã của tôi cho gọi Please Wait userform, bao gồm một nhãn:

Call WaitShowSQl.ExecuteCall KillWaitCall WaitShow 
    SQl.Execute 
    Call KillWait 

Trong một mô-đun mã tôi có:

Sub WaitShow() 
    Wait.Show 
    End Sub 

    Sub KillWait() 
    Unload Wait 
    End Sub 

Tôi đã userform gọi wait với đoạn mã sau:

Private Sub UserForm_Activate() 
Call PleaseWait 
End Sub 

Sub PleaseWait() 
Wait.Label1.Caption = "Calculating...Please Wait!" 
End Sub 

Bây giờ khi thực thi mã, thời gian chạy es không di chuyển trở lại thông qua các mô-đun để thực hiện như sau:

SQl.ExecuteSQl.Execute 

tôi có thể hiển thị sự tiến bộ của chương trình với một thanh trạng thái, nhưng một userform bật lên thông điệp sẽ rất hữu ích cho chương trình này.

Trả lời

6

Hành vi mặc định của phương thức Form.Show là hiển thị biểu mẫu dưới dạng hộp thoại phương thức. Những gì bạn đang tìm kiếm là một hộp thoại modeless, vì vậy bạn cần phải xác định rằng, như thế này:

Sub WaitShow() 
    Wait.Show vbModeLess 
End Sub 

Cập nhật:

Nếu bạn không thể sử dụng hộp thoại không chế, bạn có các tùy chọn khác, như đã đề cập trong nhận xét. Một trong số đó là để cho userform chờ đợi thực thi SQL. Điều này có thể được thực hiện như thế này:

Trong hình thức chờ đợi, đầu tiên khai báo các biến

Private mySomeParameter1 As String 
Private mySomeReturnValue1 As String 

'Input parameters to the form 
Public Sub Init(ByVal some_parameter1 As String, ...) 
... Initialize your SQL, NOT execute it 
End Sub 

'Output values from the from 
Public Sub GetReturns(ByRef some_return_value1 As String, ...) 
... set the output parameters... 
End Sub 

'Do the work 
Private Sub UserForm_Activate() 
    Call PleaseWait 
    'Either call DoEvents or a manual Refresh to let the label display itself 
    Call ExecutSQL ' A function that executes the SQL 
    Unload Me 
End Sub 

Và theo hình thức chính:

Sub WaitShow() 
    Wait.Init(the parameters...) 
    Wait.Show 
    Wait.GetReturns(the results...) 
End Sub 

Tuy nhiên, một lựa chọn cho bạn là nên bỏ qua Chờ biểu mẫu hoàn toàn và thay vào đó hiển thị hình ảnh "Đang chờ" trên biểu mẫu chính và ẩn nó khi quá trình xử lý SQL được thực hiện.

+0

Cảm ơn bạn đã trả lời GTG. Tôi đã thử điều đó và nhận được điều này: Không thể hiển thị biểu mẫu không phương thức khi biểu mẫu phương thức được hiển thị. – Fwafa

+0

Ngoài ra, tôi quên đề cập đến hình thức đầu tiên mà người dùng chọn các tùy chọn vẫn được hiển thị. – Fwafa

+1

Giả sử biểu mẫu đầu tiên của bạn cần phải là phương thức, sau đó bạn có thể đặt mã Thực thi SQL bên trong biểu mẫu người dùng "Đang chờ" hoặc gọi hàm trong biểu mẫu gốc từ biểu mẫu người dùng "Đang chờ". Bằng cách đó bạn không cần thêm bất kỳ mô-đun nào. Một lựa chọn thứ ba sẽ là tạo một ActiveX .exe cho biểu mẫu "Đang chờ" và để cho quá trình đó hiển thị một biểu mẫu "Chờ đợi" vô ích. Tuy nhiên, điều đó sẽ yêu cầu bạn triển khai tệp .exe đó cùng với trang tính Excel của bạn. – GTG

1

Dưới đây là làm thế nào để hiển thị một thanh tiến trình trong khi người dùng của bạn đang chờ đợi cho Excel để kết thúc chế biến:

https://stackoverflow.com/a/10791349/138938

Excel progress bar

Trong trường hợp của bạn, bạn có thể đoán một cách hợp lý "trung bình" thời gian cho truy vấn của bạn và cập nhật thanh tiến trình với tỷ lệ phần trăm của thời gian đó, điều này sẽ đảm bảo cho người dùng của bạn rằng Excel đang hoạt động và họ không cần phải lo lắng.

0

Giải pháp của tôi kém thanh lịch và ấn tượng hơn những người khác. FYI, kịch bản của tôi đang xử lý cho một số đối tác trong một FOR ...Vòng lặp tiếp theo và tôi muốn cập nhật màn hình với đối tác hiện đang được xử lý.

Tôi đã tạo tab trang tính có tên là "Tin nhắn". Tôi mở rộng ô A1 càng rộng càng tốt, và tôi chọn một phông chữ mà tôi thích một bảng phối màu mà tôi thích. Tập lệnh của tôi bắt đầu bằng cách tắt ScreenUpdating. Tôi sau đó

Sheets("Messages").Select 
Cells(1, 1).Value = "Processing " & Partner 
Application.ScreenUpdating = True 
Application.ScreenUpdating = False 

Sau này, tôi quay lại bất kỳ trang tính nào tôi cần. Không có gì lạ mắt, nhưng nó nhanh chóng, dễ dàng và làm những gì tôi cần. :)

0

tôi sử dụng một nút lệnh trên mẫu quy định đến một kích thước rất nhỏ, ẩn khi tải mẫu đơn, với chú thích "Xin vui lòng chờ, chế biến ..."

tôi thay đổi kích thước nút theo hình thức Sự kiện Iniliatlise (tôi chỉ đơn giản là thay đổi kích thước hình dạng bằng cách sử dụng các thuộc tính chiều cao trên cùng, bên trái, chiều rộng &). YOu tất nhiên có thể làm cho nó bất cứ điều gì kích thước bạn thích.

Tôi làm cho nút lệnh hiển thị ngay trước khi mã tốn thời gian của tôi & làm cho nó ẩn lần nữa ở cuối mã.

Yêu cầu một số "DoEvents" nhưng hoạt động hoàn hảo.

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