Dùng Class Module để tạo sự kiện người dùng

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Tôi đang trong những bước đầu tiên nghiên cứu về Class Module nên sẽ viết theo sự hiểu biết của tôi. Nếu có sai sót, mong các cao thủ bổ sung thêm
Mục đích của bài viết này là:
- Tạo sự kiện người dùng khi mà các sự kiện cung cấp sẳn không đáp ứng được nhu cầu
- Khi mà chúng ta có nhu cầu "thu gom" tất cả các code của 1 số object (có cùng chức năng) về chung thành 1 code
------------------------------------------------------------------------------------------------
Giả định tình huống thế này:
- Tôi có 1 Workbook bao gồm 9 sheet, trong đó có 1 sheet Menu và 8 sheet con
- Tại sheet Menu, tôi vẽ 8 CommandButton để link đến 8 sheet con
- Tại các sheet con, mỗi sheet tôi vẽ 1 CommandButton để link đến sheet Menu
Thông thường bài toán này người ta sẽ viết cho mỗi CommandButton 1 đoạn code riêng lẻ. Như vậy, nếu số lượng object càng nhiều thì code của chúng ta sẽ trở nên dài dòng
Đàng nào thì các đoạn code ấy cũng có chung 1 mục đích... Vậy liệu có cách nào gom toàn bộ chúng thành 1 code duy nhất hay không? Câu trả lời là: Hoàn toàn có thể nếu biết dùng đến Class Module
Chúng ta cùng tiến hành giải pháp nhé
- Cứ cho rằng toàn bộ các CommandButton đã được vẽ xong
- Chuỗi mà ta gõ trên Caption của CommandButton chính là tên của sheet cần link
Vậy code của chúng ta sẽ bao gồm 2 phần
1> Trong Class Module
Hãy chèn 1 Class Module và nhớ đặt tên cho nó (trong file tôi đặt tên là MyClass) rồi đặt vào nó đoạn code này:
PHP:
Public WithEvents CB As CommandButton
Private Sub CB_Click()
  On Error Resume Next
  Sheets(CB.Caption).Select
End Sub
2> Trong Module
Chèn 1 Module và đặt vào nó đoạn code này:
PHP:
Public Button() As New MyClass
Sub Auto_Open()
  Dim i As Long, Obj As OLEObject, Ws As Worksheet
  For Each Ws In ThisWorkbook.Worksheets
    For Each Obj In Ws.OLEObjects
      If InStr(Obj.progID, "Forms.CommandButton") Then
        ReDim Preserve Button(i)
        Set Button(i).CB = Obj.Object
        i = i + 1
      End If
    Next Obj
  Next Ws
End Sub
Vậy là xong! Hãy chạy Auto_Open rồi nhấn nút thử
Nếu có ý định cho hiện 1 sheet duy nhất, các sheet khác ẩn thì sửa lại code trong Class Module như sau:
PHP:
Public WithEvents CB As CommandButton
Private Sub CB_Click()
  Dim Sh As Worksheet
  On Error Resume Next
  Application.ScreenUpdating = False
  Set Sh = ActiveSheet
  Sheets(CB.Caption).Visible = True
  Sheets(CB.Caption).Select
  Sh.Visible = 2
  Application.ScreenUpdating = True
End Sub
Cũng chạy Auto_Open và thử bấm các nút
Điểm mấu chốt mà ta cần ghi nhớ trong toàn bộ code chỉ có 2 đoạn:
Public WithEvents CB As CommandButton (Khai báo)

