Điều kiện nhập liệu cho textbox trong Userform.

Liên hệ QC

nhoklipice

Thành viên hoạt động
Tham gia
17/3/09
Bài viết
112
Được thích
3
Trên 1 form có 4 textbox 1 2 3 4 bắt buộc nhập.

Nếu textbox1 có dữ liệu ngày tháng + textbox2 trống thì popup "ban chua nhap textbox2" và setforcus tai textbox2.

Nếu textbox1 có dữ liệu ngày tháng + textbox2 có tên, textbox3 trống thì popup "ban chua nhap textbox3" và setforcus tai textbox3.

Nếu textbox1 có dữ liệu ngày tháng + textbox2 có tên + textbox3 có tên, thì popup "ban chua nhap textbox3" và setforcus tai textbox3.

Nếu textbox1 có dữ liệu ngày tháng + textbox2 có tên + textbox3 có tên, extbox4 trống, thì popup "ban chua nhap textbox4" và setforcus tai textbox4.

Xin cảm ơn !
 
bạn nói "không hiểu gì hết" thế mà vẫn giải đáp chính xác vấn đề mình gặp phải, may cho mình quá, cảm ơn bạn rất nhiều.
 
Upvote 0
nâng cao 1 chút, mình bắt đầu học tới option button.
Trong file, trường hợp của mình dùng option button có đúng không ?
Có giải pháp nào hay hơn không ?
Xin cảm ơn mọi người.
Mình có tự viết nhưng chỉ nhập được 1 mã, còn 2 mã sau bó tay.
 

File đính kèm

Upvote 0
nâng cao 1 chút, mình bắt đầu học tới option button.
Trong file, trường hợp của mình dùng option button có đúng không ?
Có giải pháp nào hay hơn không ?
Xin cảm ơn mọi người.
Mình có tự viết nhưng chỉ nhập được 1 mã, còn 2 mã sau bó tay.

Bạn tự làm đi, tôi nghĩ bạn làm được đó! Gợi ý: OptionButton chỉ dùng chọn lựa theo một điều kiện nào đó, vì vậy nếu chỉ để nhập dữ liệu thì không logic đâu! Nên nhập bằng CommandButton sẽ tốt hơn! Cứ theo mấy cái mẫu đã làm sẳn để làm theo, làm đi cho quen tay.
 
Upvote 0
Code cho bộ NSDKTM như sau:
>Private Sub commandbutton4_Click()
>With Sheets("tru hang dms").Range("a65536").End(xlUp).Offset(1)
>.Offset(0, 0) = "41201ktm"
>.Offset(1, 0) = "40530ktm"
>.Offset(2, 0) = "23801ktm"
>.Offset(0, 4) = NumRes(185000)
>.Offset(0, 3) = NumRes(1)
>End With
>TextBox4 = ""
>End Sub

thêm 1 private sub checkbox1_click

> Private Sub checkbox1_Click()
> If CheckBox1.Value = False Then
> CommandButton4.Enabled = False
> Else
> CommandButton4.Enabled = True
> End If
> End Sub

1. Khi mở form, checkbox1 không "stick" nhưng commandbutton4 vẫn "enable", mình phải dùng chuột stick vào checkbox1, rồi uncheck textbox1 1 lần nữa thì commandbutton4 mới mờ đi (false)
2. Checkbox1 không tự "uncheck" sau khi click commandbutton4.

Help me
 
Upvote 0
Mình đã giải quyết được vấn đề reset checkbox sau khi nhấn commandbutton4.
Giờ chỉ còn lại vấn đề phải dùng tay stick, rồi lại unstick vào checkbox1 thì button4 mới chịu ẩn đi.
 
Upvote 0
Thx mọi người, mình đã làm được ^.^

Phải trải qua những trải nghiệm (mặc dù đau thương, mặc dù code chạy rất ì ạch, mặc dù lỗi lên lỗi xuống, mặc dù bị treo máy...) thì mình mới rút ra được bài học kinh nghiệm và làm chủ được code. Đừng dựa vào tâm lý ỷ lại sẽ không phát triển được kiến thức của mình.

Tôi đã nói bạn làm được mà!
 
