Làm thế nào để có thể gán biến cho Form và cho Textbox trong Form ?

  • Thread starter Thread starter BNTT
  • Ngày gửi Ngày gửi
Liên hệ QC

BNTT

Bùi Nguyễn Triệu Tường
Thành viên danh dự
Tham gia
3/7/07
Bài viết
4,946
Được thích
23,208
Nghề nghiệp
Dạy đàn piano
Tôi có 3 Form, trong mỗi Form có vài Textbox. Những Textbox này khi nhấn đúp vào nó, sẽ mở Form Numpad ra. Form Numpad sẽ được dùng như một bàn phím để nhập số vào trong các Textbox.

000-1115.jpg
Vấn đề là, làm sao để Numpad nhập số vào đúng cái Textbox đã gọi nó?

Tôi chỉ là dân amatơ về VBA, cho nên tôi đã dùng cách này: Tôi đặt trong Form Numpad 2 cái Textbox ẩn, có tên là AAA và BBB, và khi nhấn đúp vào một Textbox nào đó trong 3 cái Form kia, thì có một đoạn Code gán tên của Form cho AAA và gán tên của Textbox cho BBB. Ví dụ, khi nhấn đúp vào Textbox số 1 trong UserForm3:
PHP:
Private Sub TB1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    NumPad.AAA.Value = "UserForm3"
    NumPad.BBB.Value = "TB1"
    NumPad.Show
End Sub
Rồi khi nhấn vào các phím trong Numpad, thì sẽ chạy "một rừng" IF để kiểm tra xem sẽ nhập số vào cái nào... Ví dụ, khi nhấn nút có chữ C (ClearAll) dùng để xóa hết dữ liệu đang có trong một Textbox (khi nhập nhầm chẳng hạn), thì chạy code này:
PHP:
Private Sub CBClearAll_Click()
    If AAA.Value = "UserForm1" Then
        If BBB.Value = "TB1" Then UserForm1.TB1.Value = 0
        If BBB.Value = "TB2" Then UserForm1.TB2.Value = 0
        If BBB.Value = "TB3" Then UserForm1.TB3.Value = 0
        If BBB.Value = "TB4" Then UserForm1.TB4.Value = 0
        If BBB.Value = "TB5" Then UserForm1.TB5.Value = 0
    ElseIf AAA.Value = "UserForm2" Then
        If BBB.Value = "TB1" Then UserForm2.TB1.Value = 0
        If BBB.Value = "TB2" Then UserForm2.TB2.Value = 0
        If BBB.Value = "TB3" Then UserForm2.TB3.Value = 0
        If BBB.Value = "TB4" Then UserForm2.TB4.Value = 0
    ElseIf AAA.Value = "UserForm3" Then
        If BBB.Value = "TB1" Then UserForm3.TB1.Value = 0
        If BBB.Value = "TB2" Then UserForm3.TB2.Value = 0
        If BBB.Value = "TB3" Then UserForm3.TB3.Value = 0
    End If
End Sub
Chạy rất tốt, nhưng dài dòng quá! Có cách nào ngắn hơn không?
Tối hôm qua, tôi có hỏi sư nương của tôi, nàng nói tôi thử dùng cái này:
PHP:
Private Sub CBClearAll_Click()
     UserForms(AAA).Controls(BBB).Value = 0
End Sub
Mới đọc thì thấy khoái quá! Đúng rồi chứ còn gì nữa, nghĩa là khi nhấn vào CBClearAll thì gán cho cái Textbox có tên giống như tên của BBB ở trong cái Form có tên giống tên của AAA cái giá trị = 0...

Thế nhưng, VBA hỏng hiểu! Nó hỏng biết UserForms(AAA) là cái gì, cũng chẳng hiểu Controls(BBB) là cái gì!

Vậy xin gửi bài toán này lên đây, nhờ các cao thủ ra tay giúp.
 

File đính kèm

Lần chỉnh sửa cuối:
Em chưa xem kỹ, nhưng có thể dùng Select Case thay If nếu dài dòng. Nếu số TextBox không thay đổi bác có thể dùng biến dạng mảng cho gọn, vứt bên ngoài module.
 
Upvote 0
Dùng mấy cái Sub có tham số là Ok ngay thôi mà.
Khi Form/Textbox nào gọi Numpad thì nó sẽ truyền cho Numpad 1 tham số nào đó. Dựa vào tham số này để biết rằng cái nào đang gọi nó.

--CV--
 
Upvote 0
Xin nói thêm.
Đây chỉ là ví dụ, nên các Textbox có tên là TB1, TB2, TB3... và các UserForm có tên là UserForm1, UserForm2... Nhưng trong thực tế, chúng sẽ có những tên thật, những cái tên dễ nhớ.. Thành thử đừng dựa vào những con số 1, 2, 3... này mà làm.

Cảm ơn ý kiến của Hướng và Hiếu. Nhưng... như vậy thì giống đánh đố mình quá. Cụ thể hơn đi. Please...
 
Upvote 0
Trước hết, bác dùng code này để "bắt" từng Name của các control trong UserForm1:

Mã:
    Dim ControlObj As Control
    For Each ControlObj In UserForm1.Controls
        MsgBox ControlObj.Name
    Next

Mã:
Private Sub CBClearAll_Click()
     UserForms(AAA).Controls(BBB).Value = 0
End Sub

Phải nói trước là trong 1 Form có nhiều kiểu control (có cái có hoặc không có thuộc tính Value), vì vậy bác gán value bằng không là KHÔNG ỔN, dễ gặp lỗi.

Mà bác Tường ơi, sao TextBox bác gán cả 2 giá trị thuộc tính Text, Value làm gì. Bỏ Value đi.
Đoạn code sau sẽ xóa toàn bộ nội dung text trong TextBox:

Mã:
    Dim ControlObj As Control
    For Each ControlObj In UserForm1.Controls
        MsgBox ControlObj.Text=vbNullstring
    Next
 
Lần chỉnh sửa cuối:
Upvote 0
Mình khai báo 2 biến toàn cục để lưu đối tượng ,rất tiếc trong VBA không có MDI form nên không có tập hợp form. Đành dùng if hay select case gán cứng từng Form. Bạn tham khảo nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bác thân mến.

Đây là Sub để truyền tham số cho 1 Control (Textbox, Combobox . . ), bất kỳ trong 1 Form bất kỳ.

PHP:
Sub ABC(FormName As String, TBName As String, GiaTri As String)
    Dim Ojb As Object
    Dim MyForm As Object
    Dim MyTB As Control
    On Error Resume Next
      For Each Ojb In VBA.UserForms
            If InStr(1, Obj.Name, FormName) > 0 Then
                Set MyForm = Ojb
                Exit For
            End If
        Next
    If MyForm Is Nothing Then _
        Set MyForm = VBA.UserForms.Add(FormName)
    If MyForm Is Nothing Then Exit Sub
    Set MyTB = MyForm.Controls(TBName)
    MyTB.Value = GiaTri
End Sub
VD ": Muốn gán giá trị "GPE tuyet voi" vào Textbox "TB1" ở UserForm "UserForm1" thì câu lẹnh như sau :

PHP:
Call ABC("UserForm1", "TB1", "GPE - tuyet voi")

Bác có thể tham khảo thêm tại đây

Chúc bác thành công.
 
Upvote 0
Kỹ thuật dùng Class

Hình như bác BNTT đang thực hiện một công trình hay ho nào đó? Em viết cái này tặng bác!

Cho dù dùng bao nhiêu TextBox, bao nhiêu form thì anh cũng chỉ cần vài dòng lệnh mà thôi.
 

File đính kèm

Upvote 0
Tôi có 3 Form, trong mỗi Form có vài Textbox. Những Textbox này khi nhấn đúp vào nó, sẽ mở Form Numpad ra. Form Numpad sẽ được dùng như một bàn phím để nhập số vào trong các Textbox.

Anh tạo 1 cái UserControl bao gồm:

- 1 textbox
- 1 button bên cạnh textbox (ai lại dùng cái "nhấn đúp" bí hiểm thế) --=0
- 1 form Numpad

Khi click vào button thì nó show Numpad, sau khi "gõ số" thì gán vào textbox.

Trên form chính, kéo n cái UserControl đó vào form. Thế là xong.

Ưu điểm:
- Viết 1 lần, dùng cho nhiều lần
- Người sử dụng ko cần viết code

Nhược điểm:
- Phải biết ABC về UserControl
 
Lần chỉnh sửa cuối:
Upvote 0
Thường thì khi truyền tham số ta hay dùng biến trung gian để thực hiện.
Trong trường hợp này có thể làm như sau:
Trong Form Numpad bạn khai báo 2 biến và code như sau
PHP:
Public Frm As Object, Txt As String
Private Sub CBClearAll_Click()
    Frm.Controls(Txt).Text = ""
End Sub
Trong sự kiện Double_Click của Textbox trên Form nào đó ta code như sau
PHP:
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    With Numpad
        Set .Frm = Me
        .Txt = TextBox1.Name
        .Show
    End With
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom