Điều kiện nhập liệu cho textbox trong Userform. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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

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

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

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
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

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

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

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
Có chút xíu thôi mà tìm không ra =.=
Xin gởi kèm file, nhờ mọi người giúp, không giám mở topic mới, post luôn trong đây.
Cảm ơn mọi người.
 

File đính kèm

Upvote 0
Có chút xíu thôi mà tìm không ra =.=
Xin gởi kèm file, nhờ mọi người giúp, không giám mở topic mới, post luôn trong đây.
Cảm ơn mọi người.

Chán bạn thiệt đó! Đơn giản vậy mà cũng không làm được! Sao không dựa vào bài cũ rồi chỉnh sửa một chút thôi?

Thôi, làm luôn cho bạn nè! Cố gắng tìm hiểu, mày mò hơn nữa nhé!

Mã:
Private Sub UserForm_Initialize()
    TextBox1 = Date
    With Sheets("Data")
        ComboBox1.List = Range(.[A2], .[C65536].End(xlUp)).Value
    End With
End Sub

Private Sub TextBox1_Change()
    Call CmdEnble
End Sub

Private Sub TextBox4_Change()
    Call CmdEnble
End Sub

Private Sub ComboBox1_Change()
    On Error GoTo Loi
    TextBox2 = ComboBox1.List(, 1)
    TextBox3 = ComboBox1.List(, 2)
    Call CmdEnble
    Exit Sub
Loi:
    TextBox2 = ""
    TextBox3 = ""
    CommandButton1.Enabled = False
End Sub

Private Sub CommandButton1_Click()
    With Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1)
        .Value = ComboBox1
        .Offset(, 1) = TextBox2
        .Offset(, 2) = TextBox3
        .Offset(, 3) = Val(TextBox4)
    End With
    ComboBox1 = "": TextBox4 = ""
    ComboBox1.SetFocus
End Sub

Private Sub CommandButton2_Click()
    Unload Me
End Sub

Private Sub CmdEnble()
    If TextBox4 = "" Or ComboBox1 = "" Then
        CommandButton1.Enabled = False
    Else
        CommandButton1.Enabled = True
    End If
End Sub
 

File đính kèm

Upvote 0
Mới làm quen vba được 3 - 4 ngày thôi ^.^, thx bạn đã giúp đỡ.
 
Upvote 0
To : Hoàng Trọng Nghĩa và ai có thời gian rảnh.
Chết - chết - chết rồi, cái form đặt hàng bạn viết trước [ 16.10.2012 version2 ] dòng thành tiền : vnd() nó không tự update, vd đơn hàng trước hàm vnd đang là sáu triệu đồng, đơn hàng sau là ba triệu đồng, khi in nó vẫn in là sáu triệu đồng, khi thoát form nó mới chịu update ba triệu đồng => sai, tạm thời mình đang cho dòng code đó không hiệu lực, nếu bạn có ghé qua đây thì xem giúp mình chút, thx bạn .
 
Upvote 0
To : Hoàng Trọng Nghĩa và ai có thời gian rảnh.
Chết - chết - chết rồi, cái form đặt hàng bạn viết trước [ 16.10.2012 version2 ] dòng thành tiền : vnd() nó không tự update, vd đơn hàng trước hàm vnd đang là sáu triệu đồng, đơn hàng sau là ba triệu đồng, khi in nó vẫn in là sáu triệu đồng, khi thoát form nó mới chịu update ba triệu đồng => sai, tạm thời mình đang cho dòng code đó không hiệu lực, nếu bạn có ghé qua đây thì xem giúp mình chút, thx bạn .

Chết cái gì mà chết! Bạn đưa cái code tính tiền của bạn lên đây đi rồi tôi tính tiếp cho bạn! Vì không có hàm đó nên tôi bỏ ngỏ vậy thôi!
 
Upvote 0
LINK DOWNLOAD FILE
(giaiphapexcel.com/forum/attachment.php?attachmentid=90840&d=1350653660)
(Là cái form bữa trước bạn làm đó)

