Nút CommanButton không click được trong userform

Liên hệ QC

tuannguyen789

Thành viên mới
Tham gia
19/4/10
Bài viết
29
Được thích
1
Chào mợi người,

Tuấn có vấn đề khi tự tạo Controls.Add("Forms.CommandButton.1") hoặc Controls.Add("Forms.TabStrip.1") thì sự kiện click không hoạt đông.

Vd: Khi nhấn vào "Test thu" hoặc "label 2" để thoát form hoặc một hành động khác thì không code không thực hiện

Xin mọi người hỗ trợ code cho vấn đề này.
Tuấn gởi file kèm.
Mong được mọi người giúp đỡ.
 

File đính kèm

  • Book1.xlsm
    18.3 KB · Đọc: 15
Bạn phải liên kết nó lại với nhau thì mới được. Nôm na là phải cho nó biết cái nào áp dụng code trong class, nếu không nếu có nhiều Button thì nó biết áp dụng cho cái nào.
Code trong Class Module bạn thêm thủ tục này:
Mã:
Property Set CmdBT(ByVal BT As MSForms.CommandButton)
Set CommandButton = BT
End Property
Private Sub CommandButton_Click() có đoạn Unload Me, code này đặt trong Clase Module nên Me là Class Module và sẽ không có tác dụng với Form. Bạn sửa lại như sau:
Mã:
Unload CommandButton.Parent
Code trong UserForm
Thêm dòng khai báo biến cho Class ở đầu Module
Mã:
Dim Cls As Class1
Thêm code gán Button vào Class (phải sau dòng Set button = ...)
Mã:
Set Cls = New Class1
Set Cls.CmdBT = button
 
Upvote 0
Cám ơn huuthang_bd rất nhiều.

Tuy nhiên, trường hợp nếu thêm 1 textbox hoặc label, khi nhân button nó lại không được báo lỗi.

Vi dụ: nút button khi nhấn thì textbox và Label = 1

Tuấn up file lại, mong a bổ sung code dùm
 

File đính kèm

  • Book1.xlsm
    21.6 KB · Đọc: 12
Upvote 0
Cám ơn huuthang_bd rất nhiều.

Tuy nhiên, trường hợp nếu thêm 1 textbox hoặc label, khi nhân button nó lại không được báo lỗi.

Vi dụ: nút button khi nhấn thì textbox và Label = 1

Tuấn up file lại, mong a bổ sung code dùm
Sửa chổ
Mã:
Controls("TextBox1").Value = 1
thành
Mã:
CommandButton.Parent.Controls("TextBox1").Value = 1
 
Upvote 0
Cám ơn [U]giaiphap[/U]

Sao khi đổi tên nut nhấn lại không thực hiện được vậy. Anh có thể xem qua sửa lại giúp Tuấn nhé.
 

File đính kèm

  • Book1.xlsm
    26.3 KB · Đọc: 4
Upvote 0
Cám ơn [U]giaiphap[/U]

Sao khi đổi tên nut nhấn lại không thực hiện được vậy. Anh có thể xem qua sửa lại giúp Tuấn nhé.
Bạn chưa có kiến thức cơ bản về Class nên xem nhiều ví dụ hơn về nó. Khi sử dụng 3 nút lệnh thì phải khai báo mảng cls thế này.
Mã:
Dim cls(1 To 3) As Class1
Và khi dùng thì phải dùng thế này.
Mã:
Set cls(i) = New Class1
Set cls(i).CmdBT = button
Bạn xem code trong file.
Sẳn tặng thêm cho bạn 1 file về Class
 

File đính kèm

  • Book1 (1).xlsm
    20 KB · Đọc: 12
  • TestCode.xlsm
    22.2 KB · Đọc: 19
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn [U]giaiphap[/U] rất nhiều,

Đúng vậy, tuấn đang tập viết theo cách này thấy nó tiện, vì nhiều sự kiện trùng lập nhiều lần mà nếu viết theo cách thông thường rất dài dòng vì cùng 1 câu lệnh. chỉ khác về số lượng các nút nhấn hoặc các textbox.