Set Button(i).CB = Obj.Object (thiết lập để chúng "bắt tay" nhau)
Không có chúng thì toàn bộ sẽ "tan rã"
------------------------------------------------------------------------------------------------
Tóm lại công việc của chúng ta chỉ là:
- Đặt 2 đoạn code vào đúng vị trí
- Đặt tên cho Class Module
- Vẽ các CommandButton và gõ tên sheet cần link vào caption của chúng
- Chạy Auto_Open để khởi động việc "thu gom"
Điểm thú vị ở đây là:
- Chỉ có các CommandButton (thuộc ActiveX Control) mới bị ảnh hưởng bởi code này (các object khác hoàn toàn không bị ảnh hưởng)
- Với các CommandButton, chỉ cái nào có caption là tên sheet mới bị ảnh hưởng bởi code này
------------------------------------------------------------------------------------------------
Xin lưu ý với các bạn rằng:
- Việc dùng CommandButton để link với các sheet không phải là mục đích chính của bài viết này (chỉ lấy ví dụ để minh họa), vì thế mà tôi đã không đặt nó vào chung với topic: Tạo nút nhấn để link đến các sheet
- Mục đích chính của bài viết này là hướng dẩn cách dùng Class Module để tự tạo 1 sự kiện người dùng
- Code này chỉ thuộc dạng cơ bản, có thể tùy biến đề áp dụng cho rất nhiều bài toán khác
------------------------------------------------------------------------------------------------
Chỉ với 1 bài viết thì chưa đủ để nói về EventClass, vậy nên rất mong các cao thủ khác cùng góp sức hoàn thiện bài viết này
 

File đính kèm

  • CmdEventClass_1.xls
    84 KB · Đọc: 575
  • CmdEventClass_2.xls
    86.5 KB · Đọc: 468
khi làm các thao tác như bài trước em nói và ấn F5 thì dòng lệnh bị báo lỗi:
Public Button() As New MyClass (từ but...myclass)
và hộp thoại cảnh báo lỗi:

Compile error
invalid use of ..keyword
 
Upvote 0
khi làm các thao tác như bài trước em nói và ấn F5 thì dòng lệnh bị báo lỗi:
Public Button() As New MyClass (từ but...myclass)
và hộp thoại cảnh báo lỗi:

Compile error
invalid use of ..keyword
Thì bạn cứ làm xong hết đi, báo lỗi thế nào cứ mặc kệ, post file lên để mọi người tim nguyên nhân nhé
 
Upvote 0
Bạn làm bước này chưa, nhất là chỗ màu đỏ:

1> Trong Class Module
Hãy chèn 1 Class Modulenhớ đặt tên cho nó (trong file tôi đặt tên là MyClass) rồi đặt vào nó đoạn code này:
 
Upvote 0
Giờ lại được rùi, cảm ơn tất cả các huynh tỷ

Chắc em Inset/class module mới và đặt tên cho class2 trong khi Code là class1.

Không phải "chắc là lỗi do ..." theo kiểu đoán mò mà phải nói chinh xác "Rõ ràng là lỗi do ..."

Bởi vì báo lỗi compile Error ngay dòng code sau:

Public Button() As New MyClass

Chữ Public là từ khoá nên không thể sai, chữ Button là tên biến đang khai báo và có quyền khai báo tuỳ ý, nên không ai bắt sai, As New là từ khoá nên không thể sai.

Chỉ còn chữ MyClass. Bắt lỗi MyClass thì chỉ có 1 lỗi duy nhất là "MyClass" chưa khai báo. Hoặc khai báo 1 đằng sử dụng 1 nẻo.

 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đang trong những bước đầu tiên nghiên cứu về Class Module nên sẽ viết theo sự hiểu biết của tôi. Nếu có sai sót, mong các cao thủ bổ sung thêm
Mục đích của bài viết này là:
- Tạo sự kiện người dùng khi mà các sự kiện cung cấp sẳn không đáp ứng được nhu cầu
- Khi mà chúng ta có nhu cầu "thu gom" tất cả các code của 1 số object (có cùng chức năng) về chung thành 1 code
------------------------------------------------------------------------------------------------
Giả định tình huống thế này:
- Tôi có 1 Workbook bao gồm 9 sheet, trong đó có 1 sheet Menu và 8 sheet con
- Tại sheet Menu, tôi vẽ 8 CommandButton để link đến 8 sheet con
- Tại các sheet con, mỗi sheet tôi vẽ 1 CommandButton để link đến sheet Menu
Thông thường bài toán này người ta sẽ viết cho mỗi CommandButton 1 đoạn code riêng lẻ. Như vậy, nếu số lượng object càng nhiều thì code của chúng ta sẽ trở nên dài dòng
Đàng nào thì các đoạn code ấy cũng có chung 1 mục đích... Vậy liệu có cách nào gom toàn bộ chúng thành 1 code duy nhất hay không? Câu trả lời là: Hoàn toàn có thể nếu biết dùng đến Class Module
Chúng ta cùng tiến hành giải pháp nhé
- Cứ cho rằng toàn bộ các CommandButton đã được vẽ xong
- Chuỗi mà ta gõ trên Caption của CommandButton chính là tên của sheet cần link
Vậy code của chúng ta sẽ bao gồm 2 phần
1> Trong Class Module
Hãy chèn 1 Class Module và nhớ đặt tên cho nó (trong file tôi đặt tên là MyClass) rồi đặt vào nó đoạn code này:
PHP:
Public WithEvents CB As CommandButton
Private Sub CB_Click()
  On Error Resume Next
  Sheets(CB.Caption).Select
