be nam
Thành viên chính thức


- Tham gia
- 3/4/10
- Bài viết
- 90
- Được thích
- 3
Đợi tôi khoảng 5 phút nhé! Sắp xong cho bạn rồi? Mà dưc liệu thật bạn có nhiều lớp không?Mình có một danh sách học sinh các lớp. Mỗi lần mình muốn in danh sách từng lớp thì lọc và bấm in rất lâu. Nhờ các Anh chị và các bạn giúp mình đoạn code để in tự động. Yêu cầu mình có gởi trong file đính kèm.
Trân trọng cảm ơn.
Nếu có máy in thì in thử luôn xem sao, chọn ít lớp thôi cho đỡ tốn giấy, ví dụ từ 11B đến 11D chẳng hạn! Thử luôn nếu trục trặc chỗ nào tôi sửa luôn nhé! Hồi âm lại ngay cho tôi. Tôi không có máy in nên không Test được.Mình có một danh sách học sinh các lớp. Mỗi lần mình muốn in danh sách từng lớp thì lọc và bấm in rất lâu. Nhờ các Anh chị và các bạn giúp mình đoạn code để in tự động. Yêu cầu mình có gởi trong file đính kèm.
Trân trọng cảm ơn.
- Nhờ các Anh chị và các bạn giúp mình viết đoạn code in Danh sách lớp.
Ví dụ: Mình chọn in từ lớp 11A đến 11C thì ô A5 sẽ tự động thay đổi
các giá trị từ 11A đến 11C và in luôn.
Tôi thì lại nghĩ chẳng anh hưởng gì cả! Còn nếu như thực sự nếu tác giả sợ ảnh hưởng thì copy File gốc ra thêm mấy bản nữa cất đi đề phòng.Đã là CSDL, tuy không lớn, nhưng ta thao tác trên nó thì nguy cơ hư hòng là rất cao;
Ví dụ macro đang vận hành giữa chừng thì mất điện; Lúc đó thì CSDL của bạn chả còn là chuột, cũng chưa là mèo.
Thông thường CSDL liệu cần/được lọc trích ra 1 nơi (1 trang tính mới). Ta toàn quyền xào hay nấu trên trang mới này mà không sợ CSDL ban đầu bị tổn thương.
Hơn nữa, tại trang 'BCao' này ta có thể diêm dúa, màu mè cho B/C của mình; Còn ở CSDL thì số liệu cần đúng, đủ & chính xác là iêu cầu tối thượng.
Vài lời những mong bạn để í tới & chúc cuối tuần vui vẻ!
Sub PrintLst()
Dim arr(8)
Dim i As Integer
StartRow = Range("StartRow")
EndRow = Range("EndRow")
For i = StartRow To EndRow
arr(i) = Range("H" & i).Value
Range("A5").Value = arr(i)
ActiveSheet.PrintOut Copies:=1
Next i
End Sub
Cám ơn bạn rất nhiều. File của bạn in tốt nhưng mình không hiểu sao code chạy hơi lâu.Tôi thì lại nghĩ chẳng anh hưởng gì cả! Còn nếu như thực sự nếu tác giả sợ ảnh hưởng thì copy File gốc ra thêm mấy bản nữa cất đi đề phòng.
Xem đã đúng ý chưa, phải in thử mới biết được! Báo lại kết quả cho tôi! Tôi không có máy in để test thử!
Dữ liệu của mình vẫn như file gởi ở trên, nhưng không biết tại sau lại chạy hơi lâu.Sao lại lâu nhỉ? Hôm nay tôi test thử ở cơ quan tôi thấy nhanh mà? Hay tại dữ liệu thật của bạn nhiều quá? Hay tại máy in?...
Thử in ở máy in khác xem sao?Dữ liệu của mình vẫn như file gởi ở trên, nhưng không biết tại sau lại chạy hơi lâu.
Góp ý một chút: Nếu bạn muốn test in thì bạn chọn mặc định máy in là Foxit Reader PDF Printer (nếu bạn có xài Foxit để đọc file PDF), khi đó nó sẽ tự động in ra file PDF cho bạn kiểm tra khi không có máy in.
Thân.
Mình thử cả 2 cách, cách của bạn khi bấm lệnh in thì đợi khoảng 6-7s. Không biết do máy mình hay code có nhiều vòng lặp quá nữa. VBA mình không rành.Thử in ở máy in khác xem sao?
Thế cách của bạn in có nhanh hơn không?
Cách của bạn đợi khoảng bao nhiêu giây?Mình thử cả 2 cách, cách của bạn khi bấm lệnh in thì đợi khoảng 6-7s. Không biết do máy mình hay code có nhiều vòng lặp quá nữa. VBA mình không rành.
Mình gởi file bạn test thử.
Đúng là của bạn nhanh hơn nhưng chỉ 1 chút thôi, tại bạn kết hợp cả mảng nên nhanh hơn nhưng không đáng kể vì dữ liệu ở đây rất ít. Của bạn nhanh hơn của tôi khoảng 2s.Cách của mình thì bấm 1s là in liền. Không biết là do code hay do vấn đề gì nữa.
Mình thấy 2 code này cũng như nhau. Nhưng của bạn chuot0106 có nhầm chỗ màu đỏĐúng là của bạn nhanh hơn nhưng chỉ 1 chút thôi, tại bạn kết hợp cả mảng nên nhanh hơn nhưng không đáng kể vì dữ liệu ở đây rất ít. Của bạn nhanh hơn của tôi khoảng 2s.
Mình có một danh sách học sinh các lớp. Mỗi lần mình muốn in danh sách từng lớp thì lọc và bấm in rất lâu. Nhờ các Anh chị và các bạn giúp mình đoạn code để in tự động. Yêu cầu mình có gởi trong file đính kèm.
Trân trọng cảm ơn.
Sub InDanhSach()
Application.ScreenUpdating = False
On Error Resume Next
[h1:h1000].Clear
[e7:e1000].AdvancedFilter 2, [h1], Unique:=True
[h2:h1000].Sort [h2], 1
tmp1 = [h2:h1000].Find([j1]).Address
tmp1 = [h2:h1000].Find([j2]).Address
For Each cls In Range(tmp1, tmp2)
[a5] = cls
[e7:e1000].AutoFilter 1, cls
ActiveSheet.PrintOut Copies:=1
Next
Selection.AutoFilter
End Sub
Cảm ơn Susu16, làm lúc 2h đêm lên không biết nhầm. Vừa xem bóng đá, vừa viết code. HeMình thấy 2 code này cũng như nhau. Nhưng của bạn chuot0106 có nhầm chỗ màu đỏ
Set rng = .Range("H1:H" & .Range("H65500").End(xlToRight).Row)
Nên vòng lặp
For i = 1 To rng.Rows.Count
............
Next i
Chạy 65500 vòng.
Có lẽ chỗ màu đỏ phải sửa lại thành [h2:h1000].Find([j1]).AddressBạn thử code này. Bạn chỉ cần nhập từ lớp đến lớp và bấm lệnh In. Nhanh hay chậm chủ yếu là do máy in.
Mã:Sub InDanhSach() Application.ScreenUpdating = False On Error Resume Next [h1:h1000].Clear [e7:e1000].AdvancedFilter 2, [h1], Unique:=True [h2:h1000].Sort [h2], 1 For Each cls In Range([COLOR=#ff0000][h2][/COLOR], [h2:h1000].Find([j2]).Address) [a5] = cls [e7:e1000].AutoFilter 1, cls ActiveSheet.PrintOut Copies:=1 Next Selection.AutoFilter End Sub
Có lẽ chỗ màu đỏ phải sửa lại thành [h2:h1000].Find([j1]).Address
Nhầm lẫn thì ai cũng có mà, bác sửa lại nhưng cả 2 đều là tmp1. Hậu quả của World Cup.Đúng vậy. Tắt máy rồi mới nghĩ ra nên tôi đã vào sửa lại bài trên
Tham khảo thêm cách nàyMình có một danh sách học sinh các lớp. Mỗi lần mình muốn in danh sách từng lớp thì lọc và bấm in rất lâu. Nhờ các Anh chị và các bạn giúp mình đoạn code để in tự động. Yêu cầu mình có gởi trong file đính kèm.
Trân trọng cảm ơn.