Hỏi code VBA làm chữ ẩn hiện trên Label trong Form. (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

thangteo

Thành viên thường trực
Tham gia
8/5/07
Bài viết
393
Được thích
43
Nhờ các thầy và các anh xem chỉ giúp em đoạn code khi nhấn nút NHẤP NHÁY thì chữ (hiện tại trong form nó là số 6) nó ẩn rồi hiện tức là nhấp nháy với ạ, và có thể thay đổi tốc độc nhấp nháy theo khoảng thời gian mà mình có thể thay đổi trong code được ạ.
Thank!
 

File đính kèm

Mình có câu hỏi: Làm sao thoát hay đóng Form lại vậy bạn?
Chắc do em không để ý chọn ở thuộc tính form, cứ tạm thời thoát form chọn ALT+F4 các anh nhé, còn nếu nhờ các anh làm được thì gán nó nhấp nháy mấy lần rồi tự exit form luôn.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các thầy và các anh xem chỉ giúp em đoạn code khi nhấn nút NHẤP NHÁY thì chữ (hiện tại trong form nó là số 6) nó ẩn rồi hiện tức là nhấp nháy với ạ, và có thể thay đổi tốc độc nhấp nháy theo khoảng thời gian mà mình có thể thay đổi trong code được ạ.
Thank!
Chèn code dưới đây vào 1 module:
Mã:
Private valT As Double
Sub T_Start()
  valT = Now + TimeSerial(0, 0, 1)
  With UserForm1.Label1
    If (Second(Now) Mod 2) Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HFF00&
    End If
    Application.OnTime valT, "T_Start", , True
    UserForm1.Repaint
  End With
End Sub
Sub T_Stop()
  On Error Resume Next
  Application.OnTime valT, "T_Start", , False
End Sub
Code cho CommandButton1 trên UserForm:
Mã:
Private Sub CommandButton1_Click()
  Dim bChk As Boolean
  Dim sStart As String, sStop As String
  sStart = "NH" & ChrW(7844) & "P NHÁY"
  sStop = "NG" & ChrW(7914) & "NG"
  bChk = (CommandButton1.Caption = sStart)
  If bChk Then T_Start Else: T_Stop
  CommandButton1.Caption = IIf(bChk, sStop, sStart)
End Sub
Màu mè gì thêm nữa.. bạn tự mình tùy biến nhé
 
Upvote 0
Chèn code dưới đây vào 1 module:
Mã:
Private valT As Double
Sub T_Start()
  valT = Now + TimeSerial(0, 0, 1)
  With UserForm1.Label1
    If (Second(Now) Mod 2) Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HFF00&
    End If
    Application.OnTime valT, "T_Start", , True
    UserForm1.Repaint
  End With
End Sub
Sub T_Stop()
  On Error Resume Next
  Application.OnTime valT, "T_Start", , False
End Sub
Code cho CommandButton1 trên UserForm:
Mã:
Private Sub CommandButton1_Click()
  Dim bChk As Boolean
  Dim sStart As String, sStop As String
  sStart = "NH" & ChrW(7844) & "P NHÁY"
  sStop = "NG" & ChrW(7914) & "NG"
  bChk = (CommandButton1.Caption = sStart)
  If bChk Then T_Start Else: T_Stop
  CommandButton1.Caption = IIf(bChk, sStop, sStart)
End Sub
Màu mè gì thêm nữa.. bạn tự mình tùy biến nhé
Em đã làm theo như hướng dẫn mà chạy im re, liệu có sai gì ở chỗ "NH" & ChrW(7844) & "P NHÁY" không ạ. Liệu chữ NHÁY có ổn trong code VBA không ạ?
 

File đính kèm

Upvote 0
Em đã làm theo như hướng dẫn mà chạy im re, liệu có sai gì ở chỗ "NH" & ChrW(7844) & "P NHÁY" không ạ. Liệu chữ NHÁY có ổn trong code VBA không ạ?
Dạ được rồi thầy ạ. Do lỗi chữ trên comandbutton với code thôi ạ. Nhưng thầy ơi, khoảng thời gian tùy chỉnh cho nhấp nháy nhanh chậm thế nào được ạ.?
 

File đính kèm

Upvote 0
........ chỉ giúp em đoạn code khi nhấn nút NHẤP NHÁY thì chữ ................. có thể thay đổi tốc độc nhấp nháy theo khoảng thời gian mà mình có thể thay đổi trong code

Tôi thấy bạn nên làm một ứng dụng cho tốt để sử dụng còn hơn làm ba cái hoa lá cành (chỉ xem chơi cho vui) chẳng có tác dụng gì cả.
 
Upvote 0
Dạ được rồi thầy ạ. Do lỗi chữ trên comandbutton với code thôi ạ. Nhưng thầy ơi, khoảng thời gian tùy chỉnh cho nhấp nháy nhanh chậm thế nào được ạ.?
Thì chỗ:
Mã:
If (Second(Now) Mod 2) Then
là thời gian chớp tắt đó. Code thế nghĩa là 1 giây sáng, 1 giây tắt. Muốn tăng 1 giây lên 2 giây thì.. làm sao? Bạn tự suy nghĩ đi chứ
Gợi ý: Ở trên dùng Mod, giờ kết hợp thêm INT nữa là được
---------------------------
Tuy nhiên: code trên thuộc dạng đơn giản, chạy sẽ không "mượt". Trong khi đó tôi biết có thể bạn định dùng code này cho dự án lớn nào đó. Vậy giải pháp tổng thể cho bạn luôn
1> Code trong module1:
Mã:
Private Declare PtrSafe Function SetTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
        ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long

Public lCount As Long
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
  lCount = lCount + 1
  With UserForm1.Label1
    If (lCount Mod 2) Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HFF00&
    End If
    UserForm1.Repaint
  End With
End Function
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Sub StopTimer()
  On Error Resume Next
  KillTimer Application.hWnd, 1
End Sub
2> Code trong UserForm1
Mã:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU As Long = &H80000

Dim hWnd As LongPtr, uStyle As Long, lCount As Long
Private Sub CommandButton1_Click()
  Dim bChk As Boolean
  Dim sStart As String, sStop As String
  sStart = "NH" & ChrW(7844) & "P NHÁY"
  sStop = "NG" & ChrW(7914) & "NG"
  lCount = 0
  bChk = (CommandButton1.Caption = sStart)
  If bChk Then StartTimer Else: StopTimer
  CommandButton1.Caption = IIf(bChk, sStop, sStart)
End Sub
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  uStyle = GetWindowLong(hWnd, GWL_STYLE)
  SetWindowLong hWnd, GWL_STYLE, uStyle And Not WS_SYSMENU
End Sub
Private Sub UserForm_Terminate()
  StopTimer
End Sub
Ở đây bạn chỉ cần chú ý Sub StartTimer
Mã:
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Con số 500 là thời gian. Tăng số này lên nghĩa là giảm tốc độ chớp tắt và ngược lại
Làm sơ qua, bạn test lại giúp nhé!
 

File đính kèm

Upvote 0
Thì chỗ:
Mã:
If (Second(Now) Mod 2) Then
là thời gian chớp tắt đó. Code thế nghĩa là 1 giây sáng, 1 giây tắt. Muốn tăng 1 giây lên 2 giây thì.. làm sao? Bạn tự suy nghĩ đi chứ
Gợi ý: Ở trên dùng Mod, giờ kết hợp thêm INT nữa là được
---------------------------
Tuy nhiên: code trên thuộc dạng đơn giản, chạy sẽ không "mượt". Trong khi đó tôi biết có thể bạn định dùng code này cho dự án lớn nào đó. Vậy giải pháp tổng thể cho bạn luôn
1> Code trong module1:
Mã:
Private Declare PtrSafe Function SetTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
        ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long

Public lCount As Long
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
  lCount = lCount + 1
  With UserForm1.Label1
    If (lCount Mod 2) Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HFF00&
    End If
    UserForm1.Repaint
  End With
End Function
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Sub StopTimer()
  On Error Resume Next
  KillTimer Application.hWnd, 1
End Sub
2> Code trong UserForm1
Mã:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU As Long = &H80000

Dim hWnd As LongPtr, uStyle As Long, lCount As Long
Private Sub CommandButton1_Click()
  Dim bChk As Boolean
  Dim sStart As String, sStop As String
  sStart = "NH" & ChrW(7844) & "P NHÁY"
  sStop = "NG" & ChrW(7914) & "NG"
  lCount = 0
  bChk = (CommandButton1.Caption = sStart)
  If bChk Then StartTimer Else: StopTimer
  CommandButton1.Caption = IIf(bChk, sStop, sStart)
End Sub
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  uStyle = GetWindowLong(hWnd, GWL_STYLE)
  SetWindowLong hWnd, GWL_STYLE, uStyle And Not WS_SYSMENU
End Sub
Private Sub UserForm_Terminate()
  StopTimer
End Sub
Ở đây bạn chỉ cần chú ý Sub StartTimer
Mã:
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Con số 500 là thời gian. Tăng số này lên nghĩa là giảm tốc độ chớp tắt và ngược lại
Làm sơ qua, bạn test lại giúp nhé!
Không biết anh làm gì mà Em thử tí mà không có đường tắt được ...Phải Task manager nó mới chịuCapture.PNG
 
Upvote 0
Upvote 0
Thì chỗ:
Mã:
If (Second(Now) Mod 2) Then
là thời gian chớp tắt đó. Code thế nghĩa là 1 giây sáng, 1 giây tắt. Muốn tăng 1 giây lên 2 giây thì.. làm sao? Bạn tự suy nghĩ đi chứ
Gợi ý: Ở trên dùng Mod, giờ kết hợp thêm INT nữa là được
---------------------------
Tuy nhiên: code trên thuộc dạng đơn giản, chạy sẽ không "mượt". Trong khi đó tôi biết có thể bạn định dùng code này cho dự án lớn nào đó. Vậy giải pháp tổng thể cho bạn luôn
1> Code trong module1:
Mã:
Private Declare PtrSafe Function SetTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
        ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long

Public lCount As Long
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
  lCount = lCount + 1
  With UserForm1.Label1
    If (lCount Mod 2) Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HFF00&
    End If
    UserForm1.Repaint
  End With
End Function
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Sub StopTimer()
  On Error Resume Next
  KillTimer Application.hWnd, 1
End Sub
2> Code trong UserForm1
Mã:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU As Long = &H80000

Dim hWnd As LongPtr, uStyle As Long, lCount As Long
Private Sub CommandButton1_Click()
  Dim bChk As Boolean
  Dim sStart As String, sStop As String
  sStart = "NH" & ChrW(7844) & "P NHÁY"
  sStop = "NG" & ChrW(7914) & "NG"
  lCount = 0
  bChk = (CommandButton1.Caption = sStart)
  If bChk Then StartTimer Else: StopTimer
  CommandButton1.Caption = IIf(bChk, sStop, sStart)
End Sub
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  uStyle = GetWindowLong(hWnd, GWL_STYLE)
  SetWindowLong hWnd, GWL_STYLE, uStyle And Not WS_SYSMENU
End Sub
Private Sub UserForm_Terminate()
  StopTimer
End Sub
Ở đây bạn chỉ cần chú ý Sub StartTimer
Mã:
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Con số 500 là thời gian. Tăng số này lên nghĩa là giảm tốc độ chớp tắt và ngược lại
Làm sơ qua, bạn test lại giúp nhé!
Thầy ơi! File bật lên báo lỗi này ạ, cả 2 file lỗi như nhau:
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    133.4 KB · Đọc: 7
Upvote 0
Đã ổn thầy à, xin thầy cho chút kiến thức về chỗ PtrSafe và LongPrt ạ? Lười tìm hiểu mong thầy bỏ quá!
Mấy vụ đó liên quan đến 32bit và 64bit ấy
Mò mò trên google từ khóa liên quan đến PtrSafe sẽ có cả đống (diễn đàn mình cũng có)
Ah, nhân tiện mình hỏi thêm:
- Bạn dùng Windows 32 hay 64?
- Bạn dùng Office 32 hay 64?
 
Upvote 0
Thầy ndu cho em xen ngang tí, sao Userform của bạn thangteo kế nút Close lại có nút Help(?) còn Userform của em không có.
 
Upvote 0
Cám ơn bạn,mà nút Help mình thấy cũng chả có tác dụng gì, nên cũng không cho nó hiện ra.
 
Upvote 0
Thầy ơi! File bật lên báo lỗi này ạ, cả 2 file lỗi như nhau:

Office 2007 32 bit không có từ khóa Ptrsafe , từ khóa này chỉ có ở Office 2010 trở lên. Hình ảnh bạn chụp thì khả năng 85% đang xài Office 2007.
Những hàm API đang được sử dụng ở trên không cần thiết sử dụng Ptrsafe nên bạn có thể thoải mái bỏ đi hết nhé.
 
Upvote 0
Office 2007 32 bit không có từ khóa Ptrsafe , từ khóa này chỉ có ở Office 2010 trở lên. Hình ảnh bạn chụp thì khả năng 85% đang xài Office 2007.
Những hàm API đang được sử dụng ở trên không cần thiết sử dụng Ptrsafe nên bạn có thể thoải mái bỏ đi hết nhé.
Xin hỏi thêm 1 chút, sau khi xóa PtrSafe và sửa LongPrt thành Long thì qua Excel của Office cao hơn vẫn chạy ổn chứ ạ?
 
Upvote 0
Xin hỏi thêm 1 chút, sau khi xóa PtrSafe và sửa LongPrt thành Long thì qua Excel của Office cao hơn vẫn chạy ổn chứ ạ?
Nếu bạn không có ý định sử dụng Office 64 bit thì không cần quan tâm đến các từ khóa kia làm gì.
Mà cho dù tương lai có xài Office 64 bit thì cứ đi kiếm ngài Bao Công nick màu vàng nhờ tư vấn tiếp, lo gì.
 
Upvote 0
File đã chạy tốt, nhưng sao khi chạy nhấp nháy thì Form như kiểu bị giật theo nhịp nhấp nháy ý. Có cách nào khắc phục cái kiểu bị giật này không ạ?
 
Upvote 0
File đã chạy tốt, nhưng sao khi chạy nhấp nháy thì Form như kiểu bị giật theo nhịp nhấp nháy ý. Có cách nào khắc phục cái kiểu bị giật này không ạ?
Thường trước khi đưa file lên tôi đã thử rất kỹ. Máy tôi cấu hình cực yếu nhưng không hề có hiện tượng như bạn vừa mô tả. Bạn thử mang sang máy khác kiểm tra xem sao. Hoặc bạn có thể quay phim màn hình để tôi xem nó "giật" là giật như thế nào
 
Upvote 0
Thường trước khi đưa file lên tôi đã thử rất kỹ. Máy tôi cấu hình cực yếu nhưng không hề có hiện tượng như bạn vừa mô tả. Bạn thử mang sang máy khác kiểm tra xem sao. Hoặc bạn có thể quay phim màn hình để tôi xem nó "giật" là giật như thế nào

anh vui lòng cho biết dòng này có tác dụng gì và tại sao cần có dòng này ?

Mã:
UserForm1.Repaint
 
Upvote 0
anh vui lòng cho biết dòng này có tác dụng gì và tại sao cần có dòng này ?

Mã:
UserForm1.Repaint
Hồi trước khi viết mấy cái code liên quan đến tạo hiệu ứng, có đôi lúc code chạy mà màn hình không đáp ứng kịp nên chẳng nhìn thấy chuyện gì xảy ra (dù biết code đang chạy)
Sau đó có tham khảo vài giải pháp và được gợi ý dòng lệnh trên. Khi áp dụng vào thì thấy giải quyết được vấn đề!
Repaint là vẽ lại. Cái tên của nó đã nói lên ý nghĩa và tác dụng của nó rồi còn gì
 
Upvote 0
Hồi trước khi viết mấy cái code liên quan đến tạo hiệu ứng, có đôi lúc code chạy mà màn hình không đáp ứng kịp nên chẳng nhìn thấy chuyện gì xảy ra (dù biết code đang chạy)
Sau đó có tham khảo vài giải pháp và được gợi ý dòng lệnh trên. Khi áp dụng vào thì thấy giải quyết được vấn đề!
Repaint là vẽ lại. Cái tên của nó đã nói lên ý nghĩa và tác dụng của nó rồi còn gì
Thường trước khi đưa file lên tôi đã thử rất kỹ. Máy tôi cấu hình cực yếu nhưng không hề có hiện tượng như bạn vừa mô tả. Bạn thử mang sang máy khác kiểm tra xem sao. Hoặc bạn có thể quay phim màn hình để tôi xem nó "giật" là giật như thế nào
Dạ vâng, thầy xem qua xem nó là như nào?. Hix.. Có vài các Label va nút bấm em thêm vào làm ví dụ xem nó có bị nháy không và cũng bị nháy cả ạ.
Có khi nào lệnh Repaint vô tình mà bạn AutoReply đề cập đến lại là nguyên nhân dẫn đến hiện tượng nháy này không ạ?
 
Upvote 0
Có khi nào lệnh Repaint vô tình mà bạn AutoReply đề cập đến lại là nguyên nhân dẫn đến hiện tượng nháy này không ạ?
Muốn biết đúng hay không sao bạn không kiểm tra thử, bằng cách xóa dòng lệnh UserForm1.Repaint rồi chạy lại code là biết liền chứ gì
 
Upvote 0
Dạ vâng, thầy xem qua xem nó là như nào?. Hix.. Có vài các Label va nút bấm em thêm vào làm ví dụ xem nó có bị nháy không và cũng bị nháy cả ạ.
Có khi nào lệnh Repaint vô tình mà bạn AutoReply đề cập đến lại là nguyên nhân dẫn đến hiện tượng nháy này không ạ?

Theo như tôi quan sát thì bạn đang làm sai chỗ vẽ các Control đè lên Label "Số 6" dẫn đến việc khi Label "số 6" cập nhật ForeColor thì các Control khác lâu lâu cũng bị nhấp nháy theo. Bạn nên sử dụng 1 đối tượng Frame để chứa các Control trong nhóm , để khi thay đổi label số 6 , không ảnh hưởng đến các Control khác.
Dưới đây là 1 ví dụ
 

File đính kèm

Upvote 0
Theo như tôi quan sát thì bạn đang làm sai chỗ vẽ các Control đè lên Label "Số 6" dẫn đến việc khi Label "số 6" cập nhật ForeColor thì các Control khác lâu lâu cũng bị nhấp nháy theo. Bạn nên sử dụng 1 đối tượng Frame để chứa các Control trong nhóm , để khi thay đổi label số 6 , không ảnh hưởng đến các Control khác.
Dưới đây là 1 ví dụ
Chạy không thấy bị nhiễu nhấp nháy nữa. Giải pháp này có vẻ ổn ạ. Cảm ơn thầy ndu96081631AutoReply nhiều lắm ạ.
 
Upvote 0
Thầy Ndu cho em hỏi tý, nếu muốn Form mở lên thì Label 6 nhấp nháy luôn không cần nhấn Commandbutton (chỉ tắt nhấp nháy khi ắt Form) thì chỉnh code làm sao ah. Em xin đưa file, nhờ thầy Ndu chỉnh dùm
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thầy Ndu cho em hỏi tý, nếu muốn Form mở lên thì Label 6 nhấp nháy luôn không cần nhấn Commandbutton (chỉ tắt nhấp nháy khi ắt Form) thì chỉnh code làm sao ah. Em xin đưa file, nhờ thầy Ndu chỉnh dùm
Hỏi thế người khác trả lời có cần không?
PHP:
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  uStyle = GetWindowLong(hWnd, GWL_STYLE)
  SetWindowLong hWnd, GWL_STYLE, uStyle And Not WS_SYSMENU
  Call CommandButton1_Click        'Thêm dòng này'
End Sub
 
Upvote 0
Em tính là bỏ hẳn nút Commandbutton1 luôn anh befaint ơi.(tính làm cho Form hoa hòe giống biển quảng cáo đèn Led ngoài đường)
 
Upvote 0
Chỉ khi Close Form thì thôi nhấp nháy
Mã:
Private Sub UserForm_Terminate()
  StopTimer
End Sub
 
Upvote 0
Ý em là không sử dung sự kiện Comandbutton_Click nữa mà gán code vào luôn sự kiện Userform_Initialize.
 
Upvote 0
Ý em là không sử dung sự kiện Comandbutton_Click nữa mà gán code vào luôn sự kiện Userform_Initialize.
Không biết nói chuyện với ai. Bực bội!
Đã bảo không dùng thì bỏ đi:
- Trên Form bỏ CommandButton1
- Code trong Form thì bỏ Private Sub CommandButton1_Click()
Còn:
PHP:
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  uStyle = GetWindowLong(hWnd, GWL_STYLE)
  SetWindowLong hWnd, GWL_STYLE, uStyle And Not WS_SYSMENU
  Call StartTimer  '<--------------
End Sub
 
Upvote 0
Hỏi thế người khác trả lời có cần không?
PHP:
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  uStyle = GetWindowLong(hWnd, GWL_STYLE)
  SetWindowLong hWnd, GWL_STYLE, uStyle And Not WS_SYSMENU
  Call CommandButton1_Click        'Thêm dòng này'
End Sub
Hihi. Vẫn trả lời nhiệt tình.
 
Upvote 0
Xin lỗi anh befaint, vì lúc đó là em đang nói với anh, mong anh befaint thứ lỗi.
Em đã làm được rồi.
 

File đính kèm

Upvote 0
Ah mà anh befaint và anh Autoreply, em cũng để ý thấy form của em cũng lâu lâu (cỡ 12->20 giây) cũng bị giật một lần (rỏ nhất là các nút "Sửa", "Xóa" "Lưu")
Không biết có giống như form của bạn thangteo không?(Form em label1 riêng rẻ)
Mong các Anh xem giúp.
 
Upvote 0
Ah mà anh befaint và anh Autoreply, em cũng để ý thấy form của em cũng lâu lâu (cỡ 12->20 giây) cũng bị giật một lần (rỏ nhất là các nút "Sửa", "Xóa" "Lưu")
Không biết có giống như form của bạn thangteo không?(Form em label1 riêng rẻ)
Mong các Anh xem giúp.
Theo em nghĩ vấn đề giật chắc chắn không thể khắc phục được triệt để vì dẫu sao tất cả vẫn trong cùng 1 Form, chỉ cần tìm ra giải pháp để hạn chế đến mức tối đa hiện tượng giật là ok rồi. Khoảng 15-20' mới giật như file vừa gửi lên là quá tốt rồi. Nhưng vẫn hi vọng có 1 giải pháp triệt để luôn, hihi.
 
Upvote 0
Cũng có nhiều người muốn làm nhấp nháy phết!
 
Upvote 0
Cũng có nhiều người muốn làm nhấp nháy phết!
Tôi thì lại không thích màu mè, hoa, lá, cành, mà chỉ thích cái gì ứng dụng tốt cho công việc, giải quyết công việc nhanh, gọn, lẹ chính xác.

Chứ màu mè nhìn cho đẹp chỉ có làm tăng dung lượng File chứ nó chả có tích sự gì cả.
 
Upvote 0
Tôi thì lại không thích màu mè, hoa, lá, cành, mà chỉ thích cái gì ứng dụng tốt cho công việc, giải quyết công việc nhanh, gọn, lẹ chính xác.

Chứ màu mè nhìn cho đẹp chỉ có làm tăng dung lượng File chứ nó chả có tích sự gì cả.
Mỗi người mỗi công việc và lĩnh vực chuyên môn riêng bạn nhé! Có thể công việc của bạn không cần thiết đến nó, nhưng người khác lại cần đến nó để giải quyết vấn đề công việc của họ. Đơn cử như tôi cần, và cũng có 1 số người trong thead này đang thảo luận về nó đấy! Đừng nói: "chả có tích sự gì cả.".
 
Upvote 0
Tôi xin góp ý 3 ý nhỏ:
1. Trong code bạn bỏ dòng Repaint đi. Vì trong tình huống này không cần.
2. Biến lCount = lCount + 1 luôn tăng mà không giảm, vậy nếu form này chạy trong vòng 40 năm thì sẽ overfloat - vượt khoảng giá trị kiểu Long cho phép. Trong bài này thì để form của bạn chạy trong 40 năm thì chắc không bao giờ xảy ra trừ phien Hollyhood. Tuy nhiên trong lập trình phải có cơ chế rết lại giá trị, đây là nguyên tắc an toàn cho các việc sau này khi lập trình.
3. Form bạn tạo cần cót một Command Button để đóng form. Đến dùng nhiều như tôi còn bối rồi loay hoay, sau đó mới nhấn ASLT+F4 để thoát, chiều bạn chắc CTRL+ALT+DELETE mất. :mad:
 
Upvote 0
2. Biến lCount = lCount + 1 luôn tăng mà không giảm, vậy nếu form này chạy trong vòng 40 năm thì sẽ overfloat - vượt khoảng giá trị kiểu Long cho phép. Trong bài này thì để form của bạn chạy trong 40 năm thì chắc không bao giờ xảy ra trừ phien Hollyhood. Tuy nhiên trong lập trình phải có cơ chế rết lại giá trị, đây là nguyên tắc an toàn cho các việc sau này khi lập trình.
Làm gì có cái form nào chạy 40 năm liên tục hả Tuân?
Biến lCount của tôi sẽ tự reset mỗi khi click (lCount= 0 tại sự kiện CommandButton1_Click), thế cũng ổn rồi
 
Upvote 0
Hihi, không có ý gì nhưng form chạy đến 40 năm cũng ít khi xảy ra lắm. Với em như thế này là ok quá rồi, các thầy giỏi quá, khâm phục luôn ạ.
Còn lại thì chỗ bị giật có thể đã khắc phục được tương đối khi chỉ sửa lại chỗ UserForm1.Repaint thành 'UserForm1.Repaint là không thấy giật nữa. Khả năng có hạn nên sửa mò được đến đâu biết đến đó, mong các thầy thông cảm.
 
Upvote 0
Làm gì có cái form nào chạy 40 năm liên tục hả Tuân?
Biến lCount của tôi sẽ tự reset mỗi khi click (lCount= 0 tại sự kiện CommandButton1_Click), thế cũng ổn rồi

Ủa form này anh là à, e tưởng của chủ thớt. :) .

Chạy 40 năm em trêu thôi, vì nó phải ở phim viễn tưởng :D. Thường em viết code hay có đoạn reset biến đếm về giá trị ban đầu sau khi đạt ngưỡng nào đó, còn trường hợp này form không chạy liên tục 40 năm thì để đó cũng đc. :D
 
Upvote 0
Tôi xin góp ý 3 ý nhỏ:
1. Trong code bạn bỏ dòng Repaint đi. Vì trong tình huống này không cần.
2. Biến lCount = lCount + 1 luôn tăng mà không giảm, vậy nếu form này chạy trong vòng 40 năm thì sẽ overfloat - vượt khoảng giá trị kiểu Long cho phép. Trong bài này thì để form của bạn chạy trong 40 năm thì chắc không bao giờ xảy ra trừ phien Hollyhood. Tuy nhiên trong lập trình phải có cơ chế rết lại giá trị, đây là nguyên tắc an toàn cho các việc sau này khi lập trình.
3. Form bạn tạo cần cót một Command Button để đóng form. Đến dùng nhiều như tôi còn bối rồi loay hoay, sau đó mới nhấn ASLT+F4 để thoát, chiều bạn chắc CTRL+ALT+DELETE mất. :mad:
Đối với biến lCount thì thay nó thành kiểu Boolean cho nhanh, đang true thì chuyền thành false, đang false thì chuyển thành true.
 