End Sub
2> Trong Module
Chèn 1 Module và đặt vào nó đoạn code này:
PHP:
Public Button() As New MyClass
Sub Auto_Open()
  Dim i As Long, Obj As OLEObject, Ws As Worksheet
  For Each Ws In ThisWorkbook.Worksheets
    For Each Obj In Ws.OLEObjects
      If InStr(Obj.progID, "Forms.CommandButton") Then
        ReDim Preserve Button(i)
        Set Button(i).CB = Obj.Object
        i = i + 1
      End If
    Next Obj
  Next Ws
End Sub
Vậy là xong! Hãy chạy Auto_Open rồi nhấn nút thử
Nếu có ý định cho hiện 1 sheet duy nhất, các sheet khác ẩn thì sửa lại code trong Class Module như sau:
PHP:
Public WithEvents CB As CommandButton
Private Sub CB_Click()
  Dim Sh As Worksheet
  On Error Resume Next
  Application.ScreenUpdating = False
  Set Sh = ActiveSheet
  Sheets(CB.Caption).Visible = True
  Sheets(CB.Caption).Select
  Sh.Visible = 2
  Application.ScreenUpdating = True
End Sub
Cũng chạy Auto_Open và thử bấm các nút
Điểm mấu chốt mà ta cần ghi nhớ trong toàn bộ code chỉ có 2 đoạn:
Public WithEvents CB As CommandButton (Khai báo)

Set Button(i).CB = Obj.Object (thiết lập để chúng "bắt tay" nhau)
Không có chúng thì toàn bộ sẽ "tan rã"
------------------------------------------------------------------------------------------------
Tóm lại công việc của chúng ta chỉ là:
- Đặt 2 đoạn code vào đúng vị trí
- Đặt tên cho Class Module
- Vẽ các CommandButton và gõ tên sheet cần link vào caption của chúng
- Chạy Auto_Open để khởi động việc "thu gom"
Điểm thú vị ở đây là:
- Chỉ có các CommandButton (thuộc ActiveX Control) mới bị ảnh hưởng bởi code này (các object khác hoàn toàn không bị ảnh hưởng)
- Với các CommandButton, chỉ cái nào có caption là tên sheet mới bị ảnh hưởng bởi code này
------------------------------------------------------------------------------------------------
Xin lưu ý với các bạn rằng:
- Việc dùng CommandButton để link với các sheet không phải là mục đích chính của bài viết này (chỉ lấy ví dụ để minh họa), vì thế mà tôi đã không đặt nó vào chung với topic: Tạo nút nhấn để link đến các sheet
- Mục đích chính của bài viết này là hướng dẩn cách dùng Class Module để tự tạo 1 sự kiện người dùng
- Code này chỉ thuộc dạng cơ bản, có thể tùy biến đề áp dụng cho rất nhiều bài toán khác
------------------------------------------------------------------------------------------------
Chỉ với 1 bài viết thì chưa đủ để nói về EventClass, vậy nên rất mong các cao thủ khác cùng góp sức hoàn thiện bài viết này

Xin cho em hỏi lại về vấn đề này ạ. Nếu giờ thay bằng tạo một sheet menu như trên em muốn là form có tên menu " trên đó chứa các commanbutton link tới các sheet như sheet menu kia" thì có làm được không ạ
--------------------------------------
Ở trên code viết vào module class
Mã:
[COLOR=#000000][COLOR=#0000BB]Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]CB[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Caption[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Select[/COLOR][/COLOR]
giờ em thay bằng
Mã:
userforms(CB.caption).select
thì có chạy được không hả anh?
em đã thay nhưng không được?
vậy nếu được thì phải làm như thế nào ạh???
 
Upvote 0
Xin cho em hỏi lại về vấn đề này ạ. Nếu giờ thay bằng tạo một sheet menu như trên em muốn là form có tên menu " trên đó chứa các commanbutton link tới các sheet như sheet menu kia" thì có làm được không ạ
--------------------------------------
Ở trên code viết vào module class
Mã:
[COLOR=#000000][COLOR=#0000BB]Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]CB[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Caption[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Select[/COLOR][/COLOR]
giờ em thay bằng
Mã:
userforms(CB.caption).select
thì có chạy được không hả anh?
em đã thay nhưng không được?
vậy nếu được thì phải làm như thế nào ạh???

Muốn thế nào bạn phải cho file lên đây chứ (chẳng lẽ tôi phải giả lập file để test giúp bạn sao)
 
Upvote 0
Muốn thế nào bạn phải cho file lên đây chứ (chẳng lẽ tôi phải giả lập file để test giúp bạn sao)
Anh giúp em bài này theo modulle class và thay bằng dùng sheet menu như trên mà em muốn thay bằng form menu như trong file đính kèm ạ.
 

File đính kèm

  • Menuform_linksheet.xlsm
    25.5 KB · Đọc: 28
Upvote 0
Anh giúp em bài này theo modulle class và thay bằng dùng sheet menu như trên mà em muốn thay bằng form menu như trong file đính kèm ạ.

Với 3 cái sheet, làm class chi cho mệt vậy bạn? Làm hẳn trên form với sự kiện Click của các nút được rồi!
 
Lần chỉnh sửa cuối:
Upvote 0
Anh giúp em bài này theo modulle class và thay bằng dùng sheet menu như trên mà em muốn thay bằng form menu như trong file đính kèm ạ.

Chèn 1 Class (tên mặc định của nó là Class1) với code:
Mã:
Public WithEvents cmd As MSForms.CommandButton
Private Sub cmd_Click()
  On Error Resume Next
  With ThisWorkbook.Worksheets(cmd.Caption)
    .Visible = -1
    .Activate
  End With
End Sub
Code trong UserForm menu
Mã:
Dim Buttons() As New [COLOR=#ff0000][B]Class1[/B][/COLOR]
Private Sub UserForm_Initialize()
  Dim Ctrl As Control, n As Long
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.CommandButton Then
      n = n + 1
      ReDim Preserve Buttons(1 To n)
      Set Buttons(n).cmd = Ctrl
    End If
  Next
End Sub
 
Upvote 0
Đó là file test thôi mà bạn. Hơn nữa mình muốn học hỏi là chính mà!!!!
OK, nó cũng chỉ đơn giản vậy thôi:

1) Code trong Class Module:

[GPECODE=vb]Option Explicit
Public WithEvents CmdBttn As MSForms.CommandButton

Private Sub CmdBttn_Click()
Sheets(CmdBttn.Caption).Select
Range("A1").Select
Unload menu
End Sub
[/GPECODE]

2) Code trong UserForm Module:

Mã:
Option Explicit
Private MyCmdBttn(1 To 3) As New EventClass

Private Sub UserForm_Initialize()
    Dim i As Long
    For i = 1 To 3
        Set MyCmdBttn(i).CmdBttn = Me("CommandButton" & i)
    Next
End Sub
 

File đính kèm

  • Menuform_linksheet.xlsm
    30.3 KB · Đọc: 55
Upvote 0
OK, nó cũng chỉ đơn giản vậy thôi:

1) Code trong Class Module:

[GPECODE=vb]Option Explicit
Public WithEvents CmdBttn As MSForms.CommandButton

Private Sub CmdBttn_Click()
Sheets(CmdBttn.Caption).Select
Range("A1").Select
Unload menu
End Sub
[/GPECODE]

2) Code trong UserForm Module:

Mã:
Option Explicit
Private MyCmdBttn(1 To 3) As New EventClass

Private Sub UserForm_Initialize()
    Dim i As Long
    For i = 1 To 3
        Set MyCmdBttn(i).CmdBttn = Me("CommandButton" & i)
    Next
