Góp ý, thắc mắc về topic "Ứng dụng VBA trong Pivot Table"

Liên hệ QC

khamha

Không có việc gì khó...
Tham gia
4/6/10
Bài viết
662
Được thích
844
Nghề nghiệp
CNVC Laos
Góp ý, thắc mắc trong topic "Ứng dụng VBA trong Pivot Table"

Nhờ bạn ptm0412 tách và hướng dẫn cho lấy đoạn Code số thứ tự để áp dụng vào File của mình với,Cảm ơn bạn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn xem trong Module Common, sẽ thấy Sub STT(Rng As Range), đây là macro có ứng dụng tham số truyền.
Sub đó dùng để đánh số thứ tự

1. Trong file Pivot-VBA-09.xls
Sub đó dùng để đánh số thứ tự đơn giản (1 cấp):

PHP:
Sub SoTT(Rng As Range)
With Rng
    .Resize(200, 1).Clear
    .Value = Evaluate("=row(R:R)")
    .NumberFormat = "00"
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
End With
End Sub

Trong các module khác, sau khi thay đổi cấu trúc, hoặc lọc, hoặc tác động khác đến Pivot table, ta xác định dòng đầu và dòng cuối cần đánh số TT, thí dụ 10 và 25, 10 thì cố định, 25 có thể là giá trị 1 biến.

Ta dùng lệnh sau để gọi Sub STT:

STT Range("A10:A25")

2. Trong file Pivot-VBA-08.xls Sub đó dùng để đánh số thứ tự phức tạp (2 cấp, 1 cấp số la mã và 1 cấp số thường):

PHP:
Sub SoTT(Rng As Range)
With Rng
    .Resize(200, 1).Clear
    For Each Clls In Rng
        With Clls
        If .Offset(0, 1) <> "" Then
            SoCap1 = SoCap1 + 1
            SoCap2 = 0
            .Value = Application.Roman(SoCap1)
            .HorizontalAlignment = xlCenter
            .Resize(1, 8).Font.Bold = True
            .Resize(1, 8).Font.ColorIndex = 10
        Else
            SoCap2 = SoCap2 + 1
            .Value = SoCap2
            .Resize(1, 8).Font.Bold = False
            .Resize(1, 8).Font.ColorIndex = 1
        End If
        End With
    Next
    
    .VerticalAlignment = xlCenter
End With
End Sub

Cách gọi tương tự như trên, truyền tham số Range cần đánh số.
 
Bạn hướng dẫn mình cách tạo lệnh để gọi Sub STT: ,Cảm ơn bạn.
 
Cũng chỉ như tôi nói nãy giờ thôi:
- Xác định dòng đầu cần đánh số TT của Pivot table, thường là cố định là 1 số nào đó không thay đổi, thí dụ 10
- Xác định dòng cuối của Pivot Table bằng End(xlUp).Row vào 1 biến. Phải chọn cột có dữ liệu Pivot table đầy đủ nhất, thường là cột đầu tiên có chứa Grand Total(cột b)
- Gọi Sub STT với tham số truyền.

Thí dụ:

PHP:
BeginR = 10
EndR = [B10000].End(xlUp).Row
' Đánhsố TT cột A'
STT Range("A" & BeginR & ":A" & EndR - 1)

EndR - 1 vì ta không muốn đánh số cả dòng GrandTotal, nếu không có Grand Total thì không trừ.
 
Lần chỉnh sửa cuối:
Chắc là do trình độ mình có hạn về phần này,đọc hướng dẫn của bạn mà làm trả được,mà hỏi nhiều thì lại
ngại quá.nên quyết định đưa file nên nhờ bạn làm giúp (vì nếu làm riêng phần này chắc rễ hiểu)
bạn cố gắng giúp mình nhé,Cảm ơn bạn.
 

File đính kèm

  • Pivot_STT.7z
    6.3 KB · Đọc: 75
Chắc là do trình độ mình có hạn về phần này,đọc hướng dẫn của bạn mà làm trả được,mà hỏi nhiều thì lại
ngại quá.nên quyết định đưa file nên nhờ bạn làm giúp (vì nếu làm riêng phần này chắc rễ hiểu)
bạn cố gắng giúp mình nhé,Cảm ơn bạn.