Upvote 0
Giải pháp mình làm:
' khi gọi form button.enable = false
Private Sub UserForm_Initialize()
CommandButton4.Enabled = False
CommandButton5.Enabled = False
CommandButton6.Enabled = False
CommandButton7.Enabled = False
CommandButton8.Enabled = False
CommandButton9.Enabled = False
CommandButton10.Enabled = False
CommandButton11.Enabled = False

button ẩn khi checkbox không được check.
Private Sub checkbox1_change()
If CheckBox1.Value = False Then
CommandButton4.Enabled = False
Else
CommandButton4.Enabled = True
End If
End Sub

Giả sử mình có 10 button, vậy phải viết tới 10 lần sự kiện checkbox tương ứng với 10 button ? có cách nào dùng vòng lặp hay gì không ?
Không biết diễn giải vậy có hiểu ý mình không nhỉ ^.^ ?
Mong mọi người cho 1 gợi ý giải quyết trường hợp này.
 
Upvote 0
Giải pháp mình làm:
' khi gọi form button.enable = false
Private Sub UserForm_Initialize()
CommandButton4.Enabled = False
CommandButton5.Enabled = False
CommandButton6.Enabled = False
CommandButton7.Enabled = False
CommandButton8.Enabled = False
CommandButton9.Enabled = False
CommandButton10.Enabled = False
CommandButton11.Enabled = False

button ẩn khi checkbox không được check.
Private Sub checkbox1_change()
If CheckBox1.Value = False Then
CommandButton4.Enabled = False
Else
CommandButton4.Enabled = True
End If
End Sub

Giả sử mình có 10 button, vậy phải viết tới 10 lần sự kiện checkbox tương ứng với 10 button ? có cách nào dùng vòng lặp hay gì không ?
Không biết diễn giải vậy có hiểu ý mình không nhỉ ^.^ ?
Mong mọi người cho 1 gợi ý giải quyết trường hợp này.

Trời, ai mà đi chọn như vậy khi load form chứ! Sao không làm sẳn trong thuộc tính của mỗi Cmd đi trời! Sau đó muốn dùng Option nào thì True Cmd đó! hic
 
Upvote 0
commandbuton4, thuộc tính set enable = false
may quá mới mò ra ^.^

VD:
Private Sub checkbox1_change()
If CheckBox1.Value = False Then
CommandButton4.Enabled = False
Else
CommandButton4.Enabled = True
End If
End Sub
Giả sử mình có 100 checkbox và 100 button, code trên là checkbox1 cho button1, vậy phải viết đến 100 lần code như thế cho lần lượt 100 checkbox à ?
 
Upvote 0
To : bạn Hoàng Trọng Nghĩa

Ngày mai là ngày nghĩ, đêm nay thức khuya với ly cafe nghiền ngẫm code ^.^
Sau 1 hồi suy nghĩ, hình như có đơn giản hơn được 1 chút.

commandbutton4_click ghi dữ liệu vào sheet

Private Sub CommandButton4_Click()
With Sheets("tru hang dms").Range("a65536").End(xlUp).Offset(1)
.Offset(0, 0) = TextBox6
.Offset(1, 0) = TextBox7
.Offset(2, 0) = TextBox8
.Offset(2, 3) = "1"
.Offset(2, 4) = "185.000"
End With
CheckBox1 = False
CheckBox2 = False
ComboBox1.SetFocus
End Sub

set data sẵn cho từng checkbox

Private Sub checkbox1_change()
If CheckBox1.Value = False Then
CommandButton4.Enabled = False
Else
CommandButton4.Enabled = True
End If
Me.TextBox6.Value = ""
Me.TextBox7.Value = ""
Me.TextBox8.Value = ""
TextBox6.Value = "nsd1"
TextBox7.Value = "nsd1"
TextBox8.Value = "nsd1"
End Sub

****


Private Sub checkbox2_change()
If CheckBox2.Value = False Then
CommandButton4.Enabled = False
Else
CommandButton4.Enabled = True
End If
Me.TextBox6.Value = ""
Me.TextBox7.Value = ""
Me.TextBox8.Value = ""
TextBox6.Value = "nsd2"
TextBox7.Value = "nsd2"
TextBox8.Value = "nsd2"
End Sub