Theo như cách anh hướng dẫn, các textbox, TabStrip hay ScrollBar vẫn làm như hướng dẫn, hay mỗi tinh năng nó sẽ có code khác nhau. nhưng cũng phải cần có câu lệnh thực hiện: CommandButton.Parent…(nếu là nut nhấn); Textbox.Parent…(nếu là textbox)
Mong nhận được sự phản hồi từ anh
 
Upvote 0
Cám ơn [U]giaiphap[/U] rất nhiều,

Đúng vậy, tuấn đang tập viết theo cách này thấy nó tiện, vì nhiều sự kiện trùng lập nhiều lần mà nếu viết theo cách thông thường rất dài dòng vì cùng 1 câu lệnh. chỉ khác về số lượng các nút nhấn hoặc các textbox.

Theo như cách anh hướng dẫn, các textbox, TabStrip hay ScrollBar vẫn làm như hướng dẫn, hay mỗi tinh năng nó sẽ có code khác nhau. nhưng cũng phải cần có câu lệnh thực hiện: CommandButton.Parent…(nếu là nut nhấn); Textbox.Parent…(nếu là textbox)
Mong nhận được sự phản hồi từ anh
Tặng thêm cho bạn một file nửa về nhiều Ctrl trong cùng một Class.
 

File đính kèm

  • UserForm events for multiple control types.xlsm
    23.6 KB · Đọc: 24
Upvote 0
Cám [U]giaiphap[/U] nhiều,

Anh xem chinh giup tuấn với sự kiện khi chọ Textbox mà bi báo lỗi trong class.

Set Frame8 = Controls.Add("Forms.Frame.1")

Bị lỗi chỗ này trong class

Tuấn gởi file đính kèm, a xem giúp tuấn
 

File đính kèm

  • Book1.xlsm
    31.9 KB · Đọc: 5
Upvote 0
Cám [U]giaiphap[/U] nhiều,

Anh xem chinh giup tuấn với sự kiện khi chọ Textbox mà bi báo lỗi trong class.

Set Frame8 = Controls.Add("Forms.Frame.1")

Bị lỗi chỗ này trong class

Tuấn gởi file đính kèm, a xem giúp tuấn
Áp dụng tương tự Commanbutton.
Mã:
Set Frame8 = Textbox.Parent.Controls.Add("Forms.Frame.1")
 
Upvote 0
Áp dụng tương tự Commanbutton.
Mã:
Set Frame8 = Textbox.Parent.Controls.Add("Forms.Frame.1")

Rất cám ơn [U]giaiphap,[/U]

Nhân tiên cho Tuấn hỏi thêm, với câu lệnh này sao mỗi lần chạy bị treo, khởi động lại excell


Dim Frame As MSForms.Frame, Frame1 As MSForms.Frame
For i = 1 To 2
Set Frame = Controls.Add("Forms.Frame.1") 'khởi tạo 2 frame (1, 2)
With Frame
.Name = "Frame" & i
'.Caption = .Name
.BorderColor = &H8000000F 'VIEN THREO MAU NEN
.Font.Bold = False
.Height = 295 - Round(i / 3) * 250
.Left = -1 'Frame2.Left + Frame2.Width - 2
.Top = - 2 + Round(i / 3) * 545
'.Caption = .Name
End With
Next
Controls("Frame2").Width = Me.Width

Khi chèn thêm frame (3,4) vào frame1 ở trên đã tạo thì bị lỗi, excell thoát ra.

For i = 1 To 2
Set Frame1 = Frame.Parent.Controls("Frame1").Controls.Add("Forms.Frame.1")'Frame 3, 4 chèn vào trong frame1
With Frame1
.Name = "Frame" & i + 2
'.Caption = .Name
.Height = 295 - Round(i / 3) * 250
.Left = -1 'Frame2.Left + Frame2.Width - 2
.Top = 50 + Round(i / 3) * 545
'.Caption = .Name
End With
Next

Nhờ anh sửa lại giúp code này

Xin cám ơn nhiều
 
