Làm sao để cắt file báo cáo sales của nhiều vùng thành những file báo cáo nhỏ mỗivùng (2 người xem)

Liên hệ QC

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

binmanagertl

Thành viên mới
Tham gia
25/10/16
Bài viết
29
Được thích
0
Chào mọi người,

Hiện em có file daily sales là file báo cáo sales của nhiều vùng ở Việt Nam. Em muốn chia nhỏ file báo cáo tổng này thành nhiều file báo cáo nhỏ tương ứng với từng vùng (ví dụ giống như file HCM). Mọi người cho em hỏi là mình có thể làm như vậy với VBA không ạ?

Em cảm ơn mọi người rất nhiều :)
 

File đính kèm

À mình có thắc mắc muốn hỏi bạn là mình đã chạy thành công macro của bạn rồi mà lúc chạy nó chỉ ra 8 files, còn thiếu file của ED East.
 
Upvote 0
À bạn ơi cho mình hỏi là sau khi xuất ra 8 file báo cáo nhỏ theo từng vùng, sheet "Daily sales by SI" không tự động cắt theo từng vùng giống như sheet "Daily sales by SIP" mà nó cũng còn y chang như sheet "daily sales by SI" trong file "daily sales by SI SIP_Oct 2016" hả bạn?

Cảm ơn bạn trước nha :)
 
Upvote 0
À bạn ơi cho mình hỏi là sau khi xuất ra 8 file báo cáo nhỏ theo từng vùng, sheet "Daily sales by SI" không tự động cắt theo từng vùng giống như sheet "Daily sales by SIP" mà nó cũng còn y chang như sheet "daily sales by SI" trong file "daily sales by SI SIP_Oct 2016" hả bạn?

Cảm ơn bạn trước nha :)

Bạn này hồn nhiên, dễ thương ghê cơ! --=0--=0
Bạn đọc kỹ bài #15 chưa? Đọc kỹ rồi thì cứ nêu yêu cầu của bạn thôi.
(Cần kết quả abc, điều kiện cụ tỉ là xyz... kiểu như vậy)
 
Upvote 0
À ý mình là như vậy:

1. Từ file "Daily sales by SIP SI_oct 2016", mình cần tách file đó ra thành 9 file nhỏ tương ứng với từng vùng như sau :

[TABLE="class: cms_table, width: 872"]
[TR]
[TD]MC[/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]HCM_MC[/TD]
[TD]-->[/TD]
[TD]HCM[/TD]
[/TR]
[TR]
[TD]EAST_MC[/TD]
[TD]-->[/TD]
[TD]EAST[/TD]
[/TR]
[TR]
[TD]MEKONG_MC[/TD]
[TD]-->[/TD]
[TD]MEKONG[/TD]
[/TR]
[TR]
[TD]CENTRAL_MC[/TD]
[TD]-->[/TD]
[TD]CENTRAL[/TD]
[/TR]
[TR]
[TD]NORTH_MC[/TD]
[TD]-->[/TD]
[TD]NORTH[/TD]
[/TR]
[TR]
[TD]ED[/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]HCM_ED+ MEKONG_ED[/TD]
[TD]-->[/TD]
[TD]ED SOUTH[/TD]
[/TR]
[TR]
[TD]EAST_ED[/TD]
[TD]-->[/TD]
[TD]ED EAST[/TD]
[/TR]
[TR]
[TD]CENTRAL_ED[/TD]
[TD]-->[/TD]
[TD]ED CENTRAL[/TD]
[/TR]
[TR]
[TD]NORTH_ED[/TD]
[TD]-->[/TD]
[TD]ED NORTH[/TD]
[/TR]
[/TABLE]


Khi chạy macro của bạn thì nó chỉ xuất ra có 8 file excel thôi, còn thiếu mất 1 file của vùng "ED East".

2. Trong 9 file excel nhỏ thì mục sheet "Daily sales by SIP" thì kết quả là đúng như ý mình muốn như 2 file ví dụ HCM và ED South (tức là nó đã tự động tách ra tùy theo những điểm bán hàng của từng vùng). Tuy nhiên, trong sheet "Daily sales by SI", thì mình không hiểu sao là cái sheet đó vẫn y chang như sheet cùng tên trong file ban đầu "Daily sales by SIP SI_Oct 2016", cái mình cần là khi tách ra thành 9 file nhỏ tương ứng với từng vùng thì cái sheet "Daily sales by SI" cũng tự động tách ra tùy theo từng vùng giống như sheet "Daily sales by SIP". Bạn có thể xem kết quả mình mong muốn trong sheet "Daily sales by SI" giống như ví dụ trong 2 file HCM và ED South :)

Hi vọng các lời giải thích của mình đã rõ ràng hơn.

Cảm ơn bạn rất nhiều nha :)
 
Upvote 0
À ý mình là như vậy:

1. Từ file "Daily sales by SIP SI_oct 2016", mình cần tách file đó ra thành 9 file nhỏ tương ứng với từng vùng như sau :

Khi chạy macro của bạn thì nó chỉ xuất ra có 8 file excel thôi, còn thiếu mất 1 file của vùng "ED East".

2. Trong 9 file excel nhỏ thì mục sheet "Daily sales by SIP" thì kết quả là đúng như ý mình muốn như 2 file ví dụ HCM và ED South (tức là nó đã tự động tách ra tùy theo những điểm bán hàng của từng vùng). Tuy nhiên, trong sheet "Daily sales by SI", thì mình không hiểu sao là cái sheet đó vẫn y chang như sheet cùng tên trong file ban đầu "Daily sales by SIP SI_Oct 2016", cái mình cần là khi tách ra thành 9 file nhỏ tương ứng với từng vùng thì cái sheet "Daily sales by SI" cũng tự động tách ra tùy theo từng vùng giống như sheet "Daily sales by SIP". Bạn có thể xem kết quả mình mong muốn trong sheet "Daily sales by SI" giống như ví dụ trong 2 file HCM và ED South :)

Hi vọng các lời giải thích của mình đã rõ ràng hơn.

Cảm ơn bạn rất nhiều nha :)
Ý 1:
"Em" này mới được sinh ra hử? ED EAST
Bạn vui lòng kiểm tra trong file đính kèm ở link bài #10 có ED EAST (cột [Region]) không?
Ý 2:
Bạn tham khảo cách nêu vấn đề với bài #13 đó. Ta chỉ cần nêu: Căn cứ vào vùng được liệt kê ở cột nào đó (???) để tách ra ứng với vùng đó.

Bạn phản hồi lại nhé. Sau bài nữa chắc tôi xách dép chạy.
 
Upvote 0
À sorry bạn mình vừa nhìn thấy. Cái đó là lỗi của người làm cái file "Daily sales by SIP SI_otct 2016", mình vừa mới sửa lại những vùng có "ED East" trong cột 10. Mình vừa mới up file lên lại theo đường link:

https://drive.google.com/drive/folders/0B-zoAPfWVNT9bDRnV29Qa3VnTEU

2. Trong sheet "Daily sales by SI" của file "Daily sales by SI SIP_Oct 2016", mình mới insert 1 cột J "REGION". Mình sẽ dựa vào cột J đó để phân vùng. Khi nào cột J đó có giá trị ="NEW" thì mình sẽ bỏ qua.
 
Upvote 0
À sorry bạn mình vừa nhìn thấy. Cái đó là lỗi của người làm cái file "Daily sales by SIP SI_otct 2016", mình vừa mới sửa lại những vùng có "ED East" trong cột 10. Mình vừa mới up file lên lại theo đường link:

https://drive.google.com/drive/folders/0B-zoAPfWVNT9bDRnV29Qa3VnTEU

2. Trong sheet "Daily sales by SI" của file "Daily sales by SI SIP_Oct 2016", mình mới insert 1 cột J "REGION". Mình sẽ dựa vào cột J đó để phân vùng. Khi nào cột J đó có giá trị ="NEW" thì mình sẽ bỏ qua.

Tôi thấy trong sheet "Daily sales by SI" có cột E [Auto] thể hiện các vùng rồi mà. Sao ta không sử dụng cột đó?
Vấn đề quan trọng:
- Trước khi điền thêm dữ liệu vào cột J (bạn vừa chèn thêm), bạn cần Clear Outline.
Tôi kiểm tra thì cột J vẫn còn trống ở nhiều dòng.
- Nếu dùng cột E ban đầu để phân vùng thì bạn cũng cần bổ sung dữ liệu vì còn nhiều dòng trống? (nếu bị lỗi quên nhập).
 
Upvote 0
À cột auto đó hiện không đúng theo giá trị vùng mà mình muốn. Cột J mà mình thêm vào mình đã chỉnh theo tên vùng mà mình muốn để có thể phân vùng cho chính xác. Mình mới thêm vào những dòng còn trống ở cột J và mình vừa upload lại file trên đường link:

