Xin hỏi cách chuyển dữ liệu từ Data vào Form mẫu để in (1 người xem)

  • Thread starter Thread starter nhphuduc
  • Ngày gửi Ngày gửi
Liên hệ QC

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

nhphuduc

Thành viên mới
Tham gia
12/7/08
Bài viết
9
Được thích
1
Xin Chào Cả Nhà!
Cả nhà giúp mình code VBA cho trường hợp sau với, nghiên cứu kg nổi nữa rồi!
- Sheet Data có chứa nguồn dữ liệu (Mã hàng, tên hàng, sl đặt và được chia theo từng khách hàng)
- Khi nhấp vào nút In nó sẽ chuyển dữ liệu từ sheet Data cái nào có dữ liệu (có sl order, còn rỗng thì bỏ qua) theo từng khách hàng (Tên KH, Ma Hang, Ten Hang, Order, Chia)

>>> Cái khó là mỗi khách hàng ở 2 cột dài qua phải. Khi xuất qua sheet Form thì mẫu form lập lại y chang nhau cho từng khách hàng!

Cả nhà giúp mình nhé!
Thanks.
 

File đính kèm

Xin Chào Cả Nhà!
Cả nhà giúp mình code VBA cho trường hợp sau với, nghiên cứu kg nổi nữa rồi!
- Sheet Data có chứa nguồn dữ liệu (Mã hàng, tên hàng, sl đặt và được chia theo từng khách hàng)
- Khi nhấp vào nút In nó sẽ chuyển dữ liệu từ sheet Data cái nào có dữ liệu (có sl order, còn rỗng thì bỏ qua) theo từng khách hàng (Tên KH, Ma Hang, Ten Hang, Order, Chia)

>>> Cái khó là mỗi khách hàng ở 2 cột dài qua phải. Khi xuất qua sheet Form thì mẫu form lập lại y chang nhau cho từng khách hàng!

Cả nhà giúp mình nhé!
Thanks.

bạn mở file, mở Macro, nhập tên Khách vào ô P3, click In Phieu để xem kết quả. :-=

Mã:
Public Sub GPE_in1phieu() 'phuong thuc Find, Redim
Application.ScreenUpdating = False
Dim ArrData(), dArr(), rng As Range, ArrKH As Range, Kqua As Range
Dim i As Long, j As Long, K As Long
    'Activesheet
    ArrData = Range([B1048576].End(xlUp), [W5]).Value2 'W5 -> dang tai KHACH 10
    tenKH = Range("C1")
    If tenKH = "" Then MsgBox ("Ban chua dien ten Khach hang"), vbExclamation, "Thong bao'": Exit Sub
    
    Set ArrKH = Range("D3:W3") 'W3 -> dang tai KHACH 10
    Set Kqua = ArrKH.Find(tenKH, , xlFormulas, xlWhole)
    If Not Kqua Is Nothing Then
        Cot = Kqua.Column()
    Else
        MsgBox ("Ko tim thay khach hang ") & tenKH, vbExclamation: Exit Sub
    End If
    'UBound(ArrData, 1) :vòng lap duyet tu dong 1 den dong cuoi' cua vung chon
    ReDim dArr(1 To UBound(ArrData, 1), 1 To 5) 'xac dinh kich thuoc mang
    
    For i = 1 To UBound(ArrData, 1)
        If ArrData(i, Cot - 1) <> "" Then       'kiem tra cot Order
            K = K + 1
                    
            dArr(K, 1) = K                      'STT
            dArr(K, 2) = ArrData(i, 1)          'ma~ hang
            dArr(K, 3) = ArrData(i, 2)          'ten hang
            dArr(K, 4) = ArrData(i, Cot - 1)    'Order
            dArr(K, 5) = ArrData(i, Cot)        'Chia
        End If
    Next i
    
    With Sheets("in1KH")
        .[A5:E24].ClearContents
        .[a5].Resize(K, 5) = dArr
    End With
    
    Erase ArrData
Application.ScreenUpdating = True
MsgBox ("in 1 phieu xong"), vbInformation
'Sheets("in1KH").select
End Sub

'- - -
file mới nhất In Form (Test) 4 đang ở #8
 
Lần chỉnh sửa cuối:
Ui! Bác phucbugis pro kinh! Chú thích chi tiết luôn. Thanks bác nhiều nhé!
Mình hỏi thêm này với, nếu mình chỉ nhấp In 1 lần thôi thì bên In Form tự động show hết phiếu in của các khách hàng từ trên xuống theo form đó có được kg bác (mình chỉ việc nhấp In là nó in tất tần tật, khỏi phải nhấp từng khách hàng)!
Many Thanks!
 
Ui! Bác phucbugis pro kinh! Chú thích chi tiết luôn. Thanks bác nhiều nhé!
Mình hỏi thêm này với, nếu mình chỉ nhấp In 1 lần thôi thì bên In Form tự động show hết phiếu in của các khách hàng từ trên xuống theo form đó có được kg bác (mình chỉ việc nhấp In là nó in tất tần tật, khỏi phải nhấp từng khách hàng)!
Many Thanks!

mình thấy form đó thiết kế cho từng khách hàng 1 !
bạn hãy soạn sẵn form để điền tất cả KH nhập vào 1 như thế nào để mình có thể dễ hình dung hơn.
---> thiết lập 2 nút: in 1 KH hoặc in tất cả.
 
mình thấy form đó thiết kế cho từng khách hàng 1 !
bạn hãy soạn sẵn form để điền tất cả KH nhập vào 1 như thế nào để mình có thể dễ hình dung hơn.
---> thiết lập 2 nút: in 1 KH hoặc in tất cả.

Form đính kèm nhé bác, có 2 nút In 1 KH và In Tất Cả đối với trường hợp có nhiều khách hàng hơn.
Many Thanks!
 

File đính kèm

Form đính kèm nhé bác, có 2 nút In 1 KH và In Tất Cả đối với trường hợp có nhiều khách hàng hơn.
Many Thanks!

bạn xem lại sheet In Form, nếu bố trí như vậy sẽ gặp lỗi khi 1 KH bất kỳ có nhiều hơn 20 mã hàng ---> sẽ bị ảnh hưởng đến khách hàng bên dưới (vì số liệu khi update nó vào theo chiều dọc)

'- - - -
Có phải bạn muốn in 2 khách hàng trong cùng 1 tờ A4? ---> vào sheet 1 xem cách bố trí như vậy có được ko?

Link: https://www.mediafire.com/?xd4zptz0thozz07
 
Lần chỉnh sửa cuối:
bạn xem lại sheet In Form, nếu bố trí như vậy sẽ gặp lỗi khi 1 KH bất kỳ có nhiều hơn 20 mã hàng ---> sẽ bị ảnh hưởng đến khách hàng bên dưới (vì số liệu khi update nó vào theo chiều dọc)

'- - - -
Có phải bạn muốn in 2 khách hàng trong cùng 1 tờ A4? ---> vào sheet 1 xem cách bố trí như vậy có được ko?


Ah ah đúng rồi bác! , ý mình là vậy, in 02 phiếu trên 1 tờ A4! ^^
Thông thường xuất hàng tối đa khoảng 12-15 món trên 1 phiếu thôi, 20 dòng là trừ hao rồi. Chỉ có khách hàng thì có bữa nhiều đến hơn 20 người nên mình bố trí vậy. Nếu kg mình bố trí 1 phiếu đơn giản bổ dọc xuống cũng được, chịu khó lật mặt kia lại in thôi hà. Vấn đề là sao cho nó tự động lập lại cái form và cả nội dung luôn, chắc mình nghĩ sẽ được pk bác?!
 
Ah ah đúng rồi bác! , ý mình là vậy, in 02 phiếu trên 1 tờ A4! ^^
Thông thường xuất hàng tối đa khoảng 12-15 món trên 1 phiếu thôi, 20 dòng là trừ hao rồi. Chỉ có khách hàng thì có bữa nhiều đến hơn 20 người nên mình bố trí vậy. Nếu kg mình bố trí 1 phiếu đơn giản bổ dọc xuống cũng được, chịu khó lật mặt kia lại in thôi hà. Vấn đề là sao cho nó tự động lập lại cái form và cả nội dung luôn, chắc mình nghĩ sẽ được pk bác?!

bạn xem tiếp file In Form (Test) 4, mình đã cài xong nút in cho tất cả khách hàng. :-=
Nếu kết quả chạy OK, bạn xem lại phần Print Preview của sheet innKH và điều chỉnh cột cho hợp lý.

'- - -
lưu ý:
trong Public Sub GPE_inNphieu()
có đoạn Sheets("innKH").[A5:BG1000].ClearContents, tùy bạn điều chỉnh, vì mình ko biết cái form đó có Footer hay ko, bên in 1 phiếu cũng thế.

Mã:
Public Sub GPE_inNphieu()
Dim ArrData(), dArr(), rng As Range, ArrKH As Range
Dim i As Long, K As Long

Application.ScreenUpdating = False
    Sheets("innKH").[A5:BG1000].ClearContents
    
    Set ArrKH = Range("D3:W3")
    For Each rng In ArrKH
    If rng <> "" Then   'ko co' If -> duyet 4,5,6,7... -> error
    Cot = rng.Column()  '4, 6, 8 ...
        ArrData = Range([B1048576].End(xlUp), [W5]).Value2 'dat trong vong lap
        
        ReDim dArr(1 To UBound(ArrData, 1), 1 To 5)
        
        For i = 1 To UBound(ArrData, 1)
            If ArrData(i, Cot - 1) <> "" Then
                K = K + 1
                            
                dArr(K, 1) = K                   'STT
                dArr(K, 2) = ArrData(i, 1)       'ma~ hang
                dArr(K, 3) = ArrData(i, 2)       'ten hang
                dArr(K, 4) = ArrData(i, Cot - 1) 'Order
                dArr(K, 5) = ArrData(i, Cot)     'Chia
            End If
        Next i
        
        If K Then
            With Sheets("innKH")
            .Cells(3, n + 3) = rng
            .Cells(5, n + 1).Resize(K, 5) = dArr 'Cells(5, n + 1)---> A5(5,1)
            End With
            n = n + 6 '---> G5(5,7), M5(5,13)...
            
            K = 0: Erase ArrData
        End If
    End If
    Next
    
Application.ScreenUpdating = True
MsgBox ("in nhieu phieu xong"), vbInformation
'Sheets("innKH").select
End Sub

Link: https://www.mediafire.com/?y2fc8dkai4mz9de
 
Lần chỉnh sửa cuối:
bạn xem tiếp file In Form (Test) 4, mình đã cài xong nút in cho tất cả khách hàng. :-=
Nếu kết quả chạy OK, bạn xem lại phần Print Preview của sheet innKH và điều chỉnh cột cho hợp lý.

'- - -
lưu ý:
trong Public Sub GPE_inNphieu()
có đoạn Sheets("innKH").[A5:BG1000].ClearContents, tùy bạn điều chỉnh, vì mình ko biết cái form đó có Footer hay ko, bên in 1 phiếu cũng thế.

Mã:
Public Sub GPE_inNphieu()
Dim ArrData(), dArr(), rng As Range, ArrKH As Range
Dim i As Long, K As Long

Application.ScreenUpdating = False
    Sheets("innKH").[A5:BG1000].ClearContents
    
    Set ArrKH = Range("D3:W3")
    For Each rng In ArrKH
    If rng <> "" Then   'ko co' If -> duyet 4,5,6,7... -> error
    Cot = rng.Column()  '4, 6, 8 ...
        ArrData = Range([B1048576].End(xlUp), [W5]).Value2 'dat trong vong lap
        
        ReDim dArr(1 To UBound(ArrData, 1), 1 To 5)
        
        For i = 1 To UBound(ArrData, 1)
            If ArrData(i, Cot - 1) <> "" Then
                K = K + 1
                            
                dArr(K, 1) = K                   'STT
                dArr(K, 2) = ArrData(i, 1)       'ma~ hang
                dArr(K, 3) = ArrData(i, 2)       'ten hang
                dArr(K, 4) = ArrData(i, Cot - 1) 'Order
                dArr(K, 5) = ArrData(i, Cot)     'Chia
            End If
        Next i
        
        If K Then
            With Sheets("innKH")
            .Cells(3, n + 3) = rng
            .Cells(5, n + 1).Resize(K, 5) = dArr 'Cells(5, n + 1)---> A5(5,1)
            End With
            n = n + 6 '---> G5(5,7), M5(5,13)...
            
            K = 0: Erase ArrData
        End If
    End If
    Next
    
Application.ScreenUpdating = True
MsgBox ("in nhieu phieu xong"), vbInformation
'Sheets("innKH").select
End Sub


Thanks bác phucbugis nhiều nhé! 2 ngày nay nghiên cứu điều chỉnh lại cũng OK rồi. Mà bác nè, câu khai báo "ArrData = Range([B1048576].End(xlUp), [W5]).Value2" nghĩa là gì vậy bác, vùng gì mà [B1048576] đọc mãi kg hiểu! Vì nếu điều chỉnh form xíu là nó bị lệch dữ liệu liền.
 
Thanks bác phucbugis nhiều nhé! 2 ngày nay nghiên cứu điều chỉnh lại cũng OK rồi. Mà bác nè, câu khai báo "ArrData = Range([B1048576].End(xlUp), [W5]).Value2" nghĩa là gì vậy bác, vùng gì mà [B1048576] đọc mãi kg hiểu! Vì nếu điều chỉnh form xíu là nó bị lệch dữ liệu liền.

ArrData là biến mảng, còn "ArrData = Range([B1048576].End(xlUp), [W5]).Value2" là thao tác gán giá trị vùng ([B1048576].End(xlUp), [W5]) cho mảng.
 
ArrData là biến mảng, còn "ArrData = Range([B1048576].End(xlUp), [W5]).Value2" là thao tác gán giá trị vùng ([B1048576].End(xlUp), [W5]) cho mảng.

như bác chuot nói vậy đó :-=

ArrData là xác định vùng chứa dữ liệu (từ duới lên trên (cột B) và từ trái qua phải (cột B-> cột W))
để dễ thấy bạn mở file đính kèm và xem cách xác định 1 vùng.

tham khảo thêm tại: Em muốn nhờ các anh các chị giải thích cho em đoạn code VBA này với (#2)

'- - -
đôi lúc bạn sẽ thấy người khác dùng value hoặc value2
bạn tham khảo tại Giới thiệu Cơ bản về vòng lặp For . . . next (#35)

Link: ​https://www.mediafire.com/?cchzce4ulwlyf94
 
Lần chỉnh sửa cuối:
ArrData là biến mảng, còn "ArrData = Range([B1048576].End(xlUp), [W5]).Value2" là thao tác gán giá trị vùng ([B1048576].End(xlUp), [W5]) cho mảng.

Cái biến "[B1048576].End(xlUp)" nghĩa là sao vậy bác? Trong file Data cũ dữ liệu nằm từ B5:W34, nhưng trong file chính dữ liệu của mình thì nó lại nằm từ G5:AV34 thì mình khai báo lại biến này ntn vậy bác?!
 
Cái biến "[B1048576].End(xlUp)" nghĩa là sao vậy bác? Trong file Data cũ dữ liệu nằm từ B5:W34, nhưng trong file chính dữ liệu của mình thì nó lại nằm từ G5:AV34 thì mình khai báo lại biến này ntn vậy bác?!
"[B1048576].End(xlUp)" không phải là cái biến mà là duyệt từ ô cuối cùng của cột B lên trên. Bạn phucbugis đã đưa linh giải thích mà bạn không chịu đọc gì cả.
Bạn có thể khai báo như sau: ArrData=Range("G5:AV34").value2
 
Lần chỉnh sửa cuối:
"[B1048576].End(xlUp)" không phải là cái biến mà là duyệt từ ô cuối cùng của cột B lên trên. Bạn phucbugis đã đưa linh giải thích mà bạn không chịu đọc gì cả.
Bạn có thể khai báo như sau: ArrData=Range("G5:AV34").value2

Oh sorry 2 bác, nhìn qua nhìn lại hồi...choáng nên nhìn sót bài của bác phucbugis!!! ^^ Many Thanks 2 bác!
 
"[B1048576].End(xlUp)" không phải là cái biến mà là duyệt từ ô cuối cùng của cột B lên trên. Bạn phucbugis đã đưa linh giải thích mà bạn không chịu đọc gì cả.
Bạn có thể khai báo như sau: ArrData=Range("G5:AV34").value2

khai báo kiểu này e rằng còn thiếu, nếu số row vượt qua 34 :-=

'- - - -
dùng ArrData = Range([B1048576].End(xlUp), [W5]).Value2
xác định vùng từ B5 đến cột W ([B1048576].End(xlUp) có thể co giãn tùy theo số liệu cột B)

'- - -
nếu như bạn dùng Table cho vùng G5:AV34 thì việc xác định vùng sẽ dễ dàng và luôn chính xác. --=0
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom