Đ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 !
 
Đặt 1 nút lệnh trên form, sau đó, viết code của nút lệnh như sau:

PHP:
Private Sub CommandButton1_Click()
    If TextBox1 = "" Then
        MsgBox "Phai nhap vao TextBox1", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox1.SetFocus
        Exit Sub
    ElseIf TextBox2 = "" Then
        MsgBox "Phai nhap vao TextBox2", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox2.SetFocus
        Exit Sub
    ElseIf TextBox3 = "" Then
        MsgBox "Phai nhap vao TextBox3", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox3.SetFocus
        Exit Sub
    ElseIf TextBox4 = "" Then
        MsgBox "Phai nhap vao TextBox4", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox4.SetFocus
        Exit Sub
    End If
    'Roi lam tiep cai gi thi lam!
End Sub
 

File đính kèm

  • XacNhan.xls
    23 KB · Đọc: 279
Upvote 0
Cảm ơn bạn mình đã làm được.
Cho mình hỏi thêm tại textbox4 là số tiền, khi nhập 100.000 (một trăm nghìn) từ form vào excel, excel chỉ nhận 100 đồng, còn nhập 10000 (không dấu chấm) thì excel mới nhận đủ 100.000
Vậy chỉnh code trện form như thế nào để mình đánh 100.000 (Có dấu chấm) hoặc 100000 (không dấu chấm) đều được excel nhận là 100.000 (một trăm nghìn).
Xin cảm ơn.
 
Upvote 0
Đặt 1 nút lệnh trên form, sau đó, viết code của nút lệnh như sau:

PHP:
Private Sub CommandButton1_Click()
    If TextBox1 = "" Then
        MsgBox "Phai nhap vao TextBox1", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox1.SetFocus
        Exit Sub
    ElseIf TextBox2 = "" Then
        MsgBox "Phai nhap vao TextBox2", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox2.SetFocus
        Exit Sub
    ElseIf TextBox3 = "" Then
        MsgBox "Phai nhap vao TextBox3", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox3.SetFocus
        Exit Sub
    ElseIf TextBox4 = "" Then
        MsgBox "Phai nhap vao TextBox4", vbOKOnly + vbInformation, "THÔNG BÁO"
        TextBox4.SetFocus
        Exit Sub
    End If
    'Roi lam tiep cai gi thi lam!
End Sub

Có thể thay thế = vòng lập anh à

Mã:
Private Sub CommandButton1_Click()
Dim TB As Control
For Each TB In UserForm1.Controls
   If TypeName(TB) = "TextBox" And TB = "" Then
      MsgBox "Phai nhap vao " & TB.Name, vbOKOnly + vbInformation, "THÔNG BÁO"
      TB.SetFocus
      Exit Sub
   End If
Next
End Sub
 
Upvote 0
Cảm ơn bạn mình đã làm được.
Cho mình hỏi thêm tại textbox4 là số tiền, khi nhập 100.000 (một trăm nghìn) từ form vào excel, excel chỉ nhận 100 đồng, còn nhập 10000 (không dấu chấm) thì excel mới nhận đủ 100.000
Vậy chỉnh code trện form như thế nào để mình đánh 100.000 (Có dấu chấm) hoặc 100000 (không dấu chấm) đều được excel nhận là 100.000 (một trăm nghìn).
Xin cảm ơn.

______________

sheet1 mình có range a1:a10 chứa họ tên
trên form có textbox1

Code textbox1 như thế nào để mình đánh "nguyễn" thì sẽ xuất hiện tất cả những ai họ "nguyễn", chọn / enter / nhập tên vào textbox1.
Cảm ơn rất nhiều.
 
Upvote 0
Có thể thay thế = vòng lập anh à

Mã:
Private Sub CommandButton1_Click()
Dim TB As Control
For Each TB In UserForm1.Controls
   If TypeName(TB) = "TextBox" And TB = "" Then
      MsgBox "Phai nhap vao " & TB.Name, vbOKOnly + vbInformation, "THÔNG BÁO"
      TB.SetFocus
      Exit Sub
   End If
Next
End Sub

Thực ra anh cố tình làm như thế, bởi đây là một dạng bẫy rất căn bản mà chủ topic chưa biết thì khó có thể dùng vòng lặp được, cho nên, nhìn vào thủ tục đơn giản, anh tin rằng người đó sẽ biết tự sắp xếp theo file thực tế của mình. Vả lại, chắc gì Mỗi textbox có tên đúng thứ tự như vậy hay mỗi tên lại mang một ý nghĩa giá trị nhập vào.

Nếu dùng vòng lặp và tên của nó như thế, thì anh không dùng For Each như vậy. Lý do là cứ mỗi control nó quét qua, bao gồm cả Label, fram, commandbutton, textbox, combobox v.v... nói chung mọi control trên form để tìm control có typename là TextBox và xử lý, như vậy sẽ làm mất thời gian hơn. Theo anh thì anh làm như sau:

Mã:
Private Sub CommandButton1_Click()
      Dim i As Byte
      For i = 1 To 4
            With Controls("TextBox" & i)
                  If .Text = "" Then
                        MsgBox "Phai nhap vao " & .Name, vbOKOnly + vbInformation, "THÔNG BÁO"
                              .SetFocus
                        Exit Sub
                  End If
            End With
      Next
End Sub

Như vậy thì dù có bao nhiêu Control trên form cũng kệ, nó chỉ quét đúng 4 lần TextBox mà thôi.
 
Upvote 0
Thực ra anh cố tình làm như thế, bởi đây là một dạng bẫy rất căn bản mà chủ topic chưa biết thì khó có thể dùng vòng lặp được, cho nên, nhìn vào thủ tục đơn giản, anh tin rằng người đó sẽ biết tự sắp xếp theo file thực tế của mình. Vả lại, chắc gì Mỗi textbox có tên đúng thứ tự như vậy hay mỗi tên lại mang một ý nghĩa giá trị nhập vào.

Nếu dùng vòng lặp và tên của nó như thế, thì anh không dùng For Each như vậy. Lý do là cứ mỗi control nó quét qua, bao gồm cả Label, fram, commandbutton, textbox, combobox v.v... nói chung mọi control trên form để tìm control có typename là TextBox và xử lý, như vậy sẽ làm mất thời gian hơn. Theo anh thì anh làm như sau:

Mã:
Private Sub CommandButton1_Click()
      Dim i As Byte
      For i = 1 To 4
            With Controls("TextBox" & i)
                  If .Text = "" Then
                        MsgBox "Phai nhap vao " & .Name, vbOKOnly + vbInformation, "THÔNG BÁO"
                              .SetFocus
                        Exit Sub
                  End If
            End With
      Next
End Sub

Như vậy thì dù có bao nhiêu Control trên form cũng kệ, nó chỉ quét đúng 4 lần TextBox mà thôi.
Còn lệ thuộc vào cách đặt tên của textbox, nếu không cho nó quét ca các ctrl khác thì anh có thể đặt tag cho những ctrl anh muốn quét qua là được.
 
Upvote 0
Cảm ơn bạn mình đã làm được.
Cho mình hỏi thêm tại textbox4 là số tiền, khi nhập 100.000 (một trăm nghìn) từ form vào excel, excel chỉ nhận 100 đồng, còn nhập 10000 (không dấu chấm) thì excel mới nhận đủ 100.000
Vậy chỉnh code trện form như thế nào để mình đánh 100.000 (Có dấu chấm) hoặc 100000 (không dấu chấm) đều được excel nhận là 100.000 (một trăm nghìn).
Xin cảm ơn.

______________

Bạn nhập trên Excel thì sao? Bạn nhập 100 rồi chấm 1 cái rồi gõ tiếp 000 nữa sao? Tại sao không gõ hẳn là 100000 luôn nhỉ? Với mô tả của bạn, tôi tin chắc là bạn định dạng kiểu 0.000 trong format cell ==> Kiểm tra lại, bạn chỉ nhập có 100 thôi, cho dù bạn có chấm (.) và gõ tiếp 000 cũng giá trị thực là 100 mặc dù cell sẽ hiển thị là 100.000


sheet1 mình có range a1:a10 chứa họ tên
trên form có textbox1

Code textbox1 như thế nào để mình đánh "nguyễn" thì sẽ xuất hiện tất cả những ai họ "nguyễn", chọn / enter / nhập tên vào textbox1.
Cảm ơn rất nhiều.


Nói tóm lại, bạn gửi cái file của bạn lên đây, ai biết sẽ hướng dẫn cho bạn, nói chung chung làm sao mà giúp được!
 
Upvote 0
Em gởi file.
Mày mò, tìm kiếm, hỏi han và nhận được sự giúp đỡ của anh chị trong diễn đàn em cũng hoàn thành được cái form này, còn gì sai sót mong mọi người chỉ thêm.
trên form: 4 textbox đầu (ngày, loại xe, tên KH, trả trước không tính)
từ textbox thứ 5, em muốn đánh mã 06 thì nó sẽ hiện tất cả các mã bắt đầu = 06 trong phạm vi 'Honda price list b4:b10.
Em muốn chèn 1 cái đồng hồ vào form thì như thế nào ?
Xin cảm ơn mọi người.
 

File đính kèm

  • 16-10-2012.xls
    84.5 KB · Đọc: 147
Upvote 0
Em gởi file.
Mày mò, tìm kiếm, hỏi han và nhận được sự giúp đỡ của anh chị trong diễn đàn em cũng hoàn thành được cái form này, còn gì sai sót mong mọi người chỉ thêm.
trên form: 4 textbox đầu (ngày, loại xe, tên KH, trả trước không tính)
từ textbox thứ 5, em muốn đánh mã 06 thì nó sẽ hiện tất cả các mã bắt đầu = 06 trong phạm vi 'Honda price list b4:b10.
Em muốn chèn 1 cái đồng hồ vào form thì như thế nào ?
Xin cảm ơn mọi người.

TextBox5 trở xuống (gọi là cột lẻ), TextBox6 trở xuống (gọi là cột chẳn), thế cột lẻ là gì? Có phải là mã số? Còn cột chẳn có ý nghĩa gì?
 
Upvote 0
TextBox5 trở xuống (gọi là cột lẻ), TextBox6 trở xuống (gọi là cột chẳn), thế cột lẻ là gì? Có phải là mã số? Còn cột chẳn có ý nghĩa gì?
Em mù mờ VBA, nhưng hình như đây cột chẵn cột lẻ chẳng liên quan gì đây cả.
tại textbox5 , type 06, hiện ra tất cả mã bắt đầu bằng 06 => chọn mã bằng enter, click button save => ghi vào excel.
Vậy cho giải quyết vấn đề ngay tại textbox5 ( hoặc cột lẻ như lời anh nói) còn textbox6 ( cột chẵn ) em xử lý sau, vấn đề của em ở ngay textbox5, xin cảm ơn !
 
Upvote 0
Em mù mờ VBA, nhưng hình như đây cột chẵn cột lẻ chẳng liên quan gì đây cả.
tại textbox5 , type 06, hiện ra tất cả mã bắt đầu bằng 06 => chọn mã bằng enter, click button save => ghi vào excel.
Vậy cho giải quyết vấn đề ngay tại textbox5 ( hoặc cột lẻ như lời anh nói) còn textbox6 ( cột chẵn ) em xử lý sau, vấn đề của em ở ngay textbox5, xin cảm ơn !

Rồi, quan sát một cách tổng quát thì mục đích bạn làm cái form này là nhập vào cái sheet ẩn, sau đó in ra cho khách hàng khi mua phụ tùng. Với 12 cái textbox đó bạn nhập vào đều là mã hàng, còn phần còn lại lại để sheet tự tìm tên hàng.

Theo tôi, đã sử dụng VBA thì tại sao không làm luôn trên form và nhập trực tiếp lên sheet rồi in ra thôi? Cần chi phải tính toán trong sheet2 đó chứ nhỉ?
 
Upvote 0
Để tôi làm 1 form tương đối hoàn chỉnh cho bạn, tuy nhiên trong sheet2 tại sao ẩn cột F? Nếu không dùng thì tôi xóa luôn nhé? Nếu dùng thì làm việc gì để tôi làm nốt luôn cho!

Hàm VND bạn dùng hàm gì? Có thể gửi lên được không?
 
Upvote 0
Cột F là hàm vlookup tìm giá tiền bên honda price list, cột E là roundup của cột F
hàm =vnd() mình down excel add-in gì đó cài vào luôn excel.
Cảm ơn bạn đã giúp đỡ.
 
Upvote 0
Cột F là hàm vlookup tìm giá tiền bên honda price list, cột E là roundup của cột F
hàm =vnd() mình down excel add-in gì đó cài vào luôn excel.
Cảm ơn bạn đã giúp đỡ.
Tôi đã tương đối hoàn thiện Form cho bạn, Form cũ của bạn vẫn còn đó, tôi làm trên Form mới.

Với Form mới này, tôi không dùng quá nhiều TextBox để hiển ghi mã hàng đâu, chỉ 1 ComboBox ghi mã hàng, 3 TextBox ghi Tên hàng, Đơn giá, Số lượng.

Tôi không biết bạn nhập vô bao nhiêu mã hàng, nhưng hiện tại nhìn cấu trúc ở Sheet2 tôi thấy tối đa 6 hàng nên tôi hạn chế nhập 6 mã hàng. Trước khi nhập vào Sheet2, tôi cho một nút TẠM NHẬP vào ListBox để tiện theo dõi, sau đó khi đã hoàn tất việc tạm nhập các mã hàng thì ta SAVE một lần luôn.

Thủ tục để nạp nguồn cho ComboBox:

Mã:
Private Sub UserForm_Initialize()
      Call AppFast
      Dim Arr As Variant, CboArr As Variant, Cot()
      Dim c As Long, h As Long, r As Long

      With Worksheets("Honda price list")
            Arr = Range(.[B4], .[B65536].End(xlUp)).Resize(, 11).Value
      End With

      h = UBound(Arr)
      Cot = Array(0, 1, 4, 11)
      
      ReDim CboArr(1 To h, 1 To 3)
      For r = 1 To h
            For c = 1 To 3
                  CboArr(r, c) = Arr(r, Cot(c))
            Next
      Next
      ComboBox1.List = CboArr
      TextBox1 = Date
      TextBox2.SetFocus
End Sub

Chỉ cần chọn đúng mã hàng thì Tên hàng, Đơn giá (có VAT) sẽ tự động cập nhật, đồng thời tính sẳn ROUNDUP cho Đơn giá luôn:

Mã:
Private Sub ComboBox1_Change()
      On Error GoTo Xoa
      TextBox5 = ComboBox1.List(, 1)
      TextBox6 = NumFor(WorksheetFunction.RoundUp(ComboBox1.List(, 2), -3))
      Exit Sub
Xoa:
      TextBox5 = ""
      TextBox6 = ""
End Sub

Sau khi đã điền đầy đủ thông tin thì ta chỉ việc TẠM NHẬP vào ListBox:

Mã:
Private Sub CommandButton4_Click()
      If ListBox1.ListCount >= 6 Then
            MsgBox "Chi cho phep nhap toi da 6 ma hang!", vbOKOnly + vbCritical, "THÔNG BÁO"
            Exit Sub
      End If
      Dim i As Byte, j As Long
      For i = 1 To 4
            With Controls("TextBox" & i)
                  If .Text = "" Then
                        MsgBox .Tag, vbOKOnly + vbInformation, "THÔNG BÁO"
                              .SetFocus
                        Exit Sub
                  End If
            End With
      Next
      If ComboBox1 = "" Then
            MsgBox "Ban chua nhap ma hang", vbOKOnly + vbInformation, "THÔNG BÁO"
            ComboBox1.SetFocus
            Exit Sub
      ElseIf TextBox7 = "" Then
            MsgBox TextBox7.Tag, vbOKOnly + vbInformation, "THÔNG BÁO"
            TextBox7.SetFocus
            Exit Sub
      End If
      With ListBox1
             j = .ListCount
            .AddItem j + 1                                        'STT
            .List(j, 1) = ComboBox1                               'Ma Phu tung
            .List(j, 2) = TextBox5                                'Ten hang
            .List(j, 3) = TextBox7                                'So luong
            .List(j, 4) = NumRes(TextBox6)                        'Don gia
            .List(j, 5) = NumRes(TextBox6) * Val(TextBox7)        'Thanh tien
            .ListIndex = j                                        'Select theo dong cuoi cua ListBox
            TextBox8 = Val(TextBox8) + Val(TextBox7)              'Tong so luong
            TextBox9 = NumFor(NumRes(TextBox9) + .List(j, 5))     'Tong thanh tien
      End With
      
      CommandButton1.Enabled = True
      ComboBox1 = ""
      TextBox7 = ""
      ComboBox1.SetFocus
End Sub