https://drive.google.com/drive/folders/0B-zoAPfWVNT9bDRnV29Qa3VnTEU

Khi nào cột J đó có giá trị ="NEW" thì mình sẽ bỏ qua.

Cảm ơn bạn nhiều nha :)
 
Upvote 0
À cột auto đó hiện không đúng theo giá trị vùng mà mình muốn. Cột J mà mình thêm vào mình đã chỉnh theo tên vùng mà mình muốn để có thể phân vùng cho chính xác. Mình mới thêm vào những dòng còn trống ở cột J và mình vừa upload lại file trên đường link:
https://drive.google.com/drive/folders/0B-zoAPfWVNT9bDRnV29Qa3VnTEU
Khi nào cột J đó có giá trị ="NEW" thì mình sẽ bỏ qua.
Cảm ơn bạn nhiều nha :)
Trước khi chạy code, bạn kiểm tra lại vài chỗ sau.
File Daily Sales by SIP SI_Oct-2016:
- Sheet Daily Sales by SI: Cần kiểm tra dữ liệu tại:
J684:J685
J4908:J4926

- Sheet Sheet Daily Sales by SIP:
J292:J352
K353

=> File HCM/ Sheet Daily Sales by SIP: bị lỗi công thức tại K292...
Mã:
Sub Main()
Dim NF As String: NF = "\$Region"
Dim Thisbook As Workbook: Set Thisbook = ThisWorkbook
Dim dF As String, cF As String, cp As String
Dim lr As Long, tcp(), rng As Range, i As Integer, lr2 As Long
Dim sh As Worksheet, dk(), k As Integer, j As Integer
lr = Sheet2.Cells(Rows.Count, "K").End(xlUp).Row
lr2 = Sheet3.Cells(Rows.Count, "K").End(xlUp).Row
Set rng = Sheet2.Range("J7:J" & lr)
tcp = fRNG(rng)
dF = "CMD /C RD /s /q """ & Thisbook.Path & NF & """"
cF = "CMD /C MD """ & Thisbook.Path & NF & """"
Shell dF, vbHide: Shell cF, vbHide
For i = 0 To UBound(tcp)
cp = "CMD /C COPY """ & Thisbook.FullName & """" & " " & """" & Thisbook.Path & NF & "\" & tcp(i) & Right(Thisbook.Name, 5) & """"
Shell cp, vbHide
Next i
ReDim dk(1 To UBound(tcp) + 2)
dk(UBound(dk) - 1) = "NEW": dk(UBound(dk)) = "="
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For i = 0 To UBound(tcp)
Workbooks.Open Filename:=Thisbook.Path & NF & "\" & tcp(i) & Right(Thisbook.Name, 5)
    For Each sh In ActiveWorkbook.Sheets
        k = 1
        For j = 0 To UBound(tcp)
            If tcp(j) <> tcp(i) Then dk(k) = tcp(j): k = k + 1
        Next j
        If sh.Name = "Daily Sales by SIP" Then
            sh.Range("$A$6:$AZ$" & lr).AutoFilter Field:=10, Criteria1:=dk, Operator:=xlFilterValues
            sh.Rows("7:" & lr).SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
            sh.ShowAllData: ActiveWorkbook.Save
        End If
        If sh.Name = "Daily Sales by SI" Then
            sh.Range("$A$6:$AZ$" & lr2).AutoFilter Field:=10, Criteria1:=dk, Operator:=xlFilterValues
            sh.Rows("7:" & lr2).SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
            sh.ShowAllData: ActiveWorkbook.Save
        End If
    Next sh
Workbooks(tcp(i) & Right(Thisbook.Name, 5)).Close
Next i
Call Shell("explorer.exe" & " " & Thisbook.Path & NF, vbNormalFocus)
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
'-----------
Function fRNG(rng As Range) As Variant
If rng.Columns.Count > 1 Then Exit Function
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dim r As Long, Arr()
On Error Resume Next
Arr = rng.Value
For r = 1 To UBound(Arr, 1)
        If Arr(r, 1) <> "" And Arr(r, 1) <> "NEW" And Not Dic.Exists(Arr(r, 1)) Then
            Dic.Add Arr(r, 1), ""
        End If
Next r
fRNG = Dic.Keys
End Function
 
Upvote 0
Thanks bạn nhiều nha.

Sau khi check lại dữ liệu các vùng mà bạn nói thì code đã chạy bình thường rồi :)
 
Upvote 0
Web KT

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

Back
Top Bottom