Chuyên đề giải đáp những thắc mắc về code VBA

boma

Thành viên mới
Tham gia ngày
8 Tháng mười hai 2006
Bài viết
41
Được thích
4
Điểm
665
Nơi ở
TP.HCM
anh thử làm như thế này nghen
đầu tiên tạo một sub ShowForm trong module nào đó
Mã:
Sub ShowForm()
    NhapLieu.Show
End Sub
tiếp đó ra bảng tính làm như hình

View attachment 182761
Kiểu như thế này à anh? Em không biết nhiều, gà gà làm cho anh thôi. hehe.
Hiện form: phím Ctrl + f nhé!
Qua hướng dẫn của 2 bạn thì mình phát hiện ra vấn đề của mình. Về cơ bản thì cách làm của mình giống 2 bạn nhưng khác ở tên của thủ tục. Nếu đặt là Auto_0pen thì khi mở nó tự load form lên luôn, còn đặt tên khác đi thì khi bấm phím tắt nó mới load. Cái này có thể là do Auto_0pen là một tên mặc định có sẵn của VBA hay gì đó mà mà mình vẫn chưa hiểu. Cảm ơn hai bạn.
 

CarotNho

Thành viên chính thức
Tham gia ngày
12 Tháng tám 2017
Bài viết
53
Được thích
63
Điểm
180
Qua hướng dẫn của 2 bạn thì mình phát hiện ra vấn đề của mình. Về cơ bản thì cách làm của mình giống 2 bạn nhưng khác ở tên của thủ tục. Nếu đặt là Auto_0pen thì khi mở nó tự load form lên luôn, còn đặt tên khác đi thì khi bấm phím tắt nó mới load. Cái này có thể là do Auto_0pen là một tên mặc định có sẵn của VBA hay gì đó mà mà mình vẫn chưa hiểu. Cảm ơn hai bạn.
bao nhiêu tên hay sao anh hem đặt như "Sub heo_dat_ham_an" nè
Sub Auto_ Open rơi vào đúng từ khóa của VBA, nó tương tự với sự với sự kiện Open() của workbook đó anh
Mã:
Private Sub Workbook_Open()
'...
End Sub
 

NguyenNgocThuHien

Cute Black Cat
Tham gia ngày
11 Tháng mười một 2016
Bài viết
596
Được thích
418
Điểm
235
Qua hướng dẫn của 2 bạn thì mình phát hiện ra vấn đề của mình. Về cơ bản thì cách làm của mình giống 2 bạn nhưng khác ở tên của thủ tục. Nếu đặt là Auto_0pen thì khi mở nó tự load form lên luôn, còn đặt tên khác đi thì khi bấm phím tắt nó mới load. Cái này có thể là do Auto_0pen là một tên mặc định có sẵn của VBA hay gì đó mà mà mình vẫn chưa hiểu. Cảm ơn hai bạn.
Thử dùng cái này xem.
http://www.automateexcel.com/vba/run-macro-excel-close
 

NguyenNgocThuHien

Cute Black Cat
Tham gia ngày
11 Tháng mười một 2016
Bài viết
596
Được thích
418
Điểm
235
bao nhiêu tên hay sao anh hem đặt như "Sub heo_dat_ham_an" nè
Sub Auto_ Open rơi vào đúng từ khóa của VBA, nó tương tự với sự với sự kiện Open() của workbook đó anh
Mã:
Private Sub Workbook_Open()
'...
End Sub
Cái ý đâu phải là từ khóa gì đâu, đơn thuần là tên của một thủ tục, khi mờ file excel sẽ tự chạy nó mà không cần người dùng phải kích chạy.
 

VetMini

Gian hùng bàn phiếm (thành viên trôi nước)
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
7,953
Được thích
9,286
Điểm
560

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Đây là code thời gian chạy lùi trong file:

Option Explicit
Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:05")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat - TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
MsgBox "Het thoi gian nghi.": Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
----------------------------
- Giờ muốn cho nó chạy tiến thì chỉnh lại thế nào vậy mọi người? Cho nó chạy tiến, khi nào nhấn Close Form thì tắt ạ.
Trích dẫn: đây là file thầy Ndu cung cấp ạ.
 

File đính kèm

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Mấy hôm nay thread vắng tanh..
 
Lần chỉnh sửa cuối:

dhn46

Hướng tới tương lai
Tham gia ngày
1 Tháng ba 2011
Bài viết
3,246
Được thích
3,830
Điểm
560
Nơi ở
Hải Phòng
Đây là code thời gian chạy lùi trong file:

Option Explicit
Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:05")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat - TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
MsgBox "Het thoi gian nghi.": Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
----------------------------
- Giờ muốn cho nó chạy tiến thì chỉnh lại thế nào vậy mọi người? Cho nó chạy tiến, khi nào nhấn Close Form thì tắt ạ.
Trích dẫn: đây là file thầy Ndu cung cấp ạ.
Bạn sửa như sau
Mã:
Private Sub Cmd_Click()
  Dim Dat As Double, kt As Double, Check As Boolean
  Check = (Cmd.Caption = "Show Form")
  Cmd.Caption = IIf(Check, "Close Form", "Show Form")
  Dat = TimeValue("00:00:00")
  If Check Then
    UserForm1.Show
    Do
      UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
      Dat = Dat + TimeValue("00:00:01")
      kt = Timer
      Do While Timer - kt < 1
        DoEvents
        If UserForm1.Label1.Caption = "00:00:05" Then
          MsgBox "Het thoi gian nghi.": Exit Sub
        End If
    Loop
    Loop
  Else
    Unload UserForm1: Exit Sub
  End If
End Sub
 

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Bạn sửa như sau
Mã:
Private Sub Cmd_Click()
  Dim Dat As Double, kt As Double, Check As Boolean
  Check = (Cmd.Caption = "Show Form")
  Cmd.Caption = IIf(Check, "Close Form", "Show Form")
  Dat = TimeValue("00:00:00")
  If Check Then
    UserForm1.Show
    Do
      UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
      Dat = Dat + TimeValue("00:00:01")
      kt = Timer
      Do While Timer - kt < 1
        DoEvents
        If UserForm1.Label1.Caption = "00:00:05" Then
          MsgBox "Het thoi gian nghi.": Exit Sub
        End If
    Loop
    Loop
  Else
    Unload UserForm1: Exit Sub
  End If
End Sub
Dạ cảm ơn anh ạ. Vậy là theo code này thì vẫn có thời gian quy định đến bao nhiêu sẽ báo hết thời gian chứ không phải là để chạy tự do đến khi nào nhấn dừng thì thôi.
Vậy thì ta cứ chỉnh phần:
If UserForm1.Label1.Caption = "00:00:05" Then
MsgBox "Het thoi gian nghi.": Exit Sub
chỗ "00:00:05" thành "23:00:00" chẳng hạn là có thể vô tư ngồi nhìn nó chạy rồi.
Cảm ơn anh ạ!
 

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Bạn sửa như sau
Mã:
Private Sub Cmd_Click()
  Dim Dat As Double, kt As Double, Check As Boolean
  Check = (Cmd.Caption = "Show Form")
  Cmd.Caption = IIf(Check, "Close Form", "Show Form")
  Dat = TimeValue("00:00:00")
  If Check Then
    UserForm1.Show
    Do
      UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
      Dat = Dat + TimeValue("00:00:01")
      kt = Timer
      Do While Timer - kt < 1
        DoEvents
        If UserForm1.Label1.Caption = "00:00:05" Then
          MsgBox "Het thoi gian nghi.": Exit Sub
        End If
    Loop
    Loop
  Else
    Unload UserForm1: Exit Sub
  End If
End Sub
Nhưng có một vấn đề anh ơi, nếu Close Form trước 5s, Form vẫn đóng bình thường nhưng hết 5s nó vẫn hiện MsgBox báo hết giờ ạ. Làm sao để tắt trước giờ mình quy định thì nó không thông báo hết giờ nữa ạ?
Close Form trước giờ quy định thì code vẫn chạy ngầm thì phải (như ảnh): Untitled.jpg
 

dhn46

Hướng tới tương lai
Tham gia ngày
1 Tháng ba 2011
Bài viết
3,246
Được thích
3,830
Điểm
560
Nơi ở
Hải Phòng
Nhưng có một vấn đề anh ơi, nếu Close Form trước 5s, Form vẫn đóng bình thường nhưng hết 5s nó vẫn hiện MsgBox báo hết giờ ạ. Làm sao để tắt trước giờ mình quy định thì nó không thông báo hết giờ nữa ạ?
Close Form trước giờ quy định thì code vẫn chạy ngầm thì phải (như ảnh): View attachment 182988
Bạn chỉnh câu lệnh tương ứng thành
Mã:
    Unload UserForm1:  End
 

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Bạn chỉnh câu lệnh tương ứng thành
Mã:
    Unload UserForm1:  End
Dạ vâng, cảm ơn anh.
Vậy trường hợp Form này chạy trên 1 Form chính khác (tức là nút Show Form ở trong 1 Form chính) thì nếu sửa lại thành: End thì nó sẽ tắt cả 2 Form luôn à anh? Giải quyết thế nào khi Close Form mà code ko chạy ngầm nữa và form chính vẫn hiện để tiếp tục xử lý dữ liệu trên form chính ạ.?
 

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Dạ vâng, cảm ơn anh.
Vậy trường hợp Form này chạy trên 1 Form chính khác (tức là nút Show Form ở trong 1 Form chính) thì nếu sửa lại thành: End thì nó sẽ tắt cả 2 Form luôn à anh? Giải quyết thế nào khi Close Form mà code ko chạy ngầm nữa và form chính vẫn hiện để tiếp tục xử lý dữ liệu trên form chính ạ.?
Loay hoay em chỉnh lại thế này, test thử có vẻ được, các anh xem xem có ổn không ạ:
- Cho nó chạy bắt đầu từ 01s.

Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:01")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat + TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
Unload UserForm1: Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
 

NguyenNgocThuHien

Cute Black Cat
Tham gia ngày
11 Tháng mười một 2016
Bài viết
596
Được thích
418
Điểm
235
Loay hoay em chỉnh lại thế này, test thử có vẻ được, các anh xem xem có ổn không ạ:
- Cho nó chạy bắt đầu từ 01s.

Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:01")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat + TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
Unload UserForm1: Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
 

File đính kèm

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,224
Được thích
8,180
Điểm
860
Nơi ở
TP.HCM
Quan trọng là dùng để làm gì. Ví dụ nếu dùng để tính thời gian làm bài thì tôi chỉ cần giữ chuột ở thanh tiêu đề của form là có thể "tạm dừng" được.
 
Top Bottom