End Sub
Mã:
CmdBttn As MSForms.CommandButton
Cái này mình hiểu là: Cmdbttn có kiểu của commandbutton trên form đúng không vây?
Mã:
Private Sub UserForm_Initialize()
Giải thích giúp mình tẹo ý nghĩa của nó "Initialize"
Mã:
For i = 1 To 3
        Set MyCmdBttn(i).CmdBttn = Me("CommandButton" & i)
    Next
Mình không hiểu câu lệnh này, giải thích giúp thêm với bạn?
 
Upvote 0
Mã:
CmdBttn As MSForms.CommandButton
Cái này mình hiểu là: Cmdbttn có kiểu của commandbutton trên form đúng không vây?
Mã:
Private Sub UserForm_Initialize()
Giải thích giúp mình tẹo ý nghĩa của nó "Initialize"
Mã:
For i = 1 To 3
        Set MyCmdBttn(i).CmdBttn = Me("CommandButton" & i)
    Next
Mình không hiểu câu lệnh này, giải thích giúp thêm với bạn?

Private Sub UserForm_Initialize()

Nếu như các controls trên UserForm đều có sự kiện, thì UserForm cũng có sự kiện. Câu lệnh trên là một trong các sự kiện mà khi bắt đầu load form (form show), trước khi sự kiện Activate của form xảy ra thì xuất hiện sự kiện Initialize. Đây là sự kiện đầu tiên của UserForm, các thủ tục trong sự kiện này chạy ngầm cho đến khi form hiện trước mặt chúng ta là đã kết thúc.

Private MyCmdBttn(1 To 3) As New EventClass

MyCmdBttn là một mảng 1 chiều, tôi tạo ra mảng này nhằm mục đích để nó là mảng kiểu Object Data, nó có 3 phần tử (nếu ta chắc chắn biết số phần tử nằm bên trong nó, trong trường hợp này ta biết chắc có 3 nút lệnh), mỗi phần tử là một object. Mảng này được điều khiển bởi ClassModule EventClass.

Set MyCmdBttn(i).CmdBttn = Me("CommandButton" & i)

Khi chạy vòng lặp i từ 1 đến 3, vì mỗi phần tử là một object nên chúng ta phải SET chúng, và gán chúng có thuộc tính mà ta đã thực hiện trong ClassModule, đó chính là CmdBttn.

Me("CommandButton" & i) Ở đây Me là đại diện cho UserForm, thay vì ta viết Controls("CommandButton" & i) thì ta viết như thế. Bởi các Button có Name giống nhau (CommandButton) chỉ khác số cuối nên ta lợi dụng điểm này mà thực hiện vòng lặp.

Thay vì ta SET đến 3 lần, mỗi lần như sau:

Set MyCmdBttn(1).CmdBttn = CommandButton1
Set MyCmdBttn(2).CmdBttn = CommandButton2
Set MyCmdBttn(3).CmdBttn = CommandButton3

Thì chúng ta dùng vòng lặp cho nó gọn lại.

Hy vọng tôi nói nôm na như thế bạn sẽ hiểu được những gì tôi nói.
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Public WithEvents cmd As MSForms.CommandButton
Private Sub cmd_Click()
  On Error Resume Next
  With ThisWorkbook.Worksheets(cmd.Caption)
    .Visible = -1
    .Activate
  End With