Như thế mình có tới 10 đoạn code cho 10 checkbox và chỉ có 1 button.
Trong trường hợp của mình giải pháp là có được không ? còn giải pháp nào tốt hơn không ? 1 workbook mà trong vba có khoảng 20 private sub có được coi là "nhẹ" ( ý mình là code chạy nhanh hay ì ạch )
 
Upvote 0
Eo, lại gặp vấn đề .. "phê" quá !
Private Sub CommandButton4_Click()
With Sheets("tru hang dms").Range("a65536").End(xlUp).Offset(1)
.Offset(0, 0) = TextBox6
.Offset(1, 0) = TextBox7
.Offset(2, 0) = TextBox8
.Offset(2, 3) = "1"
.Offset(2, 4) = "185.000"
End With
CheckBox1 = False
CheckBox2 = False
ComboBox1.SetFocus
End Sub

hạn chế chỉ 3 mã hàng.
cố định giá 185.000 đồng

=.=
 
Upvote 0
To : Hoàng Trọng Nghĩa
3h sáng, hết cafe, mắt lên độ =.=
Chưa giải quyết được gì hết.
Nếu tạo 10 checkbox và 10 button, viết code cho từng checkbox thì giải quyết được vấn đề.

Nếu 10 checkbox và 1 button thì bị bí rối ^.^
vd : khi stick vào checkbox1, click button1 thì tự động điền vào sheet "tru hang dms" 3 mã.
khi stick vào checkbox2, click button1 thì tự động điền vào sheet "tru hang dms" 10 mã.
Mong bạn cho 1 gợi ý, cảm ơn.
 
Upvote 0
To : bạn Hoàng Trọng Nghĩa

Ngày mai là ngày nghĩ, đêm nay thức khuya với ly cafe nghiền ngẫm code ^.^
Sau 1 hồi suy nghĩ, hình như có đơn giản hơn được 1 chút.

commandbutton4_click ghi dữ liệu vào sheet

Private Sub CommandButton4_Click()
With Sheets("tru hang dms").Range("a65536").End(xlUp).Offset(1)
.Offset(0, 0) = TextBox6
.Offset(1, 0) = TextBox7
.Offset(2, 0) = TextBox8
.Offset(2, 3) = "1"
.Offset(2, 4) = "185.000"
End With
CheckBox1 = False
CheckBox2 = False
ComboBox1.SetFocus
End Sub

set data sẵn cho từng checkbox

Private Sub checkbox1_change()
If CheckBox1.Value = False Then
CommandButton4.Enabled = False
Else
CommandButton4.Enabled = True
End If
Me.TextBox6.Value = ""
Me.TextBox7.Value = ""
Me.TextBox8.Value = ""
TextBox6.Value = "nsd1"
TextBox7.Value = "nsd1"
TextBox8.Value = "nsd1"
End Sub

****


Private Sub checkbox2_change()
If CheckBox2.Value = False Then
CommandButton4.Enabled = False
Else
CommandButton4.Enabled = True
End If
Me.TextBox6.Value = ""
Me.TextBox7.Value = ""
Me.TextBox8.Value = ""
TextBox6.Value = "nsd2"
TextBox7.Value = "nsd2"
TextBox8.Value = "nsd2"
End Sub

Như thế mình có tới 10 đoạn code cho 10 checkbox và chỉ có 1 button.
Trong trường hợp của mình giải pháp là có được không ? còn giải pháp nào tốt hơn không ? 1 workbook mà trong vba có khoảng 20 private sub có được coi là "nhẹ" ( ý mình là code chạy nhanh hay ì ạch )