Chào bạn khamha !
Đọc file bạn gửi thấy nội dụng của bạn hỏi không đúng với nội dung của ptm0412 đã viết. Những nội dung mà ptm0412 viết gồm 2 phần chính:
1- PivotTable (công cụ của excel để tổng hợp và phân tích số liệu)
2-Ứng dụng VBA vào pivotTable để lọc dữ liệu, để đánh số thứ tự(STT)
Nếu bạn chưa sử dụng công cụ pivotTable thì sẽ khó hiểu với ví dụ của ptm0412. Bạn nên nghiên cứu để ứng dụng công cụ pivotTable, đây là công cụ mạnh của excel cho việc tổng hợp và tạo ra các báo cáo rất nhanh(chỉ bằng động tác kéo thả chuột).
Việc đánh STT trên diễn đàn đã có nhiều bài viết. Trong ví dụ của ptm0412 dùng VBA để đánh số thứ tự cho cột nằm ngoài bảng pivotTable. Nếu bạn tạo được pivotTable thì ứng dụng đánh STT bằng VBA như của ptm0412 sẽ dễ hiểu hơn.
Vài điều muốn chia sẻ thêm với bạn. Thân ái !
 
Xin lỗi, tôi không coi kỹ.
Tặng bạn code kẻ khung cột A luôn.
Ngoài ra, sau khi nhập liệu sheet 1, khi select sheet3, pivot tự cập nhật, với điều kiện dùng name động hoặc data source dư.
 

File đính kèm

  • Pivot_STT.xls
    43.5 KB · Đọc: 150
Lần chỉnh sửa cuối:
Cảm ơn bạn đã giúp,bạn cho hỏi là nếu ô bắt đầu để điền số thứ tự là 9 thì phải sửa lại Code như thế nào ( bạn thông cảm,vì mình áp dụng
cái này vào nhiều File nên ô bắt đầu để điền số thứ tự có thay đổi ) mình cũng tự sửa rồi nhưng không được,nó bị lỗi như sau:
1, cái kẻ dòng báo lỗi phải tắt.
2, điền số thứ tự bị vượt qua phần Tổng 02 dòng.
Cảm ơn bạn nhiều.

3.Còn cái này nữa bạn,cái kẻ bảng bạn dùng là dấu ... chứ không phải _________nếu là ô ở trong thì OK nhưng đây lại là ở ngoài rìa nên
không được đẹp,bạn hướng dẫn mình cách sửa với,cám ơn.
 
Chỉnh sửa lần cuối bởi điều hành viên:
1 & 2: Bắt đầu dòng nào:

Đã nói bạn rằng:
- Xác định dòng đầu cần đánh số TT của Pivot table, thường là cố định là 1 số nào đó không thay đổi, thí dụ 10
PHP:
BeginR = 10
Vậy, bắt đầu đánh số từ dòng bao nhiêu, BeginR bằng bấy nhiêu.

3: Kẻ dòng Dot hay Continuous:

Do bạn dùng 2003 nên không thấy hiệu quả của style. Trong file trên tôi đã dùng style kẻ Borders cho Pivot Table bằng đường Dot giống như cột A.

Vậy tôi sửa lại để dùng trong 2003, nhưng vẫn là đường Dot ngang toàn bộ các cột. Riêng dòng Tổng cộng, Border riêng bằng continuous.

PHP:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
BeginR = 9                       'Sửa dòng bắt đầu ở dòng lệnh này'
EndR = [b200].End(xlUp).Row
SoTT Range("A" & BeginR & ":A" & EndR - 1)
DrawBorder Range("A" & BeginR & ":D" & EndR - 1)  'Nếu cột cuối không phải D thì sửa ở đây'
DrawBorder Range("A" & EndR & ":D" & EndR)         'Và đây'

End Sub
Note:
Field đơn giá đưa vào Pivot sẽ bị tính Sum, không có ý nghĩa. Tính Average cũng sai
 

File đính kèm

  • Pivot_STT.xls
    44.5 KB · Đọc: 59
Lần chỉnh sửa cuối:
Chào bạn ptm0412,bạn cho hỏi là nếu có hai Pivot nằm trong một Sheet thì phải sửa cái Code như
thế nào để nó Refresh cả hai.
Mã:
Private Sub Worksheet_Activate()
Me.PivotTables(2).PivotCache.Refresh
End Sub
 
Bạn sửa như sau thì có bao nhiêu nó cập nhật tất

Mã:
Private Sub Capnhat()
Dim Pv As PivotTable
For Each Pv In Sheet1.PivotTables
Pv.PivotCache.Refresh
Next
End Sub
 
mình làm theo cách của bạn SeaLand nhưng không được,nó không hoạt động gì cả,bạn xem lại cho
mình với,Cảm ơn bạn.
 
Chà,Chắc bạn Sealand thử mình đây,mình sửa lại như thế này thì nó chạy được,Cảm ơn bạn.
Mã:
Private Sub Worksheet_Activate()
Dim Pv As PivotTable
For Each Pv In Sheet2.PivotTables
Pv.PivotCache.Refresh
Next
End Sub
 
Tôi e rằng dữ liệu của bạn không có thay đổi, nên refresh không thấy thay đổi. Hoặc code là sheet1 nhưng pivot của bạn nằm trên sheet khác?
Chứ code sealand là OK.

Cũng có cách khác:

PHP:
Private Sub Worksheet_Activate()
With Me
For i = 1 to .PivotTables.Count
 .PivotTables(i).PivotCache.Refresh
Next
End With
End Sub
 
Lần chỉnh sửa cuối:
Vấn đề dùng VBA chuyển dữ liệu từ Pivot Table

Tôi có một File có 3 sheet, 1 sheet chứa CSDL, sheet 2 chứa bảng phương án, sheet 3 chứa Pivot Table (nguồn từ CSDL).

Sau khi Pivot phân tích, tôi muốn nhập dữ liệu vào bảng phương án, nhưng không biết viết CODE như thế nào để được kết quả như sheet Kết quả phương án.

Xin vui lòng xem File và hướng dẫn.

Cám ơn rất nhiều!
 

File đính kèm

  • HocPivot.rar
    19.1 KB · Đọc: 44
Mình thử làm bằng công thức thì cũng ra kết quả giống sheet ketquaphuongan, từ đó mình bạn muốn đưa code vào thì cũng dễ mà với trình độ của bạn mình nghĩ bạn dư sức làm mà. Đâu bạn xem file mình làm bằng công thức xem đúng ý bạn không hen
 

File đính kèm

  • HocPivot1.rar
    20.1 KB · Đọc: 59
Mình thử làm bằng công thức thì cũng ra kết quả giống sheet ketquaphuongan, từ đó mình bạn muốn đưa code vào thì cũng dễ mà với trình độ của bạn mình nghĩ bạn dư sức làm mà. Đâu bạn xem file mình làm bằng công thức xem đúng ý bạn không hen

Cám ơn bạn đã quan tâm, tuy nhiên không hẳn là vậy đâu bạn, mình muốn truy vấn theo ID chứ không phải tham chiếu đến địa chỉ từng cell trong Pivot.
 
Dùng hàm GetPivotTable đi, thêm cái bẫy lỗi là OK. Dù dữ liệu có thay đổi, Pivot table thêm bớt gì, thì cũng cập nhật.
Khỏi cần VBA.

Nếu xài VBA thì thà lấy ngay sheet Pivot dấu dòng, định dạng thành ra report ngon lành. Có topic về vấn đề này.
 
Cám ơn bạn đã quan tâm, tuy nhiên không hẳn là vậy đâu bạn, mình muốn truy vấn theo ID chứ không phải tham chiếu đến địa chỉ từng cell trong Pivot.

Mình thấy cũng hơi lạ, mình làm thử file này không biết có giống ý bạn không nữa hen, mình cũng đang học Pivot của Thầy Mỹ hay tuyệt
 

File đính kèm

  • HocPivot_1.rar
    26.1 KB · Đọc: 52
Gởi nmhung,
Code của nmhung hình như dư 1 đoạn cuối từ For Each Rng2 trở về sau?

Tôi xin giới thiệu cách dùng hàm GetPivotTable:

- Đứng tại cells E8 sheet PAn, đánh dấu =, click chọn sheet Pivot, chọn ô D3 của sheet Pivot ta có:

=GETPIVOTDATA("S.LƯỢNG GT";PIVOTTABLE!$A$1;"MÃ CHỦ HÀNG";"02_TT66_230411_Z11";"CHỦ HÀNG";"HÀNG %";"PHƯƠNG ÁN";"Cần tàu/ ĐB/ xe Cty/ NK")

(Sao mà ghét tên sheet dài và tên field dữ liệu dài đến thế)

- Để nguyên công thức như vậy thì không sao chép đi được, chép đến đâu cũng chỉ 1 số.

- Hàm Get Pivot Table, cho phép tham chiếu đến các ô cho tất cả các đối số của hàm, trừ tên field đang được tính toán (tham số đầu tiên)

Nghĩa là ta có thể sửa thành:

=GETPIVOTDATA("S.LƯỢNG GT";PIVOTTABLE!$A$1;$A$5;$A8;$B$5;$B8;$R$5;$R8)

Công thức này đã có thể fill xuống.

- Cột F cũng làm tương tự, hoặc chép từ cột E qua và thay tên field cho tham số đầu tiên.

- Vấn đề còn lại là 3 cột A, B, và R. Chỉ cần dùng công thức = như ngmhung bài số #2, với 1 tí xảo thuật.
 

File đính kèm

  • DayPivot.rar
    16.9 KB · Đọc: 81
Web KT
Back
Top Bottom