Đ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 !
 
Lỗi tại không đặt tên tongcong va thanhtien ^.^
workbook mới đặt tên chạy tốt.
 
Upvote 0
Lỗi tại không đặt tên tongcong va thanhtien ^.^
workbook mới đặt tên chạy tốt.

Tốt nhất, bạn xóa sheet2 cũ ở file của bạn, rồi copy sheet2 của file của tôi qua, bởi vì ngoài việc đặt name, tôi còn merge cell, định dạng trên sheet2 đó nữa!
 
Upvote 0
Đã làm, workbook mới, sheet2 mới, import form + module chạy tốt.

Mình đang chờ phiên bản tới.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
in trên a4 - không giới hạn mã hàng, hihi, trước giới hạn là 6- giờ đổi ý xem code như thế nào học hỏi thêm.
 
Upvote 0
in trên a4 - không giới hạn mã hàng, hihi, trước giới hạn là 6- giờ đổi ý xem code như thế nào học hỏi thêm.

OK, vậy tôi sẽ thực hiện cho bạn form với thủ tục này, dĩ nhiên, code của nút PRINT của bạn ai viết "ẹc ... ẹc ..." quá!

Tôi cũng nghĩ rằng lẽ ra bạn có một cái list của tên Loại xe chứ nhỉ? Hay bạn thích gõ bằng tay hoặc chọn lựa trên combobox đây?

Vã lại cái sheet cần giấu lẽ ra ra là cái sheet Honda price list, thì bạn lại chọn cái sheet phiếu đặt hàng đi giấu, thường mấy sheet tạo nguồn họ sẽ giấu đi, chỉ thể hiện các sheet báo cáo, in ấn thôi.
 
Upvote 0
Trời ơi, code nút print tìm hoài, mò hoài mới ra, lúc đầu là chỉ nút print, sau mới mày mò được cái option thoát sau khi in, hông biết viết làm sao, đành phải gián 2 lần code print cho 2 cái options, hi hi, bạn cứ giấu sheet2 giúp mình, vì sheet honda price list mình còn phải làm việc với nó nữa.
 
Upvote 0
Trời ơi, code nút print tìm hoài, mò hoài mới ra, lúc đầu là chỉ nút print, sau mới mày mò được cái option thoát sau khi in, hông biết viết làm sao, đành phải gián 2 lần code print cho 2 cái options, hi hi, bạn cứ giấu sheet2 giúp mình, vì sheet honda price list mình còn phải làm việc với nó nữa.

Vậy bạn có muốn thêm cái List của Loại xe không để tôi làm một lần luôn khỏi lắc nhắc, nếu muốn thì gửi cái file có cái list đó lên đây!
 
Upvote 0
Không bạn ơi. mình nhìn mã là biết loại xe rồi, ít ít code thôi còn mày mò được, nhiều quá không biết đâu với đâu hết, từ từ thôi. ^.^
 
Upvote 0
Tặng bạn Phiên bản mới

Đã làm, workbook mới, sheet2 mới, import form + module chạy tốt.

Mình đang chờ phiên bản tới.

Sau khi tạm nắm các thông tin về file cũng như thông tin bạn cung cấp (một cách tiết kiệm) thì tôi cũng đã hoàn tất cho bạn cái file mới nhất này:

Những cải tiến:

1) Không cho nhập mã trùng, mã hàng nào đã nhập rồi sẽ không được nhập lại.

2) Chức năng chỉnh sửa và xóa: Double Click vào ListBox sẽ hiện lên thông báo, hỏi bạn có Chỉnh sửa hoặc Xóa mục đang chọn hay không. Sau khi chỉnh sửa sẽ nếu bấm nhập chỉnh sửa sẽ thay thế mục cũ.

3) Nút lệnh PRINT của bạn được thay thế code ngắn gọn, đồng thời bạn có thể in bao nhiêu bản copy tùy ý khi điền số tờ in vào một inputbox.

4) Nhập trên sheet từ ListBox dạng Array nên không phải dùng vòng lặp rườm rà.

5) KHÔNG GIỚI HẠN SỐ MÃ HÀNG NHẬP VÀO, TỰ ĐỘNG BẢO TOÀN SỐ HÀNG LUÔN LÀ 6 MỤC VÀ NẾU CÓ HƠN THÌ CHƯƠNG TRÌNH SẼ TỰ ĐỘNG INSERT HÀNG. BẠN KHÔNG CẦN PHẢI LÀM THỦ CÔNG ĐÂU!

LƯU Ý: NẾU BẠN IMPORT FORM, MODULE VÀO FILE GỐC CỦA BẠN, BẮT BUỘC BẠN PHẢI XÓA CÁI SHEET2 Ở FILE GỐC, SAU ĐÓ DÙNG PHƯƠNG THỨC MOVE OR COPY SHEET2 CHUYỂN TỪ FILE TÔI QUA FILE CỦA BẠN.

Với Sheet2 tôi đã đặt lại tên là PhieuDatHang và nếu bạn có thay đổi tên thì cũng thay đổi luôn trong VBA. Tôi cũng đặt thêm vài Name mới, bạn xem trong sheet sẽ rõ.

Các code cải tiến:

1)

Mã:
Private Sub CmdTamNhap_Click()
      On Error Resume Next
      Dim i As Long, 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
           [COLOR=#008000] 'Bo sung tinh nang moi: Neu ma nhap trung se thong bao:[/COLOR][COLOR=#0000cd]
            For i = 0 To j - 1
                  If .List(i, 1) = ComboBox1 Then
                        MsgBox "Ma hang nay da duoc nhap tai STT: " & i + 1, vbOKOnly + vbCritical, "THÔNG BÁO"
                        .ListIndex = i
                        ComboBox1.SetFocus
                        Exit Sub
                  End If
            Next[/COLOR]
            .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
      
      CmdPrint.Enabled = False
      CmdSave.Enabled = True
      ComboBox1 = ""
      TextBox7 = ""
      ComboBox1.SetFocus
End Sub

2)

Mã:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      If ListBox1.ListCount = 0 Then Exit Sub
      
      Dim Msg As Integer
      Msg = MsgBox("BAN MUON LAM GI VOI MUC NAY?" & String(2, vbLf) & _
                   "- De CHINH SUA, click [ YES ]" & String(2, vbLf) & _
                   "- De XOA, click [ NO ]" & String(2, vbLf) & _
                   "- De HUY CHON, click [ CANCEL ]", vbQuestion + vbYesNoCancel, "THÔNG BÁO")
      Select Case Msg
            Case vbYes
                  With ListBox1
                        'Cac bien su dung cho viec hieu chinh:
                        Idx = .ListIndex
                        Itm = .List(Idx, 1)
                        SL = Val(TextBox8) - .List(Idx, 3)
                        TTT = NumFor(NumRes(TextBox9) - .List(Idx, 5))
                        
                        'Chuyen muc can chinh sua len form:
                        ComboBox1 = Itm
                        TextBox7 = .List(Idx, 3)
                        
                        With CmdTamNhap
                              .Visible = False
                              CmdChinhSua.Top = .Top
                              CmdChinhSua.Left = .Left
                              CmdChinhSua.Visible = True
                              CmdSave.Enabled = False
                        End With
                  End With
            Case vbNo
                  If MsgBox("BAN CO THUC SU MUON XOA MUC NAY?", vbQuestion + vbOKCancel, _
                            "THÔNG BÁO") = vbCancel Then GoTo CaseCancel
                  Dim h As Long, r As Long
                  With ListBox1
                        Idx = .ListIndex
                        TextBox8 = Val(TextBox8) - .List(Idx, 3)
                        TextBox9 = NumFor(NumRes(TextBox9) - .List(Idx, 5))
                        .RemoveItem Idx
                        h = .ListCount
                        If h Then
                              For r = 1 To h
                                    .List(r - 1, 0) = r
                              Next
                        Else
                              CmdSave.Enabled = False
                        End If
                  End With
            Case vbCancel