Upvote 0
Rất cám ơn [U]giaiphap,[/U]

Nhân tiên cho Tuấn hỏi thêm, với câu lệnh này sao mỗi lần chạy bị treo, khởi động lại excell


Dim Frame As MSForms.Frame, Frame1 As MSForms.Frame
For i = 1 To 2
Set Frame = Controls.Add("Forms.Frame.1") 'khởi tạo 2 frame (1, 2)
With Frame
.Name = "Frame" & i
'.Caption = .Name
.BorderColor = &H8000000F 'VIEN THREO MAU NEN
.Font.Bold = False
.Height = 295 - Round(i / 3) * 250
.Left = -1 'Frame2.Left + Frame2.Width - 2
.Top = - 2 + Round(i / 3) * 545
'.Caption = .Name
End With
Next
Controls("Frame2").Width = Me.Width

Khi chèn thêm frame (3,4) vào frame1 ở trên đã tạo thì bị lỗi, excell thoát ra.

For i = 1 To 2
Set Frame1 = Frame.Parent.Controls("Frame1").Controls.Add("Forms.Frame.1")'Frame 3, 4 chèn vào trong frame1
With Frame1
.Name = "Frame" & i + 2
'.Caption = .Name
.Height = 295 - Round(i / 3) * 250
.Left = -1 'Frame2.Left + Frame2.Width - 2
.Top = 50 + Round(i / 3) * 545
'.Caption = .Name
End With
Next

Nhờ anh sửa lại giúp code này

Xin cám ơn nhiều
Xin lỗi tôi không thể trợ giúp cho bạn được nửa nhé!
 
Upvote 0
Hi anh,

Tuấn bị báo lỗi cái sự kiện Change(), anh có thể xem qua giúp:

trong Class, minh khai báo như sau:
Private WithEvents Textbox As MSForms.Textbox

Public Property Set Dieukhien(ByVal ChonDieuKhien As MSForms.Textbox)
Set Textbox = ChonDieuKhien
End Property

Chỗ này bị báo lỗi hoài.
Private Sub Textbox_Change()
Select Case Textbox.Value
Case 1
Textbox.Parent.Controls("Frame1").Caption = "ok" '.Height + Textbox.Parent.Controls("CommandButton6").Top + 5
End Select
End Sub

Trong userform
Private ChucNangKhung(1 To 16) As Class1
Dim i As Byte
Dim Frame As MSForms.Frame
Dim Textbox As MSForms.Textbox

For i = 1 To 16
Set Frame = Controls.Add("Forms.Frame.1")
With Frame
.Name = "Frame" & i
.Caption = .Name
.BorderColor = &H8000000F 'VIEN THREO MAU NEN
.Font.Bold = False
.Height = 100
.Left = -1 'Frame2.Left + Frame2.Width - 2
.Top = i * 23 - 7 'SO NAY OK
.Width = Me.Width
.ZOrder 0
End With
Next

For i = 1 To 5
Set Textbox = Frame.Parent.Controls("Frame16").Controls.Add("Forms.Textbox.1") 'CHUC NANG DIEU KHIEN
Set ChucNangDieuKhien(i) = New Class1
Set ChucNangDieuKhien(i).Dieukhien = Textbox
With Textbox
.Name = "TextBox" & i
.Left = .Width * i
.Height = 18
.Top = 50
.Width = 50
'.Value = .Name
End With
Next

Mong được hỗ trợ lỗi trên
 
Upvote 0
@tuannguyen789 : Bạn nên làm từ ví dụ đơn giản đã để hiểu về class cơ bản khi áp dụng cho các controls, thì mới kiểm soát được lỗi, giúp tránh gặp lỗi nho nhỏ lặp lại.
 
Lần chỉnh sửa cuối:
Upvote 0
Hi anh,

Tuấn bị báo lỗi cái sự kiện Change(), anh có thể xem qua giúp:

trong Class, minh khai báo như sau:
Private WithEvents Textbox As MSForms.Textbox

Public Property Set Dieukhien(ByVal ChonDieuKhien As MSForms.Textbox)
Set Textbox = ChonDieuKhien
End Property