End Sub
Mã:
Dim Buttons() As New [COLOR=#ff0000][B]Class1[/B][/COLOR]
Private Sub UserForm_Initialize()
  Dim Ctrl As Control, n As Long
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.CommandButton Then
      n = n + 1
      ReDim Preserve Buttons(1 To n)
      Set Buttons(n).cmd = Ctrl
    End If
  Next
End Sub
Mã:
Option Explicit
Private MyCmdBttn(1 To 3) As New EventClass

Private Sub UserForm_Initialize()
    Dim i As Long
    For i = 1 To 3
        Set MyCmdBttn(i).CmdBttn = Me("CommandButton" & i)
    Next
End Sub
Cảm ơn 2 anh nhé! 2 code đều cho kết qquar đúng ạ
 
Upvote 0
Cảm ơn 2 anh nhé! 2 code đều cho kết qquar đúng ạ

Tùy theo trường hợp mà dùng 2 thủ tục vòng lặp, nếu tất cả các nút lệnh đều là nút mà chọn sheet thì vòng lặp For Each ... Next sẽ thực hiện đúng, giả sử có nhiếu nút lệnh với các chức năng khác nhau, thì vô hình chung vòng lặp loại này sẽ mang thuộc tính của sự kiện mà ta vừa tạo tại ClassModule. Đồng thời ta có trên form nào là label, nào là textbox, combobox, frame, v.v... thì vòng lặp này quét qua tất cả để chỉ tìm đúng loại CommandButton thôi nên sẽ "phí" thời gian.

Với trường hợp vòng lặp For i ... Next thì không hữu dụng với các Name không có điểm chung. Với tôi sẽ chọn cách này và đặt tên cho chúng giống nhau, chỉ khác số cuối cùng (chẳng hạn cmdSheet1, cmdSheet2, v.v...) thì sẽ làm cho code gọn đi rất nhiều.
 
Upvote 0
Tùy theo trường hợp mà dùng 2 thủ tục vòng lặp, nếu tất cả các nút lệnh đều là nút mà chọn sheet thì vòng lặp For Each ... Next sẽ thực hiện đúng, giả sử có nhiếu nút lệnh với các chức năng khác nhau, thì vô hình chung vòng lặp loại này sẽ mang thuộc tính của sự kiện mà ta vừa tạo tại ClassModule. Đồng thời ta có trên form nào là label, nào là textbox, combobox, frame, v.v... thì vòng lặp này quét qua tất cả để chỉ tìm đúng loại CommandButton thôi nên sẽ "phí" thời gian.

Với trường hợp vòng lặp For i ... Next thì không hữu dụng với các Name không có điểm chung. Với tôi sẽ chọn cách này và đặt tên cho chúng giống nhau, chỉ khác số cuối cùng (chẳng hạn cmdSheet1, cmdSheet2, v.v...) thì sẽ làm cho code gọn đi rất nhiều.

Mình gặp phải vấn đề không biết xử lý sao
Mình vào vấn đề luôn, xóa một commandbutton chạy trương trình báo lỗi dù đã thử nhiều cách:
1> Bổ xung lại commandbutton với tên đúng như tên đã sóa nhưng không được
2> Sóa nốt sheet tương ứng tên của commandbutton đó cũng không được
gặp phải cái này mình phải xử lý như thế nào ? bạn có thể thử trên file bạn up cho mình!!!
 
Upvote 0
Mình gặp phải vấn đề không biết xử lý sao
Mình vào vấn đề luôn, xóa một commandbutton chạy trương trình báo lỗi dù đã thử nhiều cách:
1> Bổ xung lại commandbutton với tên đúng như tên đã sóa nhưng không được
2> Sóa nốt sheet tương ứng tên của commandbutton đó cũng không được
gặp phải cái này mình phải xử lý như thế nào ? bạn có thể thử trên file bạn up cho mình!!!


Bạn hơi bị lạ đời đấy! File bạn làm bị lỗi, thì bạn post cái file đó lên để người ta xem nó bị lỗi gì, tôi có làm cái file nào đâu mà bạn bảo tôi up file lên?
 
Upvote 0
Chèn 1 Class (tên mặc định của nó là Class1) với code:
Mã:
Public WithEvents cmd As MSForms.CommandButton
Private Sub cmd_Click()
  On Error Resume Next
  With ThisWorkbook.Worksheets(cmd.Caption)
    .Visible = -1
    .Activate
  End With
End Sub
Code trong UserForm menu
Mã:
Dim Buttons() As New [COLOR=#ff0000][B]Class1[/B][/COLOR]
Private Sub UserForm_Initialize()
  Dim Ctrl As Control, n As Long
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.CommandButton Then
      n = n + 1
      ReDim Preserve Buttons(1 To n)
      Set Buttons(n).cmd = Ctrl
    End If
  Next
End Sub
Khi chạy code của HOANG TRONG NGHIA không áp dụng được trong quá trình sửa chữa nhưng code của anh thì rất thuận lợi cho sửa chữa theo nhu cầu sử dụng ạ
 
Upvote 0
Web KT
Back
Top Bottom