Có ai hiểu bạn nói cái gì đâu mà giúp.
1. Bạn dùng Checkbox để "bật", "tắt" CommandButton4? Bạn có lý do nào đó? Tức trạng thái "bật", "tắt" của Checkbox sẽ quyết định trạng thái "bật", "tắt" CommandButton4? Nếu thế thì bạn trả lời câu hỏi: Thế ở thời điểm nào đấy Checkbox1 là "tắt" còn Checkbox2 là "bật" thì CommandButton4 phải là "bật" hay "tắt"? Bạn đã nghĩ kỹ chưa? Nếu bạn nói là phải theo cái Checkbox "vừa bị" click thì tôi hỏi tiếp. Thực ra cái lý do "kia" không phải là Checkbox mà nó là lý do khác, Checkbox chẳng qua là bạn tự nghĩ ra thôi. Vd. tôi có TextBox và "lý do" của tôi là CommandButton chỉ bật khi TextBox có dữ liệu. Bạn hãy nói cái lý do thực mà bạn muốn "bật", "tắt" CommandButton4 ra xem.
2. Khi bạn cần giúp thì không nên áp đặt như thế. Kiểu như: tôi có bé gái, các bạn giúp tôi làm sao cho bé gái "tưới" cây trong chậu cao 0.5 mét. Trong khi yêu cầu chỉ là tưới cây, không bắt buộc phải là bé nào.
Bạn cho tôi hỏi: CommandButton4 sẽ thao tác "thế này" khi có đk "thế này" và thao tác "thế kia" khi đk là "thế kia"? Nếu thế thì hãy nêu rõ yêu cầu đối với CommandButton thôi còn chuyện người giúp đề nghị dùng gì - Checkbox, OptionButton hay Image, ListView ... - thì để họ quyết định.
Nếu bạn nói như ở bài dưới là: "Nếu tạo 10 checkbox và 10 button, viết code cho từng checkbox thì giải quyết được vấn đề" thì bạn hãy đưa code của 10 CheckBox và 10 Button lên để người ta hiểu được bạn làm gì rồi từ đó người ta mới có thể đề nghị rút gọn hoặc thay bằng control khác và code khác.
Nếu button lúc thì điền 3 mã lúc thì điền 10 mã thì dùng OptionButton chứ sao lại dùng Checkbox?. Mà sao lại dùng Checkbox để bật tắt button? Bặt tắt button cần phải thực hiện tại nơi mà "lý do thực" thay đổi.
Nói cứ như đánh đố nhau thế thì ai mà giúp được? Hoặc bạn đưa code của 10 Checkbox và 10 button mà bạn nói là "giải quyết được vấn đề" lên để người ta rút gọn hoặc thay thế hoặc bạn tự làm.
 
Upvote 0
To : Hoàng Trọng Nghĩa
Mình có viết ở tiêu đề rồi mà, vỉ bạn Nghĩa theo dõi và giúp đỡ, hướng dẫn mình cái form này từ đầu đến cuối nên mình nghĩ nói sơ sơ thế bạn Nghĩa sẽ hiểu.

OK, thế thì mình nhờ mọi người giúp mình luôn, vì đêm qua thức đến 3h sáng qua mà không mò ra được.

1. Mình có 10 checkbox và 10 button, mỗi button mình sẽ đặt data sẵn cho nó, khi mình click button, nó sẽ tự điền data mình đặt sẵn cho nó vào sheet tru hang dms, data đặt cho button dao động từ 3 - 15 (mydata1, mydata2, mydata ..n, mydata15)

code cho checkbox1 ( mục đích checkbox1 không check thì commandbutton ẩn)

Private Sub checkbox1_change()
If CheckBox1.Value = False Then
CommandButton1.Enabled = False
Else
CommandButton1.Enabled = True
End If
End Sub

và code cho commandbutton1 : (mục đích khi checkbox1 được check, commandbutton hiện, click commandbutton1 thì lưu các giá trị mydata1, mydata2, mydata3, 1, 185000 vào sheet tru hang dms, nếu checkbox1 không được check, command "ẩn" tránh nhập lộn dữ liệu)

Private Sub CommandButton1_Click()
With Sheets("tru hang dms").Range("a65536").End(xlUp).Offset(1)
.Offset(0, 0) = mydata1
.Offset(1, 0) = mydata2
.Offset(2, 0) = mydata3
.Offset(2, 3) = "1"
.Offset(2, 4) = "185.000"
End With
CheckBox1 = False
ComboBox1.SetFocus
End Sub