Chỗ này bị báo lỗi hoài.
Private Sub Textbox_Change()
Select Case Textbox.Value
Case 1
Textbox.Parent.Controls("Frame1").Caption = "ok" '.Height + Textbox.Parent.Controls("CommandButton6").Top + 5
End Select
End Sub

Trong userform
Private ChucNangKhung(1 To 16) As Class1
Dim i As Byte
Dim Frame As MSForms.Frame
Dim Textbox As MSForms.Textbox

For i = 1 To 16
Set Frame = Controls.Add("Forms.Frame.1")
With Frame
.Name = "Frame" & i
.Caption = .Name
.BorderColor = &H8000000F 'VIEN THREO MAU NEN
.Font.Bold = False
.Height = 100
.Left = -1 'Frame2.Left + Frame2.Width - 2
.Top = i * 23 - 7 'SO NAY OK
.Width = Me.Width
.ZOrder 0
End With
Next

For i = 1 To 5
Set Textbox = Frame.Parent.Controls("Frame16").Controls.Add("Forms.Textbox.1") 'CHUC NANG DIEU KHIEN
Set ChucNangDieuKhien(i) = New Class1
Set ChucNangDieuKhien(i).Dieukhien = Textbox
With Textbox
.Name = "TextBox" & i
.Left = .Width * i
.Height = 18
.Top = 50
.Width = 50
'.Value = .Name
End With
Next

Mong được hỗ trợ lỗi trên
Thay vì sửa lỗi thì bạn hãy nêu mục đích của mình trong vấn đề này thì có thể sẽ có cách khác hay hơn. Chứ thấy bạn tạo Frame để làm gì trong trường hợp này tôi cũng chưa rành nhưng thấy bạn viết code và quản lý control thì tôi chẳng muốn giúp tý nào cả.
 
Upvote 0
Thay vì sửa lỗi thì bạn hãy nêu mục đích của mình trong vấn đề này thì có thể sẽ có cách khác hay hơn. Chứ thấy bạn tạo Frame để làm gì trong trường hợp này tôi cũng chưa rành nhưng thấy bạn viết code và quản lý control thì tôi chẳng muốn giúp tý nào cả.
Cám ơn anh giaiphap đã phản hồi thông tin,

Tuấn cũng nói rõ lại như sau:

Mục địch của việc này là tạo cái form dùng để nhập dữ liệu thông tin (bao gồm các nút nhấn: TẠO MỚI/THÊM/....và các combobox, textbox...), xuất phiếu, xuất ra file pdf..v/v...

Trước đây, nhập trước tiếp lên file excell khó nhìn vì số lượng cột quá nhiều, tuấn chuyển qua viết VBA (học hỏi tại diễn đàn mình), do câu lệnh lập lại thường xuyên, Tuấn dùng textbox để điều khiển qua sự kiện change().

Sau thời gian tìm hiểu, thấy cách viết này dài dòng, nếu dùng class sẽ thuận tiện hơn. Với lại trình bày đơn giản (không như trước đây, khi dùng userform phải chọn các công cụ, làm rối, khó khăn khi viết hoặc nhìn đói tượng.

Về các frame tuấn đã hỏi trước đây----->tuấn xủ lý được rồi.

Riêng về sự kiện textbox_change()----> bị báo lỗi hoài.

Tuấn cũng chia sẽ thật với anh, do do lớn tuổi, độ nhạy hay tiếp thu không còn như các bạn trẻ, mà việc lập trình VBA lại học từ mạng (cũng hơn 3 năm), chủ yếu qua các lần làm, code cụ thể được diễn đàn chỉ dẫn--->làm nhiều nên cũng có được thu hoạt.

Với vốn kiến thức chỉ học từ mang, chắc chắn sẽ không gặt hái được nhiều.Việc up ý tưởng, hay hỗ trợ sửa code, nếu có gì không đúng theo chính xác của diễn đàn mong anh thôm cảm.
 
Upvote 0
Web KT

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

Back
Top Bottom