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 (1 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

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 :)

Chào binmanagertl,

Bạn có biết tại sao topic này: Chia file tổng thành nhiều file
lại không có ai giúp bạn tuy có nhiều lượt vào xem bài.
Bạn cần diễn đạt làm sao người khác hiểu vấn đề của bạn, mong muốn của bạn thì mới giúp bạn được.
File "daily_sales" của bạn chỉ có 4 Region: Vậy chỉ cần copy file đó ra 4 file mới rồi filter/ xóa là được. Còn nhanh hơn ngồi viết vba.
p/s: Sheet "Daily Sales by SI" của file "HCM" được tạo nên như nào từ file "daily_sales"?
 
Upvote 0
Bạn vào Access, load file lên và dùng query lọc ra từng vùng. Cứ mỗi vùng thì save lại thành 1 csv.
Sau đó load csv trở lại Excel.
Đây là quy trình căn bản của dân làm việc với dữ liệu.
 
Upvote 0
Chào bạn befaint,

Để ra được sheet "Daily sales by SI" của file "HCM", thì trong file "daily_sales", mình chỉ delete tất cả các dữ liệu của các vùng còn lại. Làm tới vùng nào thì mình chỉ giữ lại dữ liệu sales của vùng đó và xóa các vùng còn lại. Mình cũng thấy như vậy là cũng nhanh nhưng mà người quản lý mình hỏi mình là có cách nào viết bằng VBA mà nhanh hơn cách này không. Mình cũng không giỏi về VBA lắm cho nên mình muốn hỏi mọi người xem sao... Nhưng mà bản thân mình cũng thấy là làm vùng nào giữ lại dữ liệu sales của vùng đó và xóa dữ liệu các vùng còn lại cũng là rất nhanh rồi....
 
Upvote 0
Chào bạn befaint,

Để ra được sheet "Daily sales by SI" của file "HCM", thì trong file "daily_sales", mình chỉ delete tất cả các dữ liệu của các vùng còn lại. Làm tới vùng nào thì mình chỉ giữ lại dữ liệu sales của vùng đó và xóa các vùng còn lại. Mình cũng thấy như vậy là cũng nhanh nhưng mà người quản lý mình hỏi mình là có cách nào viết bằng VBA mà nhanh hơn cách này không. Mình cũng không giỏi về VBA lắm cho nên mình muốn hỏi mọi người xem sao... Nhưng mà bản thân mình cũng thấy là làm vùng nào giữ lại dữ liệu sales của vùng đó và xóa dữ liệu các vùng còn lại cũng là rất nhanh rồi....

Bạn xem lại nhé. Không dưng tôi hỏi cái sheet "Daily Sales by SI", bởi vì:
File "HCM" của bạn gửi ở bài #1 có 2 sheets: "Daily Sales by SIP" và "Daily Sales by SI"
Sheet "Daily Sales by SIP" là kết quả bạn đang yêu cầu.
Sheet "Daily Sales by SI": Không rõ
có cách nào viết bằng VBA mà nhanh hơn cách này không
Quan trọng là áp dụng như nào? dùng 1 lần hay nhiều lần? Nếu thi đấu cho lần đầu tiên thì cách bạn đang làm là dành cúp rồi.
 
Upvote 0
Thật ra Sheet "Daily sales by SI" không quan trọng lắm. Sheet đó có thể bỏ trong kết quả cũng được. Người quản lý mình chỉ yêu cầu từ file "daily_sales" hiện ra kết quả giống như sheet "Daily sales by SIP" thôi. Họ muốn viết bằng VBA để áp dụng cho nhiều lần để mỗi lần làm report thì không phải mắc công cứ ngồi giữ lại mỗi vùng mình cần và delete các vùng còn lại vì cũng mất hơi nhiều thời gian vì thật ra cũng có rất nhiều vùng chứ không phải chỉ là 4 vùng trong file "daily_Sales" (tại file báo cáo tổng có nhiều vùng quá không tải lên hết được nên mình phải delete bớt các vùng ở dưới và chỉ giữ lại 4 vùng cho các bạn có thể hình dung được thôi...).
 
Upvote 0
Upvote 0
Thật ra file "daily_sales" cũng có 2 sheet là Daily sales by SIP và Daily sales by SI. Nhưng mà nếu giữ luôn cái sheet Daily sales by SI thì nặng quá nên mình đã delete rồi (với lại cái sheet đó cũng không quan trọng). Mình quên delete cái sheet "Daily sales by SI" trong file HCM. Bạn có thể đưa mình email của bạn để mình gửi cho bạn file hoàn chỉnh của file "daily_sales" dc không vì dung lượng tải lên của mình đã hết nên mình ko tải file đó lên dc nữa...
 
Upvote 0
Thật ra file "daily_sales" cũng có 2 sheet là Daily sales by SIP và Daily sales by SI. Nhưng mà nếu giữ luôn cái sheet Daily sales by SI thì nặng quá nên mình đã delete rồi (với lại cái sheet đó cũng không quan trọng). Mình quên delete cái sheet "Daily sales by SI" trong file HCM. Bạn có thể đưa mình email của bạn để mình gửi cho bạn file hoàn chỉnh của file "daily_sales" dc không vì dung lượng tải lên của mình đã hết nên mình ko tải file đó lên dc nữa...
Chào binmanagertl,

Bạn cứ bình tĩnh nêu yêu cầu của bạn, có hay không có cái gì thì bạn cứ nêu ra dứt khoát. Bạn cứ nhập nhằng vậy sẽ làm khó người muốn giúp bạn.
dung lượng tải lên của mình đã hết nên mình ko tải file đó lên dc nữa
Bạn có thể upload file đó lên google drive, onedrive, mediafire, dropbox... rồi gửi link qua đây.
 
Upvote 0
ah file ED South cũng là 1 file ví dụ kết quả phải ra từ file daily sales by SIP_SI Oct 2016 :)
 
Upvote 0
Chào bạn befaint,

Bạn có xem dc file trong đường link mình dẫn không? Bạn có cần mình nói rõ hơn nữa không? :)
 
Upvote 0
Chào bạn befaint,

Bạn có xem dc file trong đường link mình dẫn không? Bạn có cần mình nói rõ hơn nữa không? :)

Tôi đã xem file.
Bạn vui lòng phản hồi thêm thông tin:
- Căn cứ theo cột 8-[Region] hay theo cột 10-[Auto] để phân vùng?
- Dữ liệu từ dòng 6630 trở xuống thì căn cứ vào đâu?
 
Upvote 0
Mình sẽ căn cứ vào cột 10- [Auto] để phân vùng nha bạn ;)

Từ dòng 6515 trở xuống là những đại lý của những lĩnh vực không còn hoạt động nữa nên chỉ xuất hiện trong file báo cáo tổng cộng chứ không cần gửi cho các đại lý của mỗi vùng thông tin từ dòng 6615 trở xuống. Mình chỉ dừng ở dòng 6614 là được rồi :) Các dòng sau dòng 6615 thì chỉ dành cho cấp quản lý cấp cao tham khảo thôi chứ từng vùng thì không cần phải biết :). Như bạn thấy 2 file ví dụ "HCM" vs "ED South" đều không có những thông tin từ dòng 6614 trở xuống.

Mình sẽ chia các file theo các khu vực như bên dưới:

[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]
 
Upvote 0
Mình sẽ căn cứ vào cột 10- [Auto] để phân vùng nha bạn ;)

Từ dòng 6515 trở xuống là những đại lý của những lĩnh vực không còn hoạt động nữa nên chỉ xuất hiện trong file báo cáo tổng cộng chứ không cần gửi cho các đại lý của mỗi vùng thông tin từ dòng 6615 trở xuống. Mình chỉ dừng ở dòng 6614 là được rồi :) Các dòng sau dòng 6615 thì chỉ dành cho cấp quản lý cấp cao tham khảo thôi chứ từng vùng thì không cần phải biết :). Như bạn thấy 2 file ví dụ "HCM" vs "ED South" đều không có những thông tin từ dòng 6614 trở xuống.
Bạn ơi, bạn diễn đạt làm sao cho người khác hiểu vấn đề của bạn.
Chứ mỗi lúc bạn nói ra được chút... cứ hỏi rồi mới nói.
Code két gì làm sao biết được trong đầu bạn nghĩ cái gì? Nó cần căn cứ cụ thể.
=> Làm sao biết là tới dòng 6514 thì thôi? Sau một thời gian dữ liệu có tăng lên không, khi đó dòng 6514 là cái dòng nào?
Có phải khi cột [Auto] có giá trị ="NEW" thì bỏ qua?
 
Upvote 0
Đúng rồi bạn :) khi nào cột [Auto] có giá trị = "NEW" thì mình sẽ bỏ qua :)
 
Upvote 0
Bạn thông cảm cho mình nha. Nhiều khi mình diễn đạt không dc rõ ràng lắm =.=
 
Upvote 0
Là sao hả bạn? Mình không hiểu lắm =.=

Bạn chép vào module rồi nhấn F5:
Mã:
Sub Main()
Dim NF As String: NF = "\Phan vung"
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
Dim sh As Worksheet, dk(), k As Integer, j As Integer
lr = Sheet2.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) ', ReadOnly:=False
    For Each sh In ActiveWorkbook.Sheets
        If sh.Name = "Daily Sales by SIP" Then
            k = 1
            For j = 0 To UBound(tcp)
                If tcp(j) <> tcp(i) Then dk(k) = tcp(j): k = k + 1
            Next j
            sh.Range("$A$6:$AY$" & lr).AutoFilter Field:=10, Criteria1:=dk, Operator:=xlFilterValues
            sh.Rows("7:6688").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
Web KT

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

Back
Top Bottom