đó là code cho checkbox1 và commandbutton1 để nhập liệu vào sheet tru hang dms, tương tự thế mình viết tiếp code cho 9 checkbox và 9 button còn lại thì giải quyết được vấn đề

Bây giờ mình muốn hỏi:
Có cách nào chỉ với 10 checkbox và 1 button, khi mình stick vào checkbox1, clickbutton nó điền vào cột A sheet tru hang dms 1 dữ liệu (mydata1)
Khi stick checkbox2 và click button thì nó lại điền 2 dữ liệu (mydata1, mydata2)
tương tự cho 8 checkbox sau với dữ liệu thăng dần tới 10.

Không biết mọi người có hiểu ý không, mình mò hoài không ra ^.^


 
Upvote 0
To : Hoàng Trọng Nghĩa
Mình có viết ở tiêu đề rồi mà, vỉ bạn Nghĩa theo dõi và giúp đỡ, hướng dẫn mình cái form này từ đầu đến cuối nên mình nghĩ nói sơ sơ thế bạn Nghĩa sẽ hiểu.


Không biết mọi người có hiểu ý không, mình mò hoài không ra ^.^



Tôi làm bài này, gợi ý cho bạn thực hiện tiếp nhé!

Với 1 UserForm, 1 Commandbutton, 1 ComboBox, 5 TextBox, 10 OptionButton, tôi sẽ làm như sau:

Với mỗi OptionButton khi được chọn sẽ gán cho 5 TextBox tên của OptionButton đó.

PHP:
Private Sub OptionButton1_Change()
    Dim i As Byte
    With OptionButton1
        If .Value = True Then
            For i = 1 To 5
                Controls("TextBox" & i).Value = .Caption
            Next
        End If
    End With
End Sub

Với ComboBox là cái sẽ quyết định về số lượng nhiều, khi thay đổi tôi sẽ bỏ chọn tất cả các OptionButton và nhập giá trị của nó vào 5 TextBox:

PHP:
Private Sub ComboBox1_Change()
    Dim i As Byte, j As Byte
    For i = 1 To 10
        With Controls("OptionButton" & i)
            If .Value = True Then
                .Value = False: Exit For
            End If
        End With
    Next
    For j = 1 To 5
        Controls("TextBox" & j).Value = ComboBox1.Text
    Next
End Sub

Với Commandbutton, tôi sẽ xóa text của 5 TextBox và OptionButton nào có giá trị bằng True (đang chọn) sẽ trả về False (bỏ chọn):

PHP:
Private Sub CommandButton1_Click()
    Dim i As Byte, j As Byte
    For i = 1 To 10
        With Controls("OptionButton" & i)
            If .Value = True Then
                .Value = False: Exit For
            End If
        End With
    Next
    '.............................
    
    
    'Nhap cai gi, vao dau ban viet tiep o day
    
    
    '.............................
    For j = 1 To 5
        Controls("TextBox" & j).Value = ""
    Next
End Sub

Căn cứ vào tình hình thực tế mà bạn chỉnh sửa sao cho hợp lý code của bạn nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình gởi file cho mọi người dễ hình dung.

Cái này nó dễ òm à! Chỉ cần 3 OptionButton và 1 CommandButton là xong!

Với nút lệnh chỉ là như vầy:

PHP:
Private Sub CommandButton1_Click()
    If OptionButton1 Then
        With Sheets("banhang").Range("a65536").End(xlUp).Offset(1)
            .Offset(0, 0) = "mydata1"
            .Offset(1, 0) = "mydata3"
            .Offset(2, 0) = "mydata5"
            .Offset(2, 2) = "1"
            .Offset(2, 3) = "9000"
        End With
    ElseIf OptionButton2 Then
        With Sheets("banhang").Range("a65536").End(xlUp).Offset(1)
            .Offset(0, 0) = "mydata6"
            .Offset(1, 0) = "mydata2"
            .Offset(2, 0) = "mydata4"
            .Offset(3, 0) = "mydata1"
            .Offset(2, 2) = "1"
            .Offset(2, 3) = "13000"
        End With
    ElseIf OptionButton3 Then
        With Sheets("banhang").Range("a65536").End(xlUp).Offset(1)
            .Offset(0, 0) = "mydata1"
            .Offset(1, 0) = "mydata3"
            .Offset(2, 0) = "mydata5"
            .Offset(2, 2) = "1"
            .Offset(2, 3) = "9000"
        End With
        With Sheets("banhang").Range("a65536").End(xlUp).Offset(1)
            .Offset(0, 0) = "mydata6"
            .Offset(1, 0) = "mydata2"
            .Offset(2, 0) = "mydata4"
            .Offset(3, 0) = "mydata1"
            .Offset(2, 2) = "1"
            .Offset(2, 3) = "13000"
        End With
    Else
    
    ''Nhap cai gi ban muon nhap
    
    End If
    
    OptionButton1.Value = False
    OptionButton2.Value = False
    OptionButton3.Value = False
End Sub
 

File đính kèm

Upvote 0
Nhìn cách bố trí theo cách nhập của bạn tôi thấy lấn cấn sao đó, lẽ ra mã hàng chính (tôi gọi là chính vì nó chắc chắn có nhập số lượng và đơn giá) phải luôn để trên đầu, những mã hàng phụ thì để ở dưới, thì bạn lại nhập lộn xộn cả lên. Theo nguyên tắc của tôi, mã hàng chính thì nhập trước, mã hàng phụ xét theo thứ tự nhỏ đến lớn thì nhập sau.

Lưu ý: Khi nhập số thì không được để trong dấu ngoặc kép ("") đâu nha!

Nếu bạn làm theo cách của tôi, thì nên sửa bài trước tôi vừa gửi cho nút lệnh phần code dưới đây:

Mã:
Private Sub CommandButton1_Click()
    If OptionButton1 Then
        With Sheets("banhang").Range("a65536").End(xlUp).Offset(1)
            [COLOR=#008000]'Nhap mã chính:[/COLOR]
            .Value = "mydata5"
            .Offset(, 2) = 1
            .Offset(, 3) = 9000
           [COLOR=#008000] 'Nhap ma phu:[/COLOR]
            .Offset(1, 0) = "mydata1"
            .Offset(2, 0) = "mydata3"
        End With
    ElseIf OptionButton2 Then
        With Sheets("banhang").Range("a65536").End(xlUp).Offset(1)
           [COLOR=#008000] 'Nhap mã chính:[/COLOR]
            .Value = "mydata4"
            .Offset(, 2) = 1
            .Offset(, 3) = 13000
           [COLOR=#008000] 'Nhap ma phu:[/COLOR]
            .Offset(1, 0) = "mydata1"
            .Offset(2, 0) = "mydata2"
            .Offset(3, 0) = "mydata6"
        End With
    ElseIf OptionButton3 Then
        With Sheets("banhang").Range("a65536").End(xlUp).Offset(1)
            [COLOR=#008000]'Nhap mã chính:[/COLOR]
            .Value = "mydata4"
            .Offset(, 2) = 1
            .Offset(, 3) = 13000
            .Offset(1, 0) = "mydata5"
            .Offset(1, 2) = 1
            .Offset(1, 3) = 9000
           [COLOR=#008000] 'Nhap ma phu:[/COLOR]
            .Offset(2, 0) = "mydata1"
            .Offset(3, 0) = "mydata2"
            .Offset(4, 0) = "mydata3"
            .Offset(5, 0) = "mydata6"
        End With
    Else
    
    ''Nhap cai gi ban muon nhap
    
    End If
    
    OptionButton1.Value = False
    OptionButton2.Value = False
    OptionButton3.Value = False
End Sub
 
Upvote 0
Đây chính xác là giải pháp mình đang tìm, mình cũng làm thế nhưng lại dùng checkbox, làm phát sinh vấn đề .
giả sử mình có tới 20 optionbutton
code optionbutton
private sub optionbutton_change()
if optionbutton.value = false then
commanbutton1.enable - false
else
commandbutton1.enable = true
end if

Đoạn này mình phải dùng vòng lặp như thế nào cho 20 optionbutton ?
 
Upvote 0
Web KT

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

Back
Top Bottom