Hỏi về cách tạm thời dừng một Function hay sub để đợi lệnh.

Liên hệ QC

kidoto

Thành viên mới
Tham gia
18/12/07
Bài viết
19
Được thích
3
Chào mọi người!
Vấn đề là mình muốn thiết kế MSGBOX theo kiểu riêng (vì msgBox của vb sài tiếng việt ko tiện, ví dụ có thể Prompt là tiếng việt, nhưng khi hỏi thì button Yes No lại là tiếng anh, vd:
MsgBox "Bạn có thực sự muốn thoát hay ko",vbYesNo ,"Xac nhan"
thì nút xác nhận là "Yes" và "No", mình muốn thiết kế thành "Đồng ý" và "Hủy bỏ"

Vấn đề muốn nhờ mọi người giúp: Làm thế nào mình có thể dừng function lại tạm thời, khi MsgBox (theo kiểu riêng) xuất hiện, nhận câu trả lời (vd "Đồng ý") thì lại chạy tiếp đến những dòng tiếp theo.

Cám ơn tất cả!

From Sa_DQ:
Lần sau bạn đưa bài lên đúng BOX cái nha.

Bài này được dời vào chiều nay
 
Chỉnh sửa lần cuối bởi điều hành viên:
Theo những gì mình hiểu thì khi bạn đã cho gọi hộp thoại Msg ra, tất cả những lệnh tiếp theo sẽ đương nhiên bị dừng lại mà? Đến khi nào mấy cái nút OK, Cancel hay gì gì đó trong hộp thoại Msg được nhấn, thì mới chạy tiếp mà?
 
Chào mọi người!
Vấn đề là mình muốn thiết kế MSGBOX theo kiểu riêng (vì msgBox của vb sài tiếng việt ko tiện, ví dụ có thể Prompt là tiếng việt, nhưng khi hỏi thì button Yes No lại là tiếng anh, vd:
MsgBox "Bạn có thực sự muốn thoát hay ko",vbYesNo ,"Xac nhan"
thì nút xác nhận là "Yes" và "No", mình muốn thiết kế thành "Đồng ý" và "Hủy bỏ"

Vấn đề muốn nhờ mọi người giúp: Làm thế nào mình có thể dừng function lại tạm thời, khi MsgBox (theo kiểu riêng) xuất hiện, nhận câu trả lời (vd "Đồng ý") thì lại chạy tiếp đến những dòng tiếp theo.

Cám ơn tất cả!
Mình hiểu ý bạn, để tránh click chuột nhầm, bao giờ cũng có yêu cầu xác nhận (YES or NO). Mình thường làm thế này:
- Thiết kế MSGBOX với 2 nút YES và NO
- Cho xuất hiện MSGBOX khi nhấn chuột vào nút lệnh.
- Gán code chạy đoạn lệnh (hoặc nhảy tới đoạn code tiếp theo bạn cần) vào nút YES, gán code thoát MSGBOX vào nút NO.

Chúc bạn thành công!
 
Chào mọi người!
Vấn đề là mình muốn thiết kế MSGBOX theo kiểu riêng (vì msgBox của vb sài tiếng việt ko tiện, ví dụ có thể Prompt là tiếng việt, nhưng khi hỏi thì button Yes No lại là tiếng anh, vd:
MsgBox "Bạn có thực sự muốn thoát hay ko",vbYesNo ,"Xac nhan"
thì nút xác nhận là "Yes" và "No", mình muốn thiết kế thành "Đồng ý" và "Hủy bỏ"

Vấn đề muốn nhờ mọi người giúp: Làm thế nào mình có thể dừng function lại tạm thời, khi MsgBox (theo kiểu riêng) xuất hiện, nhận câu trả lời (vd "Đồng ý") thì lại chạy tiếp đến những dòng tiếp theo.

Cám ơn tất cả!

Bạn có thể tạo 1 Userform mô phỏng Msgbox, trên đó có 2 Commandbuuton Tiếp tục và Hủy bỏ. Ta sẽ gán cho 2 Commandbuuton này tương ứng với 2 sub con nào đó. Khi bấm vào thì nó sẽ thực thi nhiệm vụ đã được chỉ định như đóng form, thoát sub hay tiếp tục...

Trong khi form được mở thì hiển nhiên các đoạn chương trình phía sau sẽ bị dừng lại cho đến khi form đóng lại.

Bạn xem file VD mình làm nha. Kết hợp Msgbox có sẵn với MsgboxUni và Msgbox tạo bởi Form
 

File đính kèm

  • VD minh hoa Msgbox - Danh.xls
    53.5 KB · Đọc: 93
Cảm ơn các bạn nhiều nhé.

Bạn có thể tạo 1 Userform mô phỏng Msgbox, trên đó có 2 Commandbuuton Tiếp tục và Hủy bỏ. Ta sẽ gán cho 2 Commandbuuton này tương ứng với 2 sub con nào đó. Khi bấm vào thì nó sẽ thực thi nhiệm vụ đã được chỉ định như đóng form, thoát sub hay tiếp tục...

Trong khi form được mở thì hiển nhiên các đoạn chương trình phía sau sẽ bị dừng lại cho đến khi form đóng lại.

Thực ra đây là cách giải quyết tạm thời cho từng chương trình riêng biệt, từng tác vụ riêng biệt phải code lại.

Mình muốn thiết kế làm sao có thể giải quyết được cho hầu hết các ứng dụng.

Mình đã làm như sau:

Ví dụ: một chương trình gồm fóm, form 2, thì cả 2 fỏm này đều có thể sài 1 msgBox theo kiểu riêng.

Các bạn đọc code thử nhé, các thông báo đơn lẻ như : "lỗi chương trình..." và exitsub thì ok, nhưng các tác vụ theo kiểu "bạn có muốn tiếp tục nữa hay ko?" thì mình gặp khó khăn, do ko biết tạm dừng hàm lại như thế nào, các bạn thử đọc code mình viết xem sao nhé. Thanks tất cả ^^

MsgBoxCustomer.rar

À, mình dùng font VK Sank Serif nên các bạn nhớ add font vào trước hen. Thanks.

:-= - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -:-=

Mấy ngày rồi mà chưa nhận thêm câu trả lời nào hết, buồn 5 ph . . .
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cái này bạn viết trên VB. Tiếc là máy mình không có cài VB nên không test được. Chẳng biết cách nào giúp bạn cả.
 
Hura - đã có cách giải quyết

Sau mấy ngày search, mình vẫn ko biết làm thế nào để tạm dừng một function lại**~**, đành dùng theo cách sử dụng API. híc

Đây là code mình search được và có chỉnh sửa lại cho đúng. (code gốc ko sài được ^^)

vd dùng:

UniMsgBox "Lo64i nha65p lie65i!!!", vbOKOnly, "Tho6ng ba1o!"

Trong modul:

PHP:
Option Explicit
  Public hDlgHook As Long
          
        Public Const FONT_FACE = "Tahoma"
          
        Public Const WH_CBT = 5
        Public Const HCBT_ACTIVATE = 5
        Public Const WM_SETFONT = &H30
        Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal h As Long, ByVal w As Long, ByVal E As Long, ByVal O As Long, ByVal w As Long, ByVal i As Long, ByVal U As Long, ByVal s As Long, ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long
        Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal ParenthWnd As Long, ByVal ChildhWnd As Long, ByVal ClassName As String, ByVal Caption As String) As Long
        Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long
        Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
        Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
        Declare Function GetCurrentThreadId Lib "kernel32" () As Long
        Declare Function SetWindowTextW Lib "user32" (ByVal hWnd As Long, ByVal lpString As Long) As Long
        Declare Function MessageBoxW Lib "user32.dll" (ByVal hWnd As Long, ByVal lpText As Long, ByVal lpCaption As Long, ByVal uType As Long) As Long
        
        Function UniMsgBox(strText As String, Optional iButtons As VbMsgBoxStyle = vbOKOnly, Optional strTitle As String, Optional hWnd As Long = &H0) As VbMsgBoxResult
                If strTitle = "" Then strTitle = App.Title
                hDlgHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, App.hInstance, GetCurrentThreadId())
                UniMsgBox = MessageBoxW(hWnd, StrPtr(ToUni(strText)), StrPtr(ToUni(strTitle)), iButtons)
        End Function
          
        Public Function HookProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
            Dim hStatic1 As Long, hStatic2 As Long, hButton As Long, hFont As Long
            HookProc = CallNextHookEx(hDlgHook, ncode, wParam, lParam)
            If ncode = HCBT_ACTIVATE Then
                hFont = CreateFont(13, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, FONT_FACE)
            
                hStatic1 = FindWindowEx(wParam, 0&, "Static", vbNullString)
                hStatic2 = FindWindowEx(wParam, hStatic1, "Static", vbNullString)
                If hStatic2 = 0 Then hStatic2 = hStatic1
                SendMessage hStatic2, WM_SETFONT, hFont, ByVal 1&
            
                hButton = FindWindowEx(wParam, 0&, "Button", "OK")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr(ChrW(&H110) & "óng")
            
                hButton = FindWindowEx(wParam, 0&, "Button", "&Yes")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Có")
            
                hButton = FindWindowEx(wParam, 0&, "Button", "&No")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Không")
            
                 hButton = FindWindowEx(wParam, 0&, "Button", "&Retry")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Th" & ChrW(&H1EED) & " l" & ChrW(&H1EA1) & "i")
            
                hButton = FindWindowEx(wParam, 0&, "Button", "Cancel")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Thoát")
                
               UnhookWindowsHookEx hDlgHook
            End If
        End Function

Public Function ToUni(str$) As String
    Dim ansi$, UNI$, i&, sTem$, sUni$, arrUNI() As String
    ansi = "a1|a2|a3|a4|a5|a6|a8|a61a62a63a64a65a81a82a83a84a85A1|A2|A3|A4|A5|A6|A8|A61A62A63A64A65A81A82A83A84A85e1|e2|e3|e4|e5|e6|e61e62e63e64e65E1|E2|E3|E4|E5|E6|E61E62E63E64E65i1|i2|i3|i4|i5|I1|I2|I3|I4|I5|o1|o2|o3|o4|o5|o6|o7|o61o62o63o64o65o71o72o73o74o75O1|O2|O3|O4|O5|O6|O7|O61O62O63O64O65O71O72O73O74O75u1|u2|u3|u4|u5|u7|u71u72u73u74u75U1|U2|U3|U4|U5|U7|U71U72U73U74U75y1|y2|y3|y4|y5|Y1|Y2|Y3|Y4|Y5|d9|D9|"
    UNI = "E1,E0,1EA3,E3,1EA1,E2,103,1EA5,1EA7,1EA9,1EAB,1EAD,1EAF,1EB1,1EB3,1EB5,1EB7,C1,C0,1EA2,C3,1EA0,C2,102,1EA4,1EA6,1EA8,1EAA,1EAC,1EAE,1EB0,1EB2,1EB4,1EB6,E9,E8,1EBB,1EBD,1EB9,EA,1EBF,1EC1,1EC3,1EC5,1EC7,C9,C8,1EBA,1EBC,1EB8,CA,1EBE,1EC0,1EC2,1EC4,1EC6,ED,EC,1EC9,129,1ECB,CD,CC,1EC8,128,1ECA,F3,F2,1ECF,F5,1ECD,F4,1A1,1ED1,1ED3,1ED5,1ED7,1ED9,1EDB,1EDD,1EDF,1EE1,1EE3,D3,D2,1ECE,D5,1ECC,D4,1A0,1ED0,1ED2,1ED4,1ED6,1ED8,1EDA,1EDC,1EDE,1EE0,1EE2,FA,F9,1EE7,169,1EE5,1B0,1EE9,1EEB,1EED,1EEF,1EF1,DA,D9,1EE6,168,1EE4,1AF,1EE8,1EEA,1EEC,1EEE,1EF0,FD,1EF3,1EF7,1EF9,1EF5,DD,1EF2,1EF6,1EF8,1EF4,111,110"
    arrUNI = Split(UNI, ",")

    For i = 1 To Len(str)
        If IsNumeric(Mid(str, i + 1, 1)) = False Then
            sUni = sUni & Mid(str, i, 1)
        Else
            sTem = IIf(IsNumeric(Mid(str, i + 2, 1)), Mid(str, i, 3), Mid(str, i, 2))
            i = i + IIf(IsNumeric(Mid(str, i + 2, 1)), 2, 1)
            If InStr(ansi, sTem) > 0 Then sTem = ChrW("&h" & arrUNI(InStr(ansi, sTem) \ 3))
            sUni = sUni & sTem
        End If
    Next
    ToUni = sUni
End Function


Thanks tất cả!
 
Xin bạn Kidoto cho fiel mẫu để học hỏi. Cảm ơn bạn nhiều
 
Xin bạn Kidoto cho fiel mẫu để học hỏi. Cảm ơn bạn nhiều

Chào bạn mymichau!
Thực ra mình thấy ví dụ của bạn hoangdanh đã rất đầy đủ, là giải pháp rất tốt cho lập trình với EXCEL.

Nếu bạn lập trình cho VB6.0 thì có thể dùng file ví dụ sau:
UNIMSG.rar

Chúc bạn thành công!

p/s: Cám ơn bạn hoangdanh nhiều nhé! ^^
 
Cho mình hỏi thêm 1 vấn đề như sau về việc tạm ngưng 1 Sub.
Ví dụ như đang sử dụng worksheetA, nhập giá trị cần tìm bên worksheet B,
Sau đó mình cho chạy 1 sub sẽ dò tìm giá trị đã nhập bên wsheetsB (đơn giản chỉ dùng cách autofilter thôi ) và thế là sub tạm ngừng (do mỗi giá trị mình chỉ tìm các ký tự đầu nên có nhiều dòng giá trị xuất hiện ) .
Sau đó mình lại phải chọn chính xác dòng muốn copy qua wsheetA rồi lại phải chạy sub thứ 2 để copy về.
Mình muốn là sau khi chạy sub1 thì sẽ dò autofilter rồi hiện ra sau đó tạm ngừng để mình lăn chuột tìm chọn dòng cần copy qua wsheetA thì tự động tiếp tục quá trình (tương tự như việc cộng 2 sub lại).
Bạn nào có cao kiến cho mình biết với.
 
Mình muốn là sau khi chạy sub1 thì sẽ dò autofilter rồi hiện ra sau đó tạm ngừng để mình lăn chuột tìm chọn dòng cần copy qua wsheetA thì tự động tiếp tục quá trình (tương tự như việc cộng 2 sub lại).

Vậy bạn thêm vô Sub 2 vài dòng lệnh để nó hỏi bạn chỉ số dòng nó cần copy.
Việc này có thể nhờ InputBox() mà!

Chúc thành công!
 
Web KT
Back
Top Bottom