Lần cuối cùng, tôi nói bạn gửi cái file thật của bạn lên đi, bản thân bạn không rõ gì về code mà cứ tự copy, sao chép, import, export ... hoàn toàn giống cấu trúc thì không sao, còn khác địa chỉ ô hay hàng, cột thì không thể thực hiện đúng đâu!

Bạn gửi cái file của tôi làm chi! Tôi nói rằng bạn gửi cái HÀM TÍNH VIỆT NAM ĐỒNG của bạn! Tôi nói tiếng Việt bạn không hiểu à?
 
Upvote 0
file.xls - Your file of 139.5 KB bytes exceeds the forum's limit of 97.7 KB for this filetype
tự nhiên điễn đàn giới hạn file xls còn 97.7kb, bữa trước up ngon lành giờ chẳng hiệu tại sao, thôi nén lại cho rồi.
 

File đính kèm

Upvote 0
file.xls - Your file of 139.5 KB bytes exceeds the forum's limit of 97.7 KB for this filetype
tự nhiên điễn đàn giới hạn file xls còn 97.7kb, bữa trước up ngon lành giờ chẳng hiệu tại sao, thôi nén lại cho rồi.

Tôi chán bạn ghê, thôi được, nếu bạn không gửi lên được cái addins VND của bạn (về chuyện đọc số ra chữ, diễn đàn này có hằng hà sa số!) thì bạn nên làm như sau:

Tôi nhớ, với nút lệnh SAVE (CmdSave_Click) có "thòng" sẳn cho bạn một đoạn code này:

Mã:
 [COLOR=#008000]           'Neu muon VBA xu ly truc tiep ham VND thi dung code duoi:
            [B]'[D29] = VND(NumRes(TextBox9))[/B]
[/COLOR]

Thì bạn chỉ việc bỏ dấu nháy và sửa lại D29 thành D24 thôi, có gì khó cho bạn không?

Mã:
[B][COLOR=#0000cd][D24] = VND(NumRes(TextBox9))[/COLOR][/B]

Nguyên do nó không Update được hàm chẳng qua nó bị chặn tính toán do load form có thủ tục Call AppFast thôi, có thủ tục này thì chương trình sẽ chạy nhanh hơn, không bị chớp, sau khi thoát form lại có thủ tục Call UnAppFast để trả lại như cũ. Vì thế, đã làm VBA rồi thì đừng để nó tính trên sheet, cứ cho nó tính trực tiếp trên form luôn đi, sau đó nó tự nhập vào.
 
Lần chỉnh sửa cuối:
Upvote 0
mình có thử sử sụng code dòng vnd,
'[D29] = VND(NumRes(TextBox9))
nhưng form cứ báo lỗi và bôi đen chữ VND.
đính kèm file vnd.
 

File đính kèm

Upvote 0
mình có thử sử sụng code dòng vnd,
'[D29] = VND(NumRes(TextBox9))
nhưng form cứ báo lỗi và bôi đen chữ VND.
đính kèm file vnd.
Xin cho hỏi bạn xài file này của Anh Nguyễn Duy Tuân phải không vậy? Không lý nào tự nhiên xài trên sheet được mà không thể xài trực tiếp trên form được!
 
Upvote 0
mình có thử sử sụng code dòng vnd,
'[D29] = VND(NumRes(TextBox9))
nhưng form cứ báo lỗi và bôi đen chữ VND.
đính kèm file vnd.

Tạm thời, file của bạn nhập cũng không nhiều, tính toán cũng không bao nhiêu, bạn thêm dấu nháy vào Call AppFast đi nhé để nó không hoạt động, đồng thời tại ô D22 bạn cứ dùng hàm trong sheet bình thường, sẽ không bị tính sau khi in nữa!
 
Upvote 0
Nếu bạn dùng thư viện acchelper.xll để lập trình VBA thì file acchelper.xll nên để tại c:\windows\system32\ Đây là nguyên tắc chung khi dùng hàm trong thư viện xll/dll. Nếu Windows XP thì thư viện có thể để chung thư mục của chương trình.
Lưu ý là bạn phải khai bái hàm VND bởi Declare...theo file hướng dẫn trong thư mục add-in nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
To : Bạn Nghĩa ( nếu có ghé qua đây )
bản 16-10-2012 version 2 (mới nhất), khi mình nhập mã pt, thì tên pt + số tiền tự động điền theo, có cách nào vẫn tự động điền số tiền vừa có thể chỉnh sửa số tiền được không nhỉ ?
vd, phụ tùng a, tự động tìm giá là 99.000 đồng, mình muốn sửa thành 100.000 đồng ngay trong ô số tiền.
Nếu bạn rảnh thì giúp với, nhưng đừng có .. nóng :D, trình độ người tự học vba 1 tuần thì chưa làm gì đc đâu ^.^
 
Upvote 0
To : Bạn Nghĩa ( nếu có ghé qua đây )
bản 16-10-2012 version 2 (mới nhất), khi mình nhập mã pt, thì tên pt + số tiền tự động điền theo, có cách nào vẫn tự động điền số tiền vừa có thể chỉnh sửa số tiền được không nhỉ ?
vd, phụ tùng a, tự động tìm giá là 99.000 đồng, mình muốn sửa thành 100.000 đồng ngay trong ô số tiền.
Nếu bạn rảnh thì giúp với, nhưng đừng có .. nóng :D, trình độ người tự học vba 1 tuần thì chưa làm gì đc đâu ^.^

Tại TextBox đó, bạn chỉ cần chọn thuộc tính Lock là False được rồi.
 
Upvote 0
Nhờ mọi người chỉ giúp code này sao chạy nửa vời vầy nè.
Data trong combobox1 có mã nhận, mã không nhận.
vd: data trong combobox1 điển hình có 2 mã 31200ktf987 và 31201187701, khi đánh 31200ktf987 thì nhận, nhưng 31201187701 thì không nhận, các mã sau thì lại nhận đầy đủ, 1 khúc sau nữa lại không nhận, mong mọi người chỉ các khắc phục. Cảm ơn mọi người.
Các mã bắt đầu với 96xxx thì nhận, nhưng 961xxx lại không nhận ... 31201187701 không nhận.
 

File đính kèm

Upvote 0
Nhờ mọi người chỉ giúp code này sao chạy nửa vời vầy nè.
Data trong combobox1 có mã nhận, mã không nhận.
vd: data trong combobox1 điển hình có 2 mã 31200ktf987 và 31201187701, khi đánh 31200ktf987 thì nhận, nhưng 31201187701 thì không nhận, các mã sau thì lại nhận đầy đủ, 1 khúc sau nữa lại không nhận, mong mọi người chỉ các khắc phục. Cảm ơn mọi người.
Các mã bắt đầu với 96xxx thì nhận, nhưng 961xxx lại không nhận ... 31201187701 không nhận.

Bạn nói "không nhận" vậy cái gì không nhận hả bạn? Trên form hay trên sheet nếu trên sheet thì sheet nào? Nêu trên form thì không nhận tại textbox nào?
 
Upvote 0
Vd mã 31200ktf987 và 31201187701
Mình đánh vào comboxbox1 31 thì nó nhận biết mã và hiện ra tiếp 200ktf, dòng tên phụ tùng + đơn giá hiển thị.
Nhưng mã 31201187701 thì nó không nhận ra mã, không hiện tên + giá phụ tùng.
 
Upvote 0
Vd mã 31200ktf987 và 31201187701
Mình đánh vào comboxbox1 31 thì nó nhận biết mã và hiện ra tiếp 200ktf, dòng tên phụ tùng + đơn giá hiển thị.
Nhưng mã 31201187701 thì nó không nhận ra mã, không hiện tên + giá phụ tùng.

Nói lòng vòng chả hiểu gì hết, nói túm lại là gõ trên combobox nó không hiện phần mình sắp gõ tiếp ra chứ gì! Đây là một trong những cái dỡ khi sử dụng List đối với combobox khi gõ phần số, nó chỉ "thông minh" với phần chuỗi thôi. Vậy làm cách nào khắc phục đây? Trong thuộc tính của ComboBox nó lại cho ta một cái để nạp dữ liệu đó là RowSource. Với thuộc tính này nó luôn luôn hiện phần autocomplete khi ta nhập một vài ký tự. Bạn sửa lại code như sau:

Mã:
Private Sub UserForm_Initialize()
    TextBox1 = Date
    With Sheets("honda price list")
[COLOR=#008000]        'Thay vì dòng này, thì bạn đổi lại dòng màu đỏ bên dưới là OK.
        [B]'ComboBox1.List = Range(.[B5], .[G65536].End(xlUp)).Value[/B][/COLOR]
        [B][COLOR=#0000cd]ComboBox1.RowSource = "'honda price list'!" & Range(.[B5], .[G65536].End(xlUp)).Address[/COLOR][/B]
    End With
End Sub
 
Upvote 0
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
Đâ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 ?

Nếu từ 5 OptionButton trở lên, tôi không dùng nó nữa! Tôi sẽ chọn trên ListBox hoặc trên ComboBox cho khỏe! Rồi căn cứ vô đó mà thực thi code thôi.
 
Upvote 0
Mình vừa tìm được giải pháp, bạn lại hướng cho 1 mình 1 giải pháp khác, đúng sự học là bất tận. CẢM ƠN BẠN NHIỀU. để mình tìm hiễu cách bạn vừa nói, nếu bí lại nhờ bạn gợi ý cho vậy.
 
Upvote 0
Mình vừa tìm được giải pháp, bạn lại hướng cho 1 mình 1 giải pháp khác, đúng sự học là bất tận. CẢM ƠN BẠN NHIỀU. để mình tìm hiễu cách bạn vừa nói, nếu bí lại nhờ bạn gợi ý cho vậy.

Đây, bạn xem bài này để tham khảo cho bài của bạn:

http://www.giaiphapexcel.com/forum/...trol-gì-Excel-có-nó-không&p=447373#post447373

Bài này tôi dùng ComboBox làm điều kiện chọn lựa đấy!
 
Upvote 0
Chào bạn!

Tôi cũng đang mày mò VBA như bạn đây. Hồi trước tôi có làm 1 vài báo cáo có sử dụng VBA. Hôm nay đọc Topic của bạn, không biết phương án xuất báo cáo của tôi giúp ích được gì cho bài toán bạn đặt ra bên trên không?
Tôi gửi file theo đính kèm trong đó:

- Tôi tạo thêm 1 Form mới, cho phép bạn tùy ý lựa chọn những mã hàng nào bạn muốn gộp lại thành nhóm với nhau và lưu Tên, Thông tin của nhóm đó trong Sheet Tiện ích => chính vì vậy bạn muốn bao nhiêu nhóm cũng được, và mỗi nhóm gồm mã hàng nào là tùy ý, và sửa đổi cũng tùy ý luôn.

- Ở đây tôi chỉ dừng lại ở phần tạo cho bạn các nhóm khác nhau và để ngỏ nút lệnh Export Report để bạn tùy ý thích làm những gì theo yêu cầu của bạn.
- Cách làm: Bạn lựa chọn các mã hàng trong Field rồi nhấn mũi tên sang ngang để xác nhận lựa chọn và hiển thị ở bên Preview, nếu muốn lưu lại thì điền tên vào Input Record's Name và nhấn Make/ Update. Với những Nhóm bạn đã lưu từ trước thì lựa chọn từ Input Record's NameEnter -> sẽ hiển thị ở Preview

Cách viết code của tôi cũng dở lắm nên tôi nghĩ có lẽ bạn sẽ dễ hiểu.
Chúc bạn vui vẻ!
 

File đính kèm

Upvote 0
Button minimize form (mình mới tìm được trên NET)

Dim dheight As Double
Dim dwidth As Double

Private Sub ToggleButton1_Click()
If ToggleButton1.Value = True Then
Me.Height = Me.Height * 0.15
Me.Width = Me.Width * 0.15
Else
Me.Height = dheight
Me.Width = dwidth
End If
End Sub

Private Sub UserForm_Initialize()
dheight = Me.Height
dwidth = Me.Width
End Sub

Ngoài cách này ra + ngoài cách minimize + maximize, còn cách nào khác để minimize form trong vba excel không mọi người ?
 
Upvote 0
Button minimize form (mình mới tìm được trên NET)

Dim dheight As Double
Dim dwidth As Double

Private Sub ToggleButton1_Click()
If ToggleButton1.Value = True Then
Me.Height = Me.Height * 0.15
Me.Width = Me.Width * 0.15
Else
Me.Height = dheight
Me.Width = dwidth
End If
End Sub

Private Sub UserForm_Initialize()
dheight = Me.Height
dwidth = Me.Width
End Sub

Ngoài cách này ra + ngoài cách minimize + maximize, còn cách nào khác để minimize form trong vba excel không mọi người ?
Thì tạo 2 nút MAX, MIN trên thanh tiêu đề là xong
PHP:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
 (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
PHP:
Private Sub UserForm_Initialize()
  Dim hWnd As Long
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  SetWindowLong hWnd, -16, &H84CF0080
End Sub
 
Upvote 0
Sub hiden()
Sheets("sheet1").[b10:b20].Select
For Each Clls In Selection
If Clls > 0 Then
Clls.EntireRow.Hidden = True
End If
Next
End Sub

Theo code trên, trong vùng b10:b20, dòng nào có dữ liệu sẽ ẩn.
Vd, trong vùng b10:b20, mình có dữ liệu từ b10 đến b15
Vậy, sửa code thế nào để ẩn từ b10 đến b14
Để lại b15 không ẩn (mặc dù b15 vẫn có data)
Mong mọi người chỉ giúp, xin cảm ơn.
 
Upvote 0
Sub hiden()
Sheets("sheet1").[b10:b20].Select
For Each Clls In Selection
If Clls > 0 Then
Clls.EntireRow.Hidden = True
End If
Next
End Sub

Theo code trên, trong vùng b10:b20, dòng nào có dữ liệu sẽ ẩn.
Vd, trong vùng b10:b20, mình có dữ liệu từ b10 đến b15
Vậy, sửa code thế nào để ẩn từ b10 đến b14
Để lại b15 không ẩn (mặc dù b15 vẫn có data)
Mong mọi người chỉ giúp, xin cảm ơn.

Tôi chưa thấy ẩn cell bao giờ, chỉ có ẩn dòng, ẩn cột thôi. Ý bạn muốn nói là ẩn dòng?

PHP:
Sub hiden()
      Dim Clls As Range
      For Each Clls In Sheets("sheet1").[b10:b20]
            If Clls.Address = "$B$15" Then
                  Clls.EntireRow.Hidden = False
            Else
                  If Clls > 0 Then
                        Clls.EntireRow.Hidden = True
                  Else
                        Clls.EntireRow.Hidden = False
                  End If
            End If
      Next
End Sub
 
Upvote 0
Sub hiden()
Dim Clls As Range
For Each Clls In Sheets("sheet1").[b10:b20]
If
Clls.Address = "$B$15" Then
Clls
.EntireRow.Hidden = False
Else
If
Clls > 0 Then
Clls
.EntireRow.Hidden = True
Else
Clls.EntireRow.Hidden = False
End
If
End If
Next
End Sub

Code này cố định dòng b15, nhưng data mình nhập vào là liên tục nên địa chỉ là tương đối chứ không là tuyệt đối b15 được.
thx bạn.
 
Upvote 0
Sub hiden()
Dim Clls As Range
For Each Clls In Sheets("sheet1").[b10:b20]
If
Clls.Address = "$B$15" Then
Clls
.EntireRow.Hidden = False
Else
If
Clls > 0 Then
Clls
.EntireRow.Hidden = True
Else
Clls.EntireRow.Hidden = False
End
If
End If
Next
End Sub

Code này cố định dòng b15, nhưng data mình nhập vào là liên tục nên địa chỉ là tương đối chứ không là tuyệt đối b15 được.
thx bạn.

Thì bạn cứ sửa lại địa chỉ ô nếu dữ liệu của bạn có thay đổi. Thuật toán là vậy, bạn tùy biến theo thực tế chứ!

Vấn đề của bạn nói tương đối, tuyệt đối ở môi trường VBA là không chính xác đâu nha. Bạn thấy tôi ghi "$B$15" là bạn cho tuyệt đối à? Đây là địa chỉ mà .Address nó quét qua thôi, chứ không cố định hàng cột gì ở đây cả đâu nhé! Bạn mà sửa lại mà bỏ 2 dấu $$ đi là sai đấy!
 
Lần chỉnh sửa cuối:
Upvote 0
mình chưa phân biệt được cách dùng "=*ha" và "*ha" trong hàm if và sumif, hỏi "ngu" 1 chút, mong mọi người đừng "ném gạch"
Vui lòng xem file.
Cảm ơn mọi người
 

File đính kèm

Upvote 0
Cho mình hỏi thêm chút xíu nữa ( tham lam quá ^.^)
Trong workbook excel, menu view/toolbars/control toolbox
vẽ 1 textbox1 lên sheet
Cột A sheet1 là ngày tháng định dạng 11/07/2012.
làm sao để khi nhập vào textbox1 11/07/2012 thì tất cả ngày tháng khác ẩn đi, chỉ để lại các dòng có ngày 07/11/2012.
Khi xóa 11/7/2012 (textbox1 trống) thi 2 hiện tất cả ngày tháng trong cột A.
Cảm ơn mọi người.
 
Upvote 0
Gửi file đính kèm, mong mọi người chỉ giúp, cảm ơn.
 

File đính kèm

Upvote 0
Mình đã làm được (gần 1 ngày trời :( )
Cảm ơn mọi người.
 
Upvote 0
Cho mình hỏi thêm chút xíu nữa ( tham lam quá ^.^)
Trong workbook excel, menu view/toolbars/control toolbox
vẽ 1 textbox1 lên sheet
Cột A sheet1 là ngày tháng định dạng 11/07/2012.
làm sao để khi nhập vào textbox1 11/07/2012 thì tất cả ngày tháng khác ẩn đi, chỉ để lại các dòng có ngày 07/11/2012.
Khi xóa 11/7/2012 (textbox1 trống) thi 2 hiện tất cả ngày tháng trong cột A.
Cảm ơn mọi người.

Sao không làm AutoFilter đi? Cần gì phải TextBox cho mệt vậy?

mình chưa phân biệt được cách dùng "=*ha" và "*ha" trong hàm if và sumif, hỏi "ngu" 1 chút, mong mọi người đừng "ném gạch"
Vui lòng xem file.
Cảm ơn mọi người
Bài này lẽ ra là hỏi trong box hàm và công thức, nhưng thôi, topic này cũng do bạn tạo nên tôi trả lời luôn!

A9: =SUMIF($A$2:$A$8,"*ha*",$E$2:$E$8)

A10: =SUMIFS($E$2:$E$8,$A$2:$A$8,"*ha*",$B$2:$B$8,"nv")

Xem file.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0


mình thấy bài này rất hay, nhờ các bạn hướng dẫn khi nhấp chọnbuttion thì listbox lấy dữ liệu sheet tướng ứng. như file mẫu. em cảm ơn.

( sao mình gõ tiếng việt trên này không được nhỉ, copy từ wsang.)

 

File đính kèm

Upvote 0


mình thấy bài này rất hay, nhờ các bạn hướng dẫn khi nhấp chọnbuttion thì listbox lấy dữ liệu sheet tướng ứng. như file mẫu. em cảm ơn.

( sao mình gõ tiếng việt trên này không được nhỉ, copy từ wsang.)
Bài này chả có gì hay hết, có hoạt động gì đâu mà hay?

Nếu bạn muốn hỏi bài thì đề nghị bạn mở một đề tài khác nhờ giúp cho đàng hoàng, thấy màu dòng đỏ trên người ta lầm tưởng là bạn đang chia sẻ một ứng dụng nào đó, mở ra chả có gì để gọi là hay ho cả.
 
Upvote 0
cảm ơn bạn, bài hay là bài các bạn đẳ đăng và công việc của mình tương tự, khác căn cứ tuỳ chọn để lấy dữ liệu sheet tương ứng vào điều kiện data validtation.
 
Upvote 0
chào các anh chị ạ!

Em đang có 1 vấn đề chưa làm đc ở file em, kính nhờ anh chị xem và hỗ trợ giúp em ạ.

1/ ràng buộc các phần nhập của Userform phải có dữ liệu mới cho phép nhập (trừ cái seri2 k có hay có vẫn nhập đc), sau khi nhập mới dữ liệu thì dữ liệu sẽ đc xóa khỏi các textbox

2/ cái nút update lại dữ liệu viết code như thế nào ạ xin trợ giúp!

3/ cái ngày xuất em chưa định dạng đc theo kiểu mm/dd/yyyy

Cám ơn anh chị ạ!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em đang có 1 vấn đề chưa làm đc ở file em, kính nhờ anh chị xem và hỗ trợ giúp em ạ.
1/ ràng buộc các phần nhập của Userform phải có dữ liệu mới cho phép nhập (trừ cái seri2 k có hay có vẫn nhập đc), sau khi nhập mới dữ liệu thì dữ liệu sẽ đc xóa khỏi các textbox
2/ cái nút update lại dữ liệu viết code như thế nào ạ xin trợ giúp!
3/ cái ngày xuất em chưa định dạng đc theo kiểu mm/dd/yyyy
(1) Bạn thử thêm như sau:
PHP:
Private Sub CmdNEW_Click()
Dim XuatNK As Long:                            Dim Msg As String
Const TD As String = " Chua Nhâp Du Liêu!"
    
If Me!LNK.Text = "" Then
    Msg = "TextBox 'LNK'"
ElseIf Me!NGAYXUAT.Text = "" Then
    Msg = "TextBox 'NgayXuat'"
Else
    ' . . . . . => Ban Viêt Tiêp Nha!   '
End If
If Msg <> "" Then
    MsgBox Msg & TD:                       Exit Sub
End If
With Sheets("Xuat")
    XuatNK = .[c65500].End(xlUp).Row + 1
    .Cells(XuatNK, "C").Value = Me!LNK.Text
    .Cells(XuatNK, "D").Value = Me!NGAYXUAT.Value       '  (3)  '
    .Cells(XuatNK, "E").Value = Me!KH.Text
    .Cells(XuatNK, "F").Value = Me!VHC.Text
    .Cells(XuatNK, "H").Value = Me!SERI1.Text
    .Cells(XuatNK, "I").Value = Me!SERI2.Text
End With
MsgBox "NhËp xong!", , " Th«ng b¸o"
End Sub

(2) Bạn muốn tìm đến dòng dữ liệu cũ (mà vừa cập nhật) để nhập dữ liệu vừa thay đổi?
Thì bạn bước đầu là fải tìm thôi! Nhưng quá trình 'tìm kiếm' thì xác định trường/cột chuẩn để tìm là 1 chuyện quan trọng;
Vậy bạn cho biết chúng ta cần tìm kiếm bắt đầu từ trường/cột nào?
Mà sao lạ là dữ liệu xuất của bạn lại không có fiếu xuất hay cái gì đó tương tự, nhỉ?

(3) Xem lại dòng lệnh trong macro trên

(4) Bạn nên có thói quen xài tên tốt hơn;
Nếu là mình thì mọi TextBox đều có tiếp đầu ngữ là 'tb'; Mọi nút lệnh đều bắt đầu là 'Cmd'; Mọi ListBox đều 'lb. . . '
Nếu là mình thì TextBox 'NGAYXUAT' sẽ là khó nhìn hơn là 'tbNgayX' hay tbNXuat'
Tuy các Control chưa đếm đủ 10 cái cũng nên có thói quen tuân thủ vậy

Ngay đến tên các Control ta cũng nên ghi cho dễ nhận ra, như 'NgayXuat' chứ không nên NGAYXUAT như bạn
'LISTDL' nên là ListDL,. . . .

Rất vui nếu được tiếp tục trao đổi cùng bạn!
 
Upvote 0

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

Back
Top Bottom