CaseCancel:
                  CmdTamNhap.Visible = True
                  CmdChinhSua.Visible = False
                  CmdSave.Enabled = True
                  ComboBox1 = ""
                  TextBox7 = ""
                  ComboBox1.SetFocus
      End Select
End Sub

Mã:
Private Sub CmdChinhSua_Click()
      'On Error Resume Next
      Dim i As Long, 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
      
      [COLOR=#008000]'Ngoai tru ma da duoc chinh sua, cac ma khac se duoc kiem tra trung truoc khi nhap:[/COLOR]
      If ComboBox1 <> Itm Then
            For i = 0 To ListBox1.ListCount - 1
                  If ListBox1.List(i, 1) = ComboBox1 Then
                        ListBox1.ListIndex = i
                        MsgBox "Ma hang nay da duoc nhap tai STT: " & i + 1, vbOKOnly + vbCritical, "THÔNG BÁO"
                        ComboBox1.SetFocus
                        Exit Sub
                  End If
            Next
      End If
      
      Dim Msg As Integer
      Msg = MsgBox("BAN CO CHAC NHAP LAI CHINH SUA HAY KHONG?" & String(2, vbLf) & _
                   "- De NHAP CHINH SUA, click [ YES ]" & String(2, vbLf) & _
                   "- De KIEM TRA LAI, click [ NO ]" & String(2, vbLf) & _
                   "- De HUY NHAP, click [ CANCEL ]", vbQuestion + vbYesNoCancel, "THÔNG BÁO")
      Select Case Msg
            Case vbYes
                  With ListBox1
                        .List(Idx, 1) = ComboBox1
                        .List(Idx, 2) = TextBox5
                        .List(Idx, 3) = TextBox7
                        .List(Idx, 4) = NumRes(TextBox6)
                        .List(Idx, 5) = NumRes(TextBox6) * Val(TextBox7)
                        .ListIndex = Idx
                        TextBox8 = SL + Val(TextBox7)
                        TextBox9 = NumFor(TTT + .List(Idx, 5))
                  End With
                  GoTo CaseCancel
                  
            Case vbNo: Exit Sub
            Case vbCancel
CaseCancel:
                  CmdTamNhap.Visible = True
                  CmdChinhSua.Visible = False
                  CmdSave.Enabled = True
                  ComboBox1 = ""
                  TextBox7 = ""
                  ComboBox1.SetFocus
      End Select
End Sub

3)

Mã:
Private Sub CmdPrint_Click()
      Dim Ipt As Integer
      Ipt = Application.InputBox("Nhap so to can in:", "NHAP SO BAN COPY", 1)
      If Ipt = 0 Then Exit Sub
      With Worksheets("PhieuDatHang")
            .Visible = xlSheetVisible
            .Select
            .PrintOut Copies:=Ipt
             Worksheets("Honda price list").Select
            .Visible = xlSheetVeryHidden
      End With
      CmdPrint.Enabled = False
End Sub


4)


Mã:
Private Sub CmdSave_Click()
      Dim r As Long
      With Worksheets("PhieuDatHang")
            .[A6] = Format(TextBox1, "mm/dd/yyyy")
            .[B7] = UCase(TextBox2)
            .[E7] = TextBox3
            .[B8] = NumRes(TextBox4)
            .[E8] = NumRes(TextBox9) - NumRes(TextBox4)
[COLOR=#008000][B]      '------------------------------------------------
            'Bao toan vi tri cua Name TongCong luon o hang 18:
[/B][/COLOR][COLOR=#0000cd][B]            r = [TongCong].Row
            Select Case r
                  Case Is < 18
                        .Rows("13:" & r - 4).Insert xlDown
                  Case Is > 18
                        .Rows("13:" & 32 - r).Delete xlUp
            End Select
            .Range("A12:F" & r - 1).ClearContents[/B][/COLOR][COLOR=#008000][B]
      '------------------------------------------------
            'Kiem tra neu so luong ma hang nhap vao lon hon 6 thi them hang:
[/B][/COLOR][COLOR=#0000cd][B]            r = ListBox1.ListCount
            If r > 6 Then .Rows("17:" & r + 10).Insert xlDown[/B][/COLOR]
      '------------------------------------------------
            'Nhap ma hang vao sheet:
            [B][COLOR=#ff0000].[A12].Resize(r, 6).Value = ListBox1.List[/COLOR][/B]
      '------------------------------------------------
            'Luu y voi cac Name moi:
            [TongCong] = Val(TextBox8)
            [ThanhTien] = NumRes(TextBox9)
            [SoLuong] = Val(TextBox8)
            'Neu muon VBA xu ly truc tiep ham VND thi dung code duoi:
            '[TienVN] = VND(NumRes(TextBox9))
      End With
      Call XoaText
      CmdPrint.Enabled = True
      CmdSave.Enabled = False
End Sub

5)

Phần code màu xanh là thủ tục bảo toàn số dòng cần nhập!
 

File đính kèm

  • 16-10-2012 Version2.rar
    38.1 KB · Đọc: 177
Upvote 0
Cảm ơn bạn, rất có ích cho công việc và cho tự mày mò vba, một lần nửa cảm ơn bạn.
 
Upvote 0
Mình gặp rắc rối với việc thêm và xóa dòng ( sau khi xóa dòng thi định dạng border, ... không còn nữa, cũng trên nền tảng code của bạn Hoàng Trọng Nghĩa bạn nào sửa giúp cố định là 15 mã hàng, không chèn thêm dòng, xin cảm ơn mọi người. ( file đính kèm)
 

File đính kèm

  • 16-10-2012 Version2.rar
    38.1 KB · Đọc: 9
Upvote 0
Mình gặp rắc rối với việc thêm và xóa dòng ( sau khi xóa dòng thi định dạng border, ... không còn nữa, cũng trên nền tảng code của bạn Hoàng Trọng Nghĩa bạn nào sửa giúp cố định là 15 mã hàng, không chèn thêm dòng, xin cảm ơn mọi người. ( file đính kèm)

Tôi chưa xem file, nhưng hình như bạn không "đọc kỹ hướng dẫn sử dụng trước khi dùng" sao?

5) KHÔNG GIỚI HẠN SỐ MÃ HÀNG NHẬP VÀO, TỰ ĐỘNG BẢO TOÀN SỐ HÀNG LUÔN LÀ 6 MỤC VÀ NẾU CÓ HƠN THÌ CHƯƠNG TRÌNH SẼ TỰ ĐỘNG INSERT HÀNG. BẠN KHÔNG CẦN PHẢI LÀM THỦ CÔNG ĐÂU!

và:

LƯU Ý: NẾU BẠN IMPORT FORM, MODULE VÀO FILE GỐC CỦA BẠN, BẮT BUỘC BẠN PHẢI XÓA CÁI SHEET2 Ở FILE GỐC, SAU ĐÓ DÙNG PHƯƠNG THỨC MOVE OR COPY SHEET2 CHUYỂN TỪ FILE TÔI QUA FILE CỦA BẠN.

==================================================

P/S: Hình như bạn gửi ngay cái file tôi làm cho bạn? Nếu vậy thì gửi lên làm chi hả trời?
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là tự động thêm và xóa dòng, khi vba xóa dòng, sau đó thêm dòng thì những dòng sau không còn format border nữa ( nhìn phiếu đặt hàng hơi .. kỳ kỳ ), với lại code thêm - xóa dòng đúng là phức tạp quá, nghiền ngẫm hoài không ra, ^.^, giờ cố định 15 dòng, sẽ dễ áp dụng cho các trường hợp sau hơn.
 
Upvote 0
Đúng là tự động thêm và xóa dòng, khi vba xóa dòng, sau đó thêm dòng thì những dòng sau không còn format border nữa ( nhìn phiếu đặt hàng hơi .. kỳ kỳ ), với lại code thêm - xóa dòng đúng là phức tạp quá, nghiền ngẫm hoài không ra, ^.^, giờ cố định 15 dòng, sẽ dễ áp dụng cho các trường hợp sau hơn.

Do bạn định dạng ngay từ đầu không đúng quy cách, bạn cứ tô khối hết toàn bộ cái bảng đó rồi border 1 lần kiểu mà bạn muốn thì không lý nào nó insert hoặc delete lại không copy định dạng từ trên xuống cả!

Lẽ ra như vậy là tổng quát cho bạn, thì bạn lại muốn chỉ 15 dòng thôi thì tôi làm cho bạn, không cần Name nào cả QUÁ ĐƠN GIẢN!

Với nút TẠM NHẬP chỉ thêm thủ tục ngăn lại nếu đã nhập đủ 15 dòng trong ListBox:

Mã:
Private Sub CmdTamNhap_Click()
      On Error Resume Next
      Dim i As Long, j As Long
      
[COLOR=#ff0000][B]      If ListBox1.ListCount > 14 Then
            MsgBox "Gioi han nhap 15 mã hàng!", vbOKOnly + vbInformation, "THÔNG BÁO"
            Exit Sub
      End If[/B][/COLOR]
      
      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

  ..........................................................

End Sub

Và nút nhập vào sheet (SAVE) càng đơn giản hơn!

Mã:
Private Sub CmdSave_Click()
      Dim r As Long
      r = ListBox1.ListCount
      
      With Worksheets("PhieuDatHang")
            .Range("A12:F16").ClearContents
            .[A6] = Format(TextBox1, "mm/dd/yyyy")
            .[B7] = UCase(TextBox2)
            .[E7] = TextBox3
            .[B8] = NumRes(TextBox4)
            .[E8] = NumRes(TextBox9) - NumRes(TextBox4)
            
            .[A12].Resize(r, 6).Value = ListBox1.List
            
            .[D27] = Val(TextBox8)
            .[F27] = NumRes(TextBox9)
            .[B29] = Val(TextBox8)
            'Neu muon VBA xu ly truc tiep ham VND thi dung code duoi:
            '[D29] = VND(NumRes(TextBox9))
      End With
      Call XoaText
      CmdPrint.Enabled = True
      CmdSave.Enabled = False
End Sub

NHƯ VẬY CÁI SHEET ĐÓ CỐ ĐỊNH HÀNG/CỘT BẠN KHÔNG PHẢI INSERT HAY DELETE GÌ ĐÂU NHÉ, NẾU THÊM/BỚT HÀNG, BẠN TỰ SỬA LẠI TRONG CODE VÌ NÓ SẼ KHÔNG TỰ UPDATE HÀNG CỘT GÌ NỮA!
 

File đính kèm

  • 16-10-2012 Version2.2.rar
    38.1 KB · Đọc: 62
Upvote 0
Cảm ơn bạn đã giúp rất nhiệt tình, xin cảm ơn và chúc mạnh khỏe.
 
Upvote 0
Eo, bạn không test lại rồi, phiếu cũ 15 mã hàng, khi làm phiếu mới 1 đơn hàng nó chỉ xóa 5 mã, còn lại từ 6 đến 15 mã cuối nó không xóa => sai.
Mình sửa code cũ cũng bị tình trạng này ^.^
 
Upvote 0
Mình làm được rồi, chỉnh lại phạm vi clearcontent.
 
Upvote 0
Đang mày mò sửa code của bạn thành form nhập liệu bán hàng 1 ngày, sau đó lưu vào sheet. ngày mai lại tiếp tục , tạo thành dữ liệu bán thành 1 tháng ^.^
 
Upvote 0
Web KT
Back
Top Bottom