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

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đâ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

  • CountDown.xls
    40 KB · Đọc: 12
Upvote 0
Mấy hôm nay thread vắng tanh..
 
Lần chỉnh sửa cuối:
Upvote 0
Đâ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
 
Upvote 0
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 ạ!
 
Upvote 0
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
 
Upvote 0
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
 
Upvote 0
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 ạ.?
 
Upvote 0
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
 
Upvote 0
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

  • Copy of CountDown.xls
    44 KB · Đọc: 10
Upvote 0
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.
 
Upvote 0
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.
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
 
Upvote 0
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
 
Upvote 0
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
Không đến mức phải gian lận vậy đâu anh. Mà chỉ có mình ngồi xử lý form thôi mà. Hội kia từng người làm bài, làm xong thì báo mồm. Kaka.
 
Upvote 0
Xin hỏi mọi người đoạn code này có nghĩa gì, tại sao lại khai báo biến ở tên của thủ tục (ByVal Target..) và Intersect có nghĩa gì ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("AM1:XFD1")) Is Nothing Then
If Target.Rows.Count = 1 Then
Range("AL1").Value = Target.Value
Range("AL2").Value = Target.Offset(1).Value
GPE
End If
End If
End Sub
 
Upvote 0
Các anh chị giúp em với.
Nhờ các anh chị giải thích code của hàm sau với:
ThisWorkbook.Activate
wksInput.Shapes("cmbUniaxialAnalysis").ThreeD.BevelTopType = msoBevelSlope
 
Upvote 0
Cho em hỏi câu lệnh Căn giữa trong Msgbox như nào ạ! em xin cảm ơn
 
Upvote 0
Web KT
Back
Top Bottom