Code in tùy chọn (1 người xem)

Liên hệ QC

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

nguyenvietviet

Thành viên hoạt động
Tham gia
4/3/08
Bài viết
110
Được thích
11
Nghề nghiệp
Nhân viên văn phòng
Chào các pác.Em nhờ các pác chỉnh hộ e cái code in tùy chọn.
Hình như vòng lặp nó chưa đúng lém: Khi chọn in tùy chọn từ combox1 đến combox2 thì nó không in phiếu đầu tiên.
Ví dụ in từ PC01 đến PC03 thì nó chỉ in PC02 và PC03. E muốn nó in cả PC01. Nếu có dòng trắng ở giữa PC02 và PC03 thì bỏ qua không in dòng đó.
Mong các pác giúp đỡ.
 

File đính kèm

Theo bài của anh Duyệt về code nạp nhanh nhất là dùng Collection. Tuy nó kém hỗ trợ khác nhưng ta chỉ cần 1 cái list duy nhất là đủ:

Mã:
Private Sub UserForm_Initialize()
Dim Sh As Worksheet, Cl As Range, i
Dim Ds As New Collection
On Error Resume Next
For Each Cl In Range(Sheet2.[C14], Sheet2.[C65536].End(3)).Cells
If Cl.Value = "" Then Exit For
If UCase(Left(Cl, 2)) = IIf(ActiveSheet.CodeName = "Sheet3", "PT", "PC") Then
Ds.Add Cl.Value, CStr(Cl.Value)
End If
Next
For i = 1 To Ds.Count
Me.ComboBox1.AddItem Ds.Item(i)
Me.ComboBox2.AddItem Ds.Item(i)
Next
TextBox3.Value = 1
Me.OptionButton1 = -1
Me.Caption = IIf(ActiveSheet.CodeName = "Sheet3", "IN PHIEU THU", "IN PHIEU CHI")
Set Ds = Nothing
End Sub

Riêng countif và Listcount nó khác nhau nhiều lắm đấy, khi danh sách dài thì cái vùng đếm của Countif nó sẽ rất nặng nề. Trong khi ta chỉ cần kiểm trong những cái đã lọc nếu chưa có thì thêm vào, nó sẽ ít Item rất nhiều. Nên lựa chọn thích hợp phải không?

(Mình chưa hình dung ra cái vị trí của Công ty bạn)
 
Lần chỉnh sửa cuối:
Upvote 0
Theo bài của anh Duyệt về code nạp nhanh nhất là dùng Collection. Tuy nó kém hỗ trợ khác nhưng ta chỉ cần 1 cái list duy nhất là đủ:
Cái này chưa chắc đâu anh! Em thì hoàn toàn không tin Colection nhanh hơn Dictionary đâu
Anh có thể xem cuộc "thi đấu tốc độ" giữa Collection và Dictionary tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?27286-Tạo-dãy-số-ngẫu-nhiên-không-trùng&
--------------------------------------------------------------------
Mã:
Private Sub UserForm_Initialize()
Dim Sh As Worksheet, Cl As Range, i
Dim Ds As New Collection
On Error Resume Next
For Each Cl In Range(Sheet2.[C14], Sheet2.[C65536].End(3)).Cells
If Cl.Value = "" Then Exit For
If UCase(Left(Cl, 2)) = IIf(ActiveSheet.CodeName = "Sheet3", "PT", "PC") Then
Ds.Add Cl.Value, CStr(Cl.Value)
End If
Next
For i = 1 To Ds.Count
Me.ComboBox1.AddItem Ds.Item(i)
Me.ComboBox2.AddItem Ds.Item(i)
Next
TextBox3.Value = 1
Me.OptionButton1 = -1
Me.Caption = IIf(ActiveSheet.CodeName = "Sheet3", "IN PHIEU THU", "IN PHIEU CHI")
Set Ds = Nothing
End Sub
Vì dữ liệu sau khi được Colection "thu gom" vào chỉ là mớ hổn độn, không phải là mảng nên anh cần đến 2 vòng lập ---> Mất công! Nếu là Dictionary thì sau khi Add vào là có thể dùng ngay để nạp trực tiếp vào ComboBox mà không cần phải thêm vòng lập nào cả
 
Lần chỉnh sửa cuối:
Upvote 0
Theo bài của anh Duyệt về code nạp nhanh nhất là dùng Collection. Tuy nó kém hỗ trợ khác nhưng ta chỉ cần 1 cái list duy nhất là đủ:

Mã:
Private Sub UserForm_Initialize()
Dim Sh As Worksheet, Cl As Range, i
Dim Ds As New Collection
On Error Resume Next
For Each Cl In Range(Sheet2.[C14], Sheet2.[C65536].End(3)).Cells
If Cl.Value = "" Then Exit For
If UCase(Left(Cl, 2)) = IIf(ActiveSheet.CodeName = "Sheet3", "PT", "PC") Then
Ds.Add Cl.Value, CStr(Cl.Value)
End If
Next
For i = 1 To Ds.Count
Me.ComboBox1.AddItem Ds.Item(i)
Me.ComboBox2.AddItem Ds.Item(i)
Next
TextBox3.Value = 1
Me.OptionButton1 = -1
Me.Caption = IIf(ActiveSheet.CodeName = "Sheet3", "IN PHIEU THU", "IN PHIEU CHI")
Set Ds = Nothing
End Sub

Riêng countif và Listcount nó khác nhau nhiều lắm đấy, khi danh sách dài thì cái vùng đếm của Countif nó sẽ rất nặng nề. Trong khi ta chỉ cần kiểm trong những cái đã lọc nếu chưa có thì thêm vào, nó sẽ ít Item rất nhiều. Nên lựa chọn thích hợp phải không?

(Mình chưa hình dung ra cái vị trí của Công ty bạn)
Vâng e cảm ơn pác nhiều. Công ty e là công ty lớn nhưng không dùng phần mềm quản lý lên làm đến đâu thấy vướng mắc e lên forum đề nhờ các pác giúp đỡ. E mong nhận được nhiều sự ủng hộ. Cám ơn
 
Upvote 0
Mình bận 1 chút giờ mới gửi bài được.
Đối với bài này chỉ cần 1 Form thôi, tuỳ biến khéo vận dụng linh hoạt thì code cũng hết sức nhẹ nhàng.
Toàn bộ code của bạn giờ chỉ còn như sau:
Mã:
.....
Tu = [COLOR=#0000ff][B]Me.ComboBox1.ListIndex[/B][/COLOR]
Den = [B][COLOR=#0000ff]Me.ComboBox2.ListIndex[/COLOR][/B]
.....

Từ việc tùy biến theo Thầy Sealand, tôi vận dụng Hàm Lọc & Lọc duy nhất của Thầy ndu96081631 vào bài này, phải công nhận code nhanh và ngắn gọn cực kỳ! Và chỉ sử dụng trên 1 Form, không cần phải sort vì đã sử dụng ListIndex!

Công việc chỉ là nạp dữ liệu cho combobox:
PHP:
Private Sub UserForm_Initialize()
    Application.ScreenUpdating = False
    Dim MyArray
    If ActiveSheet.Name = "INPT" Then
        MyArray = Filter2DArray(Range(Sheet2.[C14], Sheet2.[C65536].End(xlUp)), 1, "pt*", False)
        Me.Caption = "IN PHIEU THU"
    ElseIf ActiveSheet.Name = "INPC" Then
        MyArray = Filter2DArray(Range(Sheet2.[C14], Sheet2.[C65536].End(xlUp)), 1, "pc*", False)
        Me.Caption = "IN PHIEU CHI"
    Else
        Me.Caption = "IN PHIEU THU HOAC CHI"
        CommandButton1.Enabled = False: Exit Sub
    End If
    MyArray = Unique2DArray(MyArray, 1, False)
    ComboBox1.List() = MyArray: ComboBox2.List() = MyArray
    TextBox3.Value = 1
End Sub

Sau đó chỉ còn là xử lý trên Commandbutton:
PHP:
Private Sub CommandButton1_Click()
    If Val(TextBox3) = 0 Then MsgBox "Ban phai nhap so ban in": Exit Sub
    Dim i As Long
    ''IN TAT CA CAC PHIEU -----------------------------------------------------------------------
    If OptionButton1 Then
        For i = 0 To ComboBox1.ListCount - 1
            Range("H5").Value = ComboBox1.List(i)
            ActiveSheet.PrintOut from:=1, To:=1, copies:=Val(TextBox3), collate:=True
        Next
        Unload Me
    End If
    'TUY CHON IN--------------------------------------------------------------------------------
    If OptionButton2 Then
        If ComboBox1 = "" Then MsgBox "Ban phai nhap TU so phieu bat dau": ComboBox1.SetFocus: Exit Sub
        If ComboBox2 = "" Then MsgBox "Ban phai nhap DEN so phieu ket thuc": ComboBox2.SetFocus: Exit Sub
        Dim BD As Integer, KT As Integer
            BD = ComboBox1.ListIndex: KT = ComboBox2.ListIndex
        For i = BD To KT
            Range("H5").Value = ComboBox1.List(i)
            ActiveSheet.PrintOut from:=1, To:=1, copies:=Val(TextBox3), collate:=True
        Next
        Unload Me
    End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tiện thể cho mình hỏi bạn khi muốn thông báo Phiếu này đã in thì bổ sung thế nảo ?
 
Upvote 0
Web KT

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

Back
Top Bottom