Upvote 0
Upvote 0
Ủa form này anh là à, e tưởng của chủ thớt. :) .

Chạy 40 năm em trêu thôi, vì nó phải ở phim viễn tưởng :D. Thường em viết code hay có đoạn reset biến đếm về giá trị ban đầu sau khi đạt ngưỡng nào đó, còn trường hợp này form không chạy liên tục 40 năm thì để đó cũng đc. :D
Em có biết làm đâu ạ. Nhờ các thầy giúp cả đấy chứ.
 
Upvote 0
Vậy thay thế Boolean vào sẽ như thế nào ạ??
Mã:
Public lcount As Boolean
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
 
  With UserForm1.Label1
    If lcount Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HC0&
    End If
    lcount = Not (lcount)
    'UserForm1.Repaint
  End With
End Function
 
Upvote 0
Mã:
Public lcount As Boolean
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
 
  With UserForm1.Label1
    If lcount Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HC0&
    End If
    lcount = Not (lcount)
    'UserForm1.Repaint
  End With
End Function
Dạ vâng, cảm ơn ạ.
 
Upvote 0
Có cách nào để chữ trong Label nó nằm ở giữa trên và dưới không các thầy? Em center nó rồi mà chỉ là giữa trái phải thôi, chứ giữa trên dưới không sao chỉnh được???
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    288.6 KB · Đọc: 20
Upvote 0
Có cách nào để chữ trong Label nó nằm ở giữa trên và dưới không các thầy? Em center nó rồi mà chỉ là giữa trái phải thôi, chứ giữa trên dưới không sao chỉnh được???
Tôi thường làm cách này:
- Vẽ Label
- Gõ chữ, chỉnh font size sao cho vừa ý
- Canh giữa theo chiều ngang
- Xong, tôi kéo cạnh dưới của Label, cân chỉnh chiều cao sao cho ta cảm giác được text nằm giữa theo chiều dọc thì thôi
Hoặc bạn cũng có thể chơi "ăn gian" bằng cách vẽ 2 Label lồng nhau, canh cái bên trong nằm giữa cái bên ngoài
 
Upvote 0
Tôi thường làm cách này:
- Vẽ Label
- Gõ chữ, chỉnh font size sao cho vừa ý
- Canh giữa theo chiều ngang
- Xong, tôi kéo cạnh dưới của Label, cân chỉnh chiều cao sao cho ta cảm giác được text nằm giữa theo chiều dọc thì thôi
Hoặc bạn cũng có thể chơi "ăn gian" bằng cách vẽ 2 Label lồng nhau, canh cái bên trong nằm giữa cái bên ngoài
Ba cái đơn giản vậy mà cũng hỏi, anh không thích cách nói chuyện nên không trả lời.
 
Upvote 0
Tôi thường làm cách này:
- Vẽ Label
- Gõ chữ, chỉnh font size sao cho vừa ý
- Canh giữa theo chiều ngang
- Xong, tôi kéo cạnh dưới của Label, cân chỉnh chiều cao sao cho ta cảm giác được text nằm giữa theo chiều dọc thì thôi
Hoặc bạn cũng có thể chơi "ăn gian" bằng cách vẽ 2 Label lồng nhau, canh cái bên trong nằm giữa cái bên ngoài
Dạ em cảm ơn thầy ạ. Những kiến thức và kinh nghiệm của những người đi trước luôn là những giá trị lớn để thế hệ trẻ học tập, dù nó là chỉ là nhỏ thôi.
 
Upvote 0
Ba cái đơn giản vậy mà cũng hỏi, anh không thích cách nói chuyện nên không trả lời.
Dạ em cảm ơn anh đã góp ý ạ, em không có ý gì cả. Chỉ vì là người không chuyên và bước đầu tiếp cận với Excel nên cũng muốn hỏi để nhờ các anh và các thầy ai có thiện ý thì trả lời và cho giải pháp. Còn anh không muốn trả lời thì đó là quyền của anh không ép buộc được ạ. Biết là không nên ỷ nại hoặc việc gì cũng hỏi, nhưng anh cũng đừng nên đề cập đến việc đơn giản hay không đơn giản, người thông thạo có thể thấy đơn giản nhưng đối với người chưa biết nhiều đó lại là điều khó. Đôi điều cùng anh, có gì anh thông cảm khi "Ba cái đơn giản.." là hỏi.
 
Upvote 0
Góp ý cho vui thôi, chứ mấy cái vụ Form tôi đâu có biết đâu.
 
Upvote 0
Gợi ý bạn thêm cách nữa: Thay Label bằng CommandButton là ăn chắc khỏi chỉnh gì cả text nó cũng nằm giữa
 
Upvote 0
Đưa con trỏ về đầu dòng text và Ctrl + Enter cũng có thể là một giải pháp ạ.
 
Upvote 0
Thì chỗ:
Mã:
If (Second(Now) Mod 2) Then
là thời gian chớp tắt đó. Code thế nghĩa là 1 giây sáng, 1 giây tắt. Muốn tăng 1 giây lên 2 giây thì.. làm sao? Bạn tự suy nghĩ đi chứ
Gợi ý: Ở trên dùng Mod, giờ kết hợp thêm INT nữa là được
---------------------------
Tuy nhiên: code trên thuộc dạng đơn giản, chạy sẽ không "mượt". Trong khi đó tôi biết có thể bạn định dùng code này cho dự án lớn nào đó. Vậy giải pháp tổng thể cho bạn luôn
1> Code trong module1:
Mã:
Private Declare PtrSafe Function SetTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
        ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long

Public lCount As Long
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
  lCount = lCount + 1
  With UserForm1.Label1
    If (lCount Mod 2) Then
      .ForeColor = .BackColor
    Else
      .ForeColor = &HFF00&
    End If
    UserForm1.Repaint
  End With
End Function
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Sub StopTimer()
  On Error Resume Next
  KillTimer Application.hWnd, 1
End Sub
2> Code trong UserForm1
Mã:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU As Long = &H80000

Dim hWnd As LongPtr, uStyle As Long, lCount As Long
Private Sub CommandButton1_Click()
  Dim bChk As Boolean
  Dim sStart As String, sStop As String
  sStart = "NH" & ChrW(7844) & "P NHÁY"
  sStop = "NG" & ChrW(7914) & "NG"
  lCount = 0
  bChk = (CommandButton1.Caption = sStart)
  If bChk Then StartTimer Else: StopTimer
  CommandButton1.Caption = IIf(bChk, sStop, sStart)
End Sub
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  uStyle = GetWindowLong(hWnd, GWL_STYLE)
  SetWindowLong hWnd, GWL_STYLE, uStyle And Not WS_SYSMENU
End Sub
Private Sub UserForm_Terminate()
  StopTimer
End Sub
Ở đây bạn chỉ cần chú ý Sub StartTimer
Mã:
Sub StartTimer()
  On Error Resume Next
  StopTimer
  SetTimer Application.hWnd, 1, 500, AddressOf TimeProc
End Sub
Con số 500 là thời gian. Tăng số này lên nghĩa là giảm tốc độ chớp tắt và ngược lại
Làm sơ qua, bạn test lại giúp nhé!
Em chạy 2 file này trên win 64bit và office 64bit thì nhấn vào nút Nhấp nháy Excel khởi động lại ạ. Bị lỗi gì vậy ạ?
 
Upvote 0
Mấy vụ đó liên quan đến 32bit và 64bit ấy
Mò mò trên google từ khóa liên quan đến PtrSafe sẽ có cả đống (diễn đàn mình cũng có)
Ah, nhân tiện mình hỏi thêm:
- Bạn dùng Windows 32 hay 64?
- Bạn dùng Office 32 hay 64?
Hiện tại PC thì em dùng win 32, office 32. Còn Laptop thì win 64 và office 64.
 
Upvote 0
Có cách nào để chữ trong Label nó nằm ở giữa trên và dưới không các thầy? Em center nó rồi mà chỉ là giữa trái phải thôi, chứ giữa trên dưới không sao chỉnh được???
Rảnh rỗi sinh nông nổi, làm chơi cho vui, phải làm vầy không?

A_L.JPG
 
Upvote 0
Có cách nào để chữ trong Label nó nằm ở giữa trên và dưới không các thầy? Em center nó rồi mà chỉ là giữa trái phải thôi, chứ giữa trên dưới không sao chỉnh được???
Có 1 mẹo nhỏ là chèm hình vào label thì chữ có thể canh đều trên-dưới.
(Các bạn thử kiểm tra lại xem nhé)
 

File đính kèm

Upvote 0

Bài viết mới nhất

Back
Top Bottom