Và khi đã hết việc tạm nhập thì chúng ta nhập xuống sheet bằng nút SAVE:
Mã:
Private Sub CommandButton1_Click()
      Dim c As Long, h As Long, r As Long
      With Worksheets("sheet2")
            .[A6] = Format(TextBox1, "mm/dd/yyyy")
            .[B7] = UCase(TextBox2)
            .[E7] = TextBox3
            .[B20] = Val(TextBox8)
            
            .[B8] = NumRes(TextBox4)
            'Neu muon dung ham VND thi chon o B8 o duoi va khong chon B8 o tren:
            '(nhap truoc va xem truoc khi doi nhe)
 [COLOR=#ff0000][B]           '.[B8] = VND(NumRes(TextBox4))[/B][/COLOR]

            .[E8] = NumRes(TextBox9) - NumRes(TextBox4)
            
            [TongCong] = Val(TextBox8)
            [ThanhTien] = NumRes(TextBox9)
            
      '------------------------------------------------
            .[A12:F17].ClearContents
            r = ListBox1.ListCount
            If r Then
                  For h = 0 To r - 1
                        For c = 0 To 5
                              .Range("A" & 12 + h).Offset(, c).Value = ListBox1.List(h, c)
                        Next
                  Next
            End If
      End With
      Call XoaText
      CommandButton2.Enabled = True
      CommandButton1.Enabled = False
End Sub

Dĩ nhiên vì không rõ lắm chương trình của bạn nên tôi chỉ giới hạn tại đó, nhưng tôi nghĩ bạn sẽ thoải mái hơn khi dùng Form này.

LƯU Ý: TRONG FILE BẠN SỬA LẠI CHỖ DÒNG MÀU ĐỎ (Private Sub CommandButton1_Click()) NHÉ!
 

File đính kèm

  • 16-10-2012 Version1.rar
    34.9 KB · Đọc: 260
Lần chỉnh sửa cuối:
Upvote 0
Rất hay, cảm ơn bạn đã nhiệt tình giúp đỡ, vì mới tự học có 4 ngày, nên hình như code mình còn khai báo hơi rườm rà, có cái form đơn giả đó mà mình phải chia làm nhiều bước mới thực hiện được như tạo 1 textbox, 1commmand, ghi vào sheet, rồi lại tìm cách ghi vào đúng vị trí mình muốn, rồi lại tìm cách đó lại bắt buộc nhập 4 textbox đầu, rồi lại msgbox cho từng ô, rồi set forcus, rồi code print hide sheet ... nói chung là cái gì cũng mới cả nên còn hơi bỡ ngỡ, một lần nửa cảm ơn bạn đã nhiệt tình giúp đỡ.
 
Upvote 0
Hay quá, bạn xử lý trong VBA luôn, hihi, tại mình chưa quen nên chỉ dùng form nhập liệu excel rồi cho excel xử lý, bẫy lỗi, làm tròn để khi in ra khỏi bị #N/A, ^.^ !
 
Upvote 0
Khoan chạy anh ơi, cái form của em + cái form của anh có liên quan gì nhau không ? sao em remove form của em thì form của anh củng báo lổi tại ô b20 val(textbox8) ?
 
Upvote 0
Không phải form của bạn bị lỗi, mình làm như thế này:
- Từ form của bạn, remove form còn của mình còn sót lại trong đó, rồi export form + export modul bạn viết.
- Mở workbook mới, import form + import modul
- Tiến hành ghi thì báo lỗi tại b20 [TongCong] = Val(TextBox8)
- Xóa luôn 2 dòng code [TongCong] = Val(TextBox8) + [ThanhTien] = NumRes(TextBox9) thì chạy bình thường.
Cái form này ví dụ trình độ lớp 12 trường vba, thực lực mình chắc đang lớp ... mầm =.=, chẳng hiểu được bao nhiêu ^.^ !
 
Upvote 0
Không phải form của bạn bị lỗi, mình làm như thế này:
- Từ form của bạn, remove form còn của mình còn sót lại trong đó, rồi export form + export modul bạn viết.
- Mở workbook mới, import form + import modul
- Tiến hành ghi thì báo lỗi tại b20 [TongCong] = Val(TextBox8)
- Xóa luôn 2 dòng code [TongCong] = Val(TextBox8) + [ThanhTien] = NumRes(TextBox9) thì chạy bình thường.
Cái form này ví dụ trình độ lớp 12 trường vba, thực lực mình chắc đang lớp ... mầm =.=, chẳng hiểu được bao nhiêu ^.^ !

Khi làm trên file (mà tôi gửi), mọi việc đều thực hiện trên form cũng như trên sheet đó. Bạn bị báo lỗi là vì các lý do như sau:

1) Bạn chuyển form của mình qua file khác mà file đó không có cấu trúc giống file này

2) Trong file này tôi đã bỏ cột F bị ẩn, thay vì bảng của bạn từ A đến G thì file tôi làm chỉ từ A đến F thôi.

3) Tại sheet2 tôi đặt name tại D18 là TongCong và ô F18 là ThanhTien, nếu qua file bạn không có tên này sẽ bị lỗi luôn!

Với việc đặt Name này sẽ một lúc nào đó sẽ cần đến (tôi chắc là như vậy trong trường hợp co giản thêm bớt mã hàng nếu lớn hơn 6 mục)

Bạn kiểm tra lại trước cái file mà form đã import có bị trong 3 trường hợp trên không, nếu chưa có thì thêm vào những gì tôi đã đề cập, sau đó cho tôi biết có lỗi xãy ra nữa không rồi tính tiếp nha!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom