Pivotable - VBA - Xuất dữ liệu ra báo cáo

Liên hệ QC

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
346
Được thích
40
Dear Anh Chị và Các bạn,
Em có File kèm theo. Mục đích của em là tạo báo cáo từ Pivot và báo cáo này định dạng luôn được thành báo cáo có thể in ấn và Xuất ra Word để in. Em có được code của diễn dàn trợ giúp với việc Bảng biểu sẽ được in dạng Picture nhưng có cái khó là:
(1): Địa chỉ của bảng được cổ định (Là mảng rangestr = Array("B2:E12"), nhưng khi Pivot thì mảng dũ liệu sẽ thay đổi (Lấy B2 là điểm cố định, còn Cột E sẽ biến động) khi chọn tiêu chí bằng Slicer => Tạo vùng ô sao đây để Array là một vùng động tùy theo Pivot
(2) Em muốn in cả biểu đồ được vẽ ra từ dữ liệu của Pivot thì thêm mã Code ra sao ạ.
(3) Em muôn kẻ ô, sao cho đẹp với vùng dữ liệu tùy theo độ dài, rộng của vùng dữ liệu ạ.

Nhờ các Anh chị trợ giúp ạ. Em cảm ơn mọi người.
 

File đính kèm

Lần chỉnh sửa cuối:
Dear Anh Chị và Các bạn,
Em có File kèm theo. Mục đích của em là tạo báo cáo từ Pivot và báo cáo này định dạng luôn được thành báo cáo có thể in ấn và Xuất ra Word để in. Em có được code của diễn dàn trợ giúp với việc Bảng biểu sẽ được in dạng Picture nhưng có cái khó là:
(1): Địa chỉ của bảng được cổ định (Là mảng rangestr = Array("B2:E12"), nhưng khi Pivot thì mảng dũ liệu sẽ thay đổi (Lấy B2 là điểm cố định, còn Cột E sẽ biến động) khi chọn tiêu chí bằng Slicer => Tạo vùng ô sao đây để Array là một vùng động tùy theo Pivot
(2) Em muốn in cả biểu đồ được vẽ ra từ dữ liệu của Pivot thì thêm mã Code ra sao ạ.
(3) Em muôn kẻ ô, sao cho đẹp với vùng dữ liệu tùy theo độ dài, rộng của vùng dữ liệu ạ.

Nhờ các Anh chị trợ giúp ạ. Em cảm ơn mọi người.
Bạn thử như vậy xem được không?

Mã:
Sub Export_to_Word()
Const wdTableFormatApplyAutoFit = 16
Const wdFormatPlainText = 22
Const wdInLine = 0
Const wdPasteEnhancedMetafile = 9


'Khai báo các bi?n
Dim wdapp As Object, wddoc As Object, workrng As Range, tablerng As Range
Dim k As Long, currRow As Long, lastRow As Long, rangestr, Lr As Long

Lr = Sheet1.Range("B" & Rows.Count).End(3).Row
    rangestr = Array("B2:E" & Lr, "A1:F60")
    ' Table 1, table2, all area
    
    
    Set wdapp = CreateObject("Word.Application")
    wdapp.Visible = True
    Set wddoc = wdapp.Documents.Add
    
    
    With wdapp.Selection
    .Font.Name = "Times New Roman"
    .Font.Size = 12
End With


    
    Set workrng = Sheet1.Range(rangestr(UBound(rangestr)))
    currRow = workrng.Row
    For k = 0 To UBound(rangestr)
        With Sheet1.Range(rangestr(k))
            If k < UBound(rangestr) Then
                lastRow = .Row - 1
            Else
                lastRow = .Row + .Rows.Count - 1
            End If
        End With
        If currRow <= lastRow Then
            Sheet1.Cells(currRow, workrng.Column).Resize(lastRow - currRow + 1, workrng.Columns.Count).Copy
            With wdapp.Selection
                .PasteAndFormat (wdFormatPlainText)
                .TypeParagraph
            End With
        End If
        If k < UBound(rangestr) Then
            With Sheet1.Range(rangestr(k))
                .Copy
                With wdapp.Selection
                    .PasteSpecial 0, , wdInLine, , wdPasteEnhancedMetafile
                    
                    .TypeParagraph
                End With
                currRow = .Row + .Rows.Count
            End With
        End If
    Next k
'Làm tr?ng các bi?n d? gi?i phóng b? nh?
    Set wddoc = Nothing
    Set wdapp = Nothing
    Application.CutCopyMode = False
'Thông báo hoàn thành
    MsgBox "Xem báo cáo WORD !"
End Sub
 
Upvote 0
Bạn thử như vậy xem được không?

Mã:
Sub Export_to_Word()
Const wdTableFormatApplyAutoFit = 16
Const wdFormatPlainText = 22
Const wdInLine = 0
Const wdPasteEnhancedMetafile = 9


'Khai báo các bi?n
Dim wdapp As Object, wddoc As Object, workrng As Range, tablerng As Range
Dim k As Long, currRow As Long, lastRow As Long, rangestr, Lr As Long

Lr = Sheet1.Range("B" & Rows.Count).End(3).Row
    rangestr = Array("B2:E" & Lr, "A1:F60")
    ' Table 1, table2, all area


    Set wdapp = CreateObject("Word.Application")
    wdapp.Visible = True
    Set wddoc = wdapp.Documents.Add


    With wdapp.Selection
    .Font.Name = "Times New Roman"
    .Font.Size = 12
End With



    Set workrng = Sheet1.Range(rangestr(UBound(rangestr)))
    currRow = workrng.Row
    For k = 0 To UBound(rangestr)
        With Sheet1.Range(rangestr(k))
            If k < UBound(rangestr) Then
                lastRow = .Row - 1
            Else
                lastRow = .Row + .Rows.Count - 1
            End If
        End With
        If currRow <= lastRow Then
            Sheet1.Cells(currRow, workrng.Column).Resize(lastRow - currRow + 1, workrng.Columns.Count).Copy
            With wdapp.Selection
                .PasteAndFormat (wdFormatPlainText)
                .TypeParagraph
            End With
        End If
        If k < UBound(rangestr) Then
            With Sheet1.Range(rangestr(k))
                .Copy
                With wdapp.Selection
                    .PasteSpecial 0, , wdInLine, , wdPasteEnhancedMetafile
                
                    .TypeParagraph
                End With
                currRow = .Row + .Rows.Count
            End With
        End If
    Next k
'Làm tr?ng các bi?n d? gi?i phóng b? nh?
    Set wddoc = Nothing
    Set wdapp = Nothing
    Application.CutCopyMode = False
'Thông báo hoàn thành
    MsgBox "Xem báo cáo WORD !"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử như vậy xem được không?

Mã:
Sub Export_to_Word()
Const wdTableFormatApplyAutoFit = 16
Const wdFormatPlainText = 22
Const wdInLine = 0
Const wdPasteEnhancedMetafile = 9


'Khai báo các bi?n
Dim wdapp As Object, wddoc As Object, workrng As Range, tablerng As Range
Dim k As Long, currRow As Long, lastRow As Long, rangestr, Lr As Long

Lr = Sheet1.Range("B" & Rows.Count).End(3).Row
    rangestr = Array("B2:E" & Lr, "A1:F60")
    ' Table 1, table2, all area


    Set wdapp = CreateObject("Word.Application")
    wdapp.Visible = True
    Set wddoc = wdapp.Documents.Add


    With wdapp.Selection
    .Font.Name = "Times New Roman"
    .Font.Size = 12
End With



    Set workrng = Sheet1.Range(rangestr(UBound(rangestr)))
    currRow = workrng.Row
    For k = 0 To UBound(rangestr)
        With Sheet1.Range(rangestr(k))
            If k < UBound(rangestr) Then
                lastRow = .Row - 1
            Else
                lastRow = .Row + .Rows.Count - 1
            End If
        End With
        If currRow <= lastRow Then
            Sheet1.Cells(currRow, workrng.Column).Resize(lastRow - currRow + 1, workrng.Columns.Count).Copy
            With wdapp.Selection
                .PasteAndFormat (wdFormatPlainText)
                .TypeParagraph
            End With
        End If
        If k < UBound(rangestr) Then
            With Sheet1.Range(rangestr(k))
                .Copy
                With wdapp.Selection
                    .PasteSpecial 0, , wdInLine, , wdPasteEnhancedMetafile
              
                    .TypeParagraph
                End With
                currRow = .Row + .Rows.Count
            End With
        End If
    Next k
'Làm tr?ng các bi?n d? gi?i phóng b? nh?
    Set wddoc = Nothing
    Set wdapp = Nothing
    Application.CutCopyMode = False
'Thông báo hoàn thành
    MsgBox "Xem báo cáo WORD !"
End Sub

Bạn thử như vậy xem được không?

Mã:
Sub Export_to_Word()
Const wdTableFormatApplyAutoFit = 16
Const wdFormatPlainText = 22
Const wdInLine = 0
Const wdPasteEnhancedMetafile = 9


'Khai báo các bi?n
Dim wdapp As Object, wddoc As Object, workrng As Range, tablerng As Range
Dim k As Long, currRow As Long, lastRow As Long, rangestr, Lr As Long

Lr = Sheet1.Range("B" & Rows.Count).End(3).Row
    rangestr = Array("B2:E" & Lr, "A1:F60")
    ' Table 1, table2, all area


    Set wdapp = CreateObject("Word.Application")
    wdapp.Visible = True
    Set wddoc = wdapp.Documents.Add


    With wdapp.Selection
    .Font.Name = "Times New Roman"
    .Font.Size = 12
End With



    Set workrng = Sheet1.Range(rangestr(UBound(rangestr)))
    currRow = workrng.Row
    For k = 0 To UBound(rangestr)
        With Sheet1.Range(rangestr(k))
            If k < UBound(rangestr) Then
                lastRow = .Row - 1
            Else
                lastRow = .Row + .Rows.Count - 1
            End If
        End With
        If currRow <= lastRow Then
            Sheet1.Cells(currRow, workrng.Column).Resize(lastRow - currRow + 1, workrng.Columns.Count).Copy
            With wdapp.Selection
                .PasteAndFormat (wdFormatPlainText)
                .TypeParagraph
            End With
        End If
        If k < UBound(rangestr) Then
            With Sheet1.Range(rangestr(k))
                .Copy
                With wdapp.Selection
                    .PasteSpecial 0, , wdInLine, , wdPasteEnhancedMetafile
               
                    .TypeParagraph
                End With
                currRow = .Row + .Rows.Count
            End With
        End If
    Next k
'Làm tr?ng các bi?n d? gi?i phóng b? nh?
    Set wddoc = Nothing
    Set wdapp = Nothing
    Application.CutCopyMode = False
'Thông báo hoàn thành
    MsgBox "Xem báo cáo WORD !"
End Sub

Dear Anh,

Em chạy Code thì được yêu cầu 1 rồi ạ. Còn yêu cầu (2) là In được cả Biểu đồ của bảng Pivot và (3) tô nền cho số liệu xuất ra Excel khi Slicer thay đổi ạ chưa làm được ạ: Tuy nhiên thực tế khi tạo số bảng báo cáo này thì em phải làm như sau:
+ Sẽ có nối tiếp các bảng Pivot khác nữa như ở B31 chẳng hạn thì sẽ không được với Code hiện tại ạ. Vì em đọc Code em hiểu láng máng rằng anh đang đếm từ dưới lên trên tại cột B nếu có Ký tự thì sẽ co giãn....Nhưng thực tế sẽ có nhiều ký tự khác vào cột B này tiếp theo của Pivot1. Em đang nghĩ mỗi một Pivot ở shees Pivot đều có tên như Pivot1, Pivot3.....mình có nên tạo Code gắn với từng Pivot thì sẽ làm được dù có thêm 10 Pivot nữa thì mình chỉ cần đặt thêm 10 biến gắn với tên từng Pivot ạ...(Em không rõ đâu vì em chỉ tham khảo Code) - Tất cả các PiVot đều bắt đầu từ Cột B ạ.
+ Vụ in Biểu đồ em cũng nghĩ thế vì mỗi Biểu đồ đều có tên và gắn với một vùng số liệu cố định mình có thế gắn với tên nó vào để áp được cho nhiều trường hợp. Nếu khó quá cái này em có ngu ý, hay yêu cầu 1 là thế mình dự phòng thêm một khoảng trống cố định bằng Dòng cuối cùng của Pivot1 + NRow nào đó để cho cái biểu đồ nó nằm trong đó thì khi xuất ra WORD nó xuất bảng và biểu đồ vào 1 Picture ạ.
+ Vụ kẻ bảng cho từng dữ liệu của Pivot trường hợp nhiều Pivot chắc cũng khó ạ ????


Trên diễn đàn em có đọc được bài này của một anh viết về Pivot và VBA nhưng em không hiểu vì không có gốc VBA ạ.
https://www.giaiphapexcel.com/diendan/threads/Áp-dụng-vba-vào-pivot-table-để-lập-báo-cáo-theo-mẫu.47222/
 

File đính kèm

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

Em chạy Code thì được yêu cầu 1 rồi ạ. Còn yêu cầu (2) là In được cả Biểu đồ của bảng Pivot và (3) tô nền cho số liệu xuất ra Excel khi Slicer thay đổi ạ chưa làm được ạ: Tuy nhiên thực tế khi tạo số bảng báo cáo này thì em phải làm như sau:
+ Sẽ có nối tiếp các bảng Pivot khác nữa như ở B31 chẳng hạn thì sẽ không được với Code hiện tại ạ. Vì em đọc Code em hiểu láng máng rằng anh đang đếm từ dưới lên trên tại cột B nếu có Ký tự thì sẽ co giãn....Nhưng thực tế sẽ có nhiều ký tự khác vào cột B này tiếp theo của Pivot1. Em đang nghĩ mỗi một Pivot ở shees Pivot đều có tên như Pivot1, Pivot3.....mình có nên tạo Code gắn với từng Pivot thì sẽ làm được dù có thêm 10 Pivot nữa thì mình chỉ cần đặt thêm 10 biến gắn với tên từng Pivot ạ...(Em không rõ đâu vì em chỉ tham khảo Code) - Tất cả các PiVot đều bắt đầu từ Cột B ạ.
+ Vụ in Biểu đồ em cũng nghĩ thế vì mỗi Biểu đồ đều có tên và gắn với một vùng số liệu cố định mình có thế gắn với tên nó vào để áp được cho nhiều trường hợp. Nếu khó quá cái này em có ngu ý, hay yêu cầu 1 là thế mình dự phòng thêm một khoảng trống cố định bằng Dòng cuối cùng của Pivot1 + NRow nào đó để cho cái biểu đồ nó nằm trong đó thì khi xuất ra WORD nó xuất bảng và biểu đồ vào 1 Picture ạ.
+ Vụ kẻ bảng cho từng dữ liệu của Pivot trường hợp nhiều Pivot chắc cũng khó ạ ????


Trên diễn đàn em có đọc được bài này của một anh viết về Pivot và VBA nhưng em không hiểu vì không có gốc VBA ạ.
https://www.giaiphapexcel.com/diendan/threads/Áp-dụng-vba-vào-pivot-table-để-lập-báo-cáo-theo-mẫu.47222/
Dùng pivot mà bố trí dữ liệu như vậy ví dụ bảng pivot 1 dữ liệu trên 100 dòng thì sao?không khả thi
 
Upvote 0
Dùng pivot mà bố trí dữ liệu như vậy ví dụ bảng pivot 1 dữ liệu trên 100 dòng thì sao?không khả thi
Dạ, thực tế số liệu của em mỗi Pivot có độ dài tối đa khoảng 20 dòng thôi ạ (Độ cao tối đa khoảng 20 dòng thôi ạ). Nhưng sẽ có khoảng 10 Pivot ạ!
 
Upvote 0
Dạ, thực tế số liệu của em mỗi Pivot có độ dài tối đa khoảng 20 dòng thôi ạ (Độ cao tối đa khoảng 20 dòng thôi ạ). Nhưng sẽ có khoảng 10 Pivot ạ!
Nên có số liệu bảng mẫu có đầy đủ biểu đồ chứ lúc này lúc kia là xỉu xỉu luôn. kaka
 
Upvote 0

File đính kèm

Upvote 0
Nên có số liệu bảng mẫu có đầy đủ biểu đồ chứ lúc này lúc kia là xỉu xỉu luôn. kaka
ANh ơi, nếu được chủ yếu giúp em yêu cầu 1 anh ạ. Để làm sao các bảng khi xuất ra WORD nó bao gồm được bảng đó ra Picture ạ.
Máy tính đang cài lại win để cài xong sẽ tìm giải pháp cho bạn
Anh quá Nhiệt tình ạ ! Cảm ơn a nhiều lắm ạ.
 
Upvote 0
Dạ vâng ạ,
Số liệu và mẫu biểu đây ạ. ANh xem giúp em ạ.
Mình cũng thử lấy hình thì được nhưng không mở rộng trang tính, bạn đợi anh chị đi ngang hỗ trợ thêm nhé
Lưu ý: để chạy code bạn làm theo hướng dẫn như hình:
vào cửa sổ VBA vào tools chọn References
216190

tìm chọn microsoft word 16.0 ( tùy phiên bản) object library - ok

216191

Mã:
Sub EXCEL_TO_WORD()
Range([A2], [A1000].End(3)).Resize(, 10).Copy
With CreateObject("Word.Application")
   .Visible = True
   .Documents.Add
   .Selection.PageSetup.Orientation = wdOrientLandscape
   .Selection.Font.Name = "Times New Roman"
   .Selection.Font.Size = 12
   .Selection.PasteSpecial 0, , wdInLine, , wdPasteEnhancedMetafile
   .Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End With
Application.CutCopyMode = False
End Sub
 

File đính kèm

Upvote 0
Mình cũng thử lấy hình thì được nhưng không mở rộng trang tính, bạn đợi anh chị đi ngang hỗ trợ thêm nhé
Lưu ý: để chạy code bạn làm theo hướng dẫn như hình:
vào cửa sổ VBA vào tools chọn References
View attachment 216190

tìm chọn microsoft word 16.0 ( tùy phiên bản) object library - ok

View attachment 216191

Mã:
Sub EXCEL_TO_WORD()
Range([A2], [A1000].End(3)).Resize(, 10).Copy
With CreateObject("Word.Application")
   .Visible = True
   .Documents.Add
   .Selection.PageSetup.Orientation = wdOrientLandscape
   .Selection.Font.Name = "Times New Roman"
   .Selection.Font.Size = 12
   .Selection.PasteSpecial 0, , wdInLine, , wdPasteEnhancedMetafile
   .Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End With
Application.CutCopyMode = False
End Sub
Code này chạy nó ra ảnh hết rồi anh ạ - Thế thì không gõ gì được trên báo cáo WORd được ạ. Chỉ tiếc cái code kia em thấy nó hay. Kiểu mình sẽ viết Code gắn với tên các Pivot...có 10 Pivot đặt 10 mảng với tên của nó....em nghĩ là thế đó nhưng không biết làm. Có Anh chị nào đi qua phát triển tiếp giúp em với ạ.hehe. Em cảm ơn anh LamNA đã dành cả thời gian của ngày ngủ đê hỗ trợ em ạ !!!
 
Lần chỉnh sửa cuối:
Upvote 0
Code này chạy nó ra ảnh hết rồi anh ạ - Thế thì không gõ gì được trên báo cáo WORd được ạ. Chỉ tiếc cái code kia em thấy nó hay. Kiểu mình sẽ viết Code gắn với tên các Pivot...có 10 Pivot đặt 10 mảng với tên của nó....em nghĩ là thế đó nhưng không biết làm. Có Anh chị nào đi qua phát triển tiếp giúp em với ạ.hehe. Em cảm ơn anh LamNA đã dành cả thời gian của ngày ngủ đê hỗ trợ em ạ !!!
Ủa cuối cùng muốn file ảnh hay bảng dữ liệu
 
Upvote 0
Ủa cuối cùng muốn file ảnh hay bảng dữ liệu
Ủa cuối cùng muốn file ảnh hay bảng dữ liệu
HUHU. A em mình không hiểu nhau rùi. Em muốn xuất từ EXCEL ra WORD trong đó (Các Bảng biểu thì cho ra File ảnh, Chữ thì vẫn là chữ bình thường ạ). Cái code em đưa lên đã làm được điều đó rồi ạ, nhưng cho một bảng cố định nhưng khi Slice thì nó thay đổi theo do đó vùng bảng sẽ phải thay đổi. Nên em mới hỏi anh là làm Vùng động cho bảng tính đưa ra ạ. Còn các chữa khác ngoài biểu em viết thì vẫn xuất ra dạng bình thường không phải dạng ảnh ạ. Ảnh chỉ xuất với bảng tính ạ. trước COde này a đã làm được điều đó nhưng với SHeet chỉ có một Pivot, nhưng nếu có nhiều PIVOT thì sai vì nó xuất toàn bộ là dạng File ảnh ạ. CHắc anh em mình chưa hiểu ý nhau ạ. :))))
 
Upvote 0
HUHU. A em mình không hiểu nhau rùi. Em muốn xuất từ EXCEL ra WORD trong đó (Các Bảng biểu thì cho ra File ảnh, Chữ thì vẫn là chữ bình thường ạ). Cái code em đưa lên đã làm được điều đó rồi ạ, nhưng cho một bảng cố định nhưng khi Slice thì nó thay đổi theo do đó vùng bảng sẽ phải thay đổi. Nên em mới hỏi anh là làm Vùng động cho bảng tính đưa ra ạ. Còn các chữa khác ngoài biểu em viết thì vẫn xuất ra dạng bình thường không phải dạng ảnh ạ. Ảnh chỉ xuất với bảng tính ạ. trước COde này a đã làm được điều đó nhưng với SHeet chỉ có một Pivot, nhưng nếu có nhiều PIVOT thì sai vì nó xuất toàn bộ là dạng File ảnh ạ. CHắc anh em mình chưa hiểu ý nhau ạ. :))))
Nếu vậy thì khuyên copy bằng thủ công đi
- phần table thỉ copy bình thường
- phần biểu đồ thì copy hình như hình
216198

rồi dán qua word
 
Upvote 0
Web KT

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

Back
Top Bottom