Làm sao chỉ tách 1 sheet thành nhiều file trong Excel, tuy nhiên vẫn giữ nguyên các sheet còn lại?

Liên hệ QC

Vivian0309

Thành viên mới
Tham gia
15/7/20
Bài viết
6
Được thích
0
Giới tính
Nữ
Dear cả nhà,

Hiện tại em đang có 1 file excel gồm nhiều sheet:
  • 1 sheet data tổng, bao gồm các dữ liệu như Tên người bán hàng, tên khách hàng, sales, tháng, quý....
  • 10 sheet còn lại là pivot từ sheet data tổng, có các chart biểu đồ tự động link với dữ liệu sheet data tổng.
=> Em đang cần gửi data cho mỗi Tên người bán hàng => Cần phải tách sheet data tổng thành nhiều filel Excel, tương ứng với Tên người bán hàng. Tuy nhiên vẫn cần giữ nguyên các sheet biểu đồ còn lại.

Cả nhà mình có ai biết hỗ trợ giúp em phần này với ạ.

Cảm ơn cả nhà nhiều.
PS: Em sẽ share file cụ thể với anh chị nào tách giúp em ạ.
 
Dear cả nhà,

Hiện tại em đang có 1 file excel gồm nhiều sheet:
  • 1 sheet data tổng, bao gồm các dữ liệu như Tên người bán hàng, tên khách hàng, sales, tháng, quý....
  • 10 sheet còn lại là pivot từ sheet data tổng, có các chart biểu đồ tự động link với dữ liệu sheet data tổng.
=> Em đang cần gửi data cho mỗi Tên người bán hàng => Cần phải tách sheet data tổng thành nhiều filel Excel, tương ứng với Tên người bán hàng. Tuy nhiên vẫn cần giữ nguyên các sheet biểu đồ còn lại.

Cả nhà mình có ai biết hỗ trợ giúp em phần này với ạ.

Cảm ơn cả nhà nhiều.
PS: Em sẽ share file cụ thể với anh chị nào tách giúp em ạ.
đưa file lên thì người ta mới biết là giúp dc hay không chứ bạn???
 
Upvote 0
Em đính kèm file nhé. Sheet cần tách là Total.data. Tách theo EmpName.
Cảm ơn cả nhà.
Bạn thử code dưới đây xem ổn không
Mã:
Sub taofile()
Dim sArr, i As Long
Dim Str As String, Fname As String
Dim Wb As Workbook

With Sheets("Total.Data")
    Lr = .Range("N50000").End(xlUp).Row
    sArr = .Range("N2:N" & Lr).Value
    For i = 1 To UBound(sArr)
        If InStr(Str, sArr(i, 1)) = 0 Then
            Str = Str & sArr(i, 1)
            Fname = ThisWorkbook.Path & "\" & sArr(i, 1) & ".xlsx"
            .Range("$A$1:$AD$" & Lr).AutoFilter Field:=14, Criteria1:=sArr(i, 1)
            .Range("$A$1:$AD$" & Lr).Copy
            If Dir(Fname) <> "" Then
                MsgBox "File Name: " & sArr(i, 1) & ".xlsx" & " bi trùng"
            Else
                Workbooks.Add
                Set Wb = ActiveWorkbook
                With Wb
                    .Sheets("Sheet1").Paste
                    .SaveAs Filename:=Fname
                    .Close savechanges:=True
                End With
            End If
        End If
    Next i
    .ShowAllData
End With
Application.CutCopyMode = False
End Sub
nhé:
 
Upvote 0
Bạn thử code dưới đây xem ổn không
Mã:
Sub taofile()
Dim sArr, i As Long
Dim Str As String, Fname As String
Dim Wb As Workbook

With Sheets("Total.Data")
    Lr = .Range("N50000").End(xlUp).Row
    sArr = .Range("N2:N" & Lr).Value
    For i = 1 To UBound(sArr)
        If InStr(Str, sArr(i, 1)) = 0 Then
            Str = Str & sArr(i, 1)
            Fname = ThisWorkbook.Path & "\" & sArr(i, 1) & ".xlsx"
            .Range("$A$1:$AD$" & Lr).AutoFilter Field:=14, Criteria1:=sArr(i, 1)
            .Range("$A$1:$AD$" & Lr).Copy
            If Dir(Fname) <> "" Then
                MsgBox "File Name: " & sArr(i, 1) & ".xlsx" & " bi trùng"
            Else
                Workbooks.Add
                Set Wb = ActiveWorkbook
                With Wb
                    .Sheets("Sheet1").Paste
                    .SaveAs Filename:=Fname
                    .Close savechanges:=True
                End With
            End If
        End If
    Next i
    .ShowAllData
End With
Application.CutCopyMode = False
End Sub
nhé:
Hi
Bạn thử code dưới đây xem ổn không
Mã:
Sub taofile()
Dim sArr, i As Long
Dim Str As String, Fname As String
Dim Wb As Workbook

With Sheets("Total.Data")
    Lr = .Range("N50000").End(xlUp).Row
    sArr = .Range("N2:N" & Lr).Value
    For i = 1 To UBound(sArr)
        If InStr(Str, sArr(i, 1)) = 0 Then
            Str = Str & sArr(i, 1)
            Fname = ThisWorkbook.Path & "\" & sArr(i, 1) & ".xlsx"
            .Range("$A$1:$AD$" & Lr).AutoFilter Field:=14, Criteria1:=sArr(i, 1)
            .Range("$A$1:$AD$" & Lr).Copy
            If Dir(Fname) <> "" Then
                MsgBox "File Name: " & sArr(i, 1) & ".xlsx" & " bi trùng"
            Else
                Workbooks.Add
                Set Wb = ActiveWorkbook
                With Wb
                    .Sheets("Sheet1").Paste
                    .SaveAs Filename:=Fname
                    .Close savechanges:=True
                End With
            End If
        End If
    Next i
    .ShowAllData
End With
Application.CutCopyMode = False
End Sub
nhé:
Hi bạn,

Phần code này đã tách ra từng TDV A hoặc TDV B nhưng mà cũng delete luôn các sheet còn lại. :(
Bài đã được tự động gộp:

là tách theo TDV A, TDV B đó hả
Đúng rồi bạn. Nhưng vẫn giữ nguyên các sheet còn lại (đánh số 1,2,3....).

Cảm ơn bạn nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Yêu cầu trên chưa đáp ứng được cho chủ Topic.
Do mình không đọc kỹ yêu cầu, tuy nhiên việc khó làm rồi chỉ còn việc dễ, để chủ thớt tự làm vậy
Bài đã được tự động gộp:

Hi

Hi bạn,

Phần code này đã tách ra từng TDV A hoặc TDV B nhưng mà cũng delete luôn các sheet còn lại. :(
Bài đã được tự động gộp:


Đúng rồi bạn. Nhưng vẫn giữ nguyên các sheet còn lại (đánh số 1,2,3....).

Cảm ơn bạn nhé.
Chào bạn:
1. Minh không delete cái gì đi cả chỉ là tạo Wb mới và copy dữ liệu cần sang thôi
2. Việc copy các sheets còn lại sang WB mới được thực hiện như sau: Tạo vòng lặp duyệt qua các sheets, sau đó copy nó sang WB mới là được (tất nhiên là bỏ sheet "total.data" lại)

Bạn làm thử xem có được không nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Do mình không đọc kỹ yêu cầu, tuy nhiên việc khó làm rồi chỉ còn việc dễ, để chủ thớt tự làm vậy
Bài đã được tự động gộp:


Chào bạn:
1. Minh không delete cái gì đi cả chỉ là tạo Wb mới và copy dữ liệu cần sang thôi
2. Việc copy các sheets còn lại sang WB mới được thực hiện như sau: Tạo vòng lặp duyệt qua các sheets, sau đó copy nó sang WB mới là được (tất nhiên là bỏ sheet "total.data" lại)

Bạn làm thử xem có được không nhé.
Do mình không đọc kỹ yêu cầu, tuy nhiên việc khó làm rồi chỉ còn việc dễ, để chủ thớt tự làm vậy
Bài đã được tự động gộp:


Chào bạn:
1. Minh không delete cái gì đi cả chỉ là tạo Wb mới và copy dữ liệu cần sang thôi
2. Việc copy các sheets còn lại sang WB mới được thực hiện như sau: Tạo vòng lặp duyệt qua các sheets, sau đó copy nó sang WB mới là được (tất nhiên là bỏ sheet "total.data" lại)

Bạn làm thử xem có được không nhé.

Chủ thớt hoàn toàn không biết phần này nên nhờ cả nhà giúp cả nhà ơi. Help me help me!!! :((

Cảm ơn cả nhà nhiều.
 
Upvote 0
Chủ thớt hoàn toàn không biết phần này nên nhờ cả nhà giúp cả nhà ơi. Help me help me!!! :((

Cảm ơn cả nhà nhiều.
Bạn thêm vào code mấy dòng dưới đây:
PHP:
   For Each sh In Workbooks("Testing_Data sample_2020.07.15").Worksheets
                            If sh.Name <> "Total.Data" Then
                                sh.Copy After:=wb.Sheets(wb.Sheets.Count)
                            End If
                        Next sh

+ Code bổ sung:
PHP:
Sub taofile()
    Dim sArr, i As Long
    Dim Str As String, Fname As String, sh As Worksheet
    Dim wb As Workbook
    With Sheets("Total.Data")
        Lr = .Range("N50000").End(xlUp).Row
        sArr = .Range("N2:N" & Lr).Value
        For i = 1 To UBound(sArr)
            If InStr(Str, sArr(i, 1)) = 0 Then
                Str = Str & sArr(i, 1)
                Fname = ThisWorkbook.Path & "\" & sArr(i, 1) & ".xlsx"
                .Range("$A$1:$AD$" & Lr).AutoFilter Field:=14, Criteria1:=sArr(i, 1)
                .Range("$A$1:$AD$" & Lr).Copy
                If Dir(Fname) <> "" Then
                    MsgBox "File Name: " & sArr(i, 1) & ".xlsx" & " bi trùng"
                Else
                    Workbooks.Add
                    Set wb = ActiveWorkbook
                    With wb
                        .Sheets("Sheet1").Paste
                        .SaveAs Filename:=Fname
                        For Each sh In Workbooks("Testing_Data sample_2020.07.15").Worksheets
                            If sh.Name <> "Total.Data" Then
                                sh.Copy After:=wb.Sheets(wb.Sheets.Count)
                            End If
                        Next sh
                        .Close savechanges:=True
                    End With
                End If
            End If
        Next i
        .ShowAllData
    End With
    Application.CutCopyMode = False
End Sub
 
Upvote 0
Bạn thêm vào code mấy dòng dưới đây:
PHP:
   For Each sh In Workbooks("Testing_Data sample_2020.07.15").Worksheets
                            If sh.Name <> "Total.Data" Then
                                sh.Copy After:=wb.Sheets(wb.Sheets.Count)
                            End If
                        Next sh

+ Code bổ sung:
PHP:
Sub taofile()
    Dim sArr, i As Long
    Dim Str As String, Fname As String, sh As Worksheet
    Dim wb As Workbook
    With Sheets("Total.Data")
        Lr = .Range("N50000").End(xlUp).Row
        sArr = .Range("N2:N" & Lr).Value
        For i = 1 To UBound(sArr)
            If InStr(Str, sArr(i, 1)) = 0 Then
                Str = Str & sArr(i, 1)
                Fname = ThisWorkbook.Path & "\" & sArr(i, 1) & ".xlsx"
                .Range("$A$1:$AD$" & Lr).AutoFilter Field:=14, Criteria1:=sArr(i, 1)
                .Range("$A$1:$AD$" & Lr).Copy
                If Dir(Fname) <> "" Then
                    MsgBox "File Name: " & sArr(i, 1) & ".xlsx" & " bi trùng"
                Else
                    Workbooks.Add
                    Set wb = ActiveWorkbook
                    With wb
                        .Sheets("Sheet1").Paste
                        .SaveAs Filename:=Fname
                        For Each sh In Workbooks("Testing_Data sample_2020.07.15").Worksheets
                            If sh.Name <> "Total.Data" Then
                                sh.Copy After:=wb.Sheets(wb.Sheets.Count)
                            End If
                        Next sh
                        .Close savechanges:=True
                    End With
                End If
            End If
        Next i
        .ShowAllData
    End With
    Application.CutCopyMode = False
End Sub

Cảm ơn bạn rất nhiều cho phần code này nha.
Mình đã tách ra được từng file với code này, và vẫn giữ nguyên các sheet còn lại rồi.

Tuy nhiên, đối với file vừa được tách, các sheet còn lại, dữ liệu của Pivot để làm biểu đồ vẫn còn đang lấy từ sheet dữ liệu "Total.data" trong file excel gốc của mình, không lấy trên sheet vừa được tách ra => Các TDV này vẫn thấy được dữ liệu của TDV khác.

Mình có cách nào để trong file vừa được tách ra, các sheet còn lại được link duy nhất với sheet vừa được tách không?
Cảm ơn cả nhà rất nhiều vì đã hỗ trợ nhé.
 
Upvote 0
Cảm ơn bạn rất nhiều cho phần code này nha.
Mình đã tách ra được từng file với code này, và vẫn giữ nguyên các sheet còn lại rồi.

Tuy nhiên, đối với file vừa được tách, các sheet còn lại, dữ liệu của Pivot để làm biểu đồ vẫn còn đang lấy từ sheet dữ liệu "Total.data" trong file excel gốc của mình, không lấy trên sheet vừa được tách ra => Các TDV này vẫn thấy được dữ liệu của TDV khác.

Mình có cách nào để trong file vừa được tách ra, các sheet còn lại được link duy nhất với sheet vừa được tách không?
Cảm ơn cả nhà rất nhiều vì đã hỗ trợ nhé.
Bạn thử code dưới nhé:
Mã:
Sub taofile()
Dim sArr, i As Long
Dim Str As String, Fname As String, sh As Worksheet
Dim wb As Workbook
Dim pv As PivotTable

Application.ScreenUpdating = False
With Sheets("Total.Data")
    Lr = .Range("N50000").End(xlUp).Row
    sArr = .Range("N2:N" & Lr).Value
    For i = 1 To UBound(sArr)
        If InStr(Str, sArr(i, 1)) = 0 Then
            Str = Str & sArr(i, 1)
            Fname = ThisWorkbook.Path & "\" & sArr(i, 1) & ".xlsx"
            .Range("$A$1:$AD$" & Lr).AutoFilter Field:=14, Criteria1:=sArr(i, 1)
            .Range("$A$1:$AD$" & Lr).Copy
            If Dir(Fname) <> "" Then
                MsgBox "File Name: " & sArr(i, 1) & ".xlsx" & " bi trùng"
            Else
                Workbooks.Add
                Set wb = ActiveWorkbook
                With wb
                    .Sheets("Sheet1").Paste
                    .SaveAs Filename:=Fname
                    For Each sh In Workbooks("Testing_Data sample_2020.07.15").Worksheets
                        If sh.Name <> "Total.Data" Then
                            sh.Copy After:=wb.Sheets(wb.Sheets.Count)
                            With ActiveSheet
                                For Each pv In .PivotTables
                                    With pv
                                        pv.SourceData = "'Sheet1'!R1C1:R10000C30"
                                    End With
                                Next pv
                            End With
                        End If
                    Next sh
                    .Close savechanges:=True
                End With
            End If
        End If
    Next i
    .ShowAllData
End With
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Bạn thử code dưới nhé:
Mã:
Sub taofile()
Dim sArr, i As Long
Dim Str As String, Fname As String, sh As Worksheet
Dim wb As Workbook
Dim pv As PivotTable

Application.ScreenUpdating = False
With Sheets("Total.Data")
    Lr = .Range("N50000").End(xlUp).Row
    sArr = .Range("N2:N" & Lr).Value
    For i = 1 To UBound(sArr)
        If InStr(Str, sArr(i, 1)) = 0 Then
            Str = Str & sArr(i, 1)
            Fname = ThisWorkbook.Path & "\" & sArr(i, 1) & ".xlsx"
            .Range("$A$1:$AD$" & Lr).AutoFilter Field:=14, Criteria1:=sArr(i, 1)
            .Range("$A$1:$AD$" & Lr).Copy
            If Dir(Fname) <> "" Then
                MsgBox "File Name: " & sArr(i, 1) & ".xlsx" & " bi trùng"
            Else
                Workbooks.Add
                Set wb = ActiveWorkbook
                With wb
                    .Sheets("Sheet1").Paste
                    .SaveAs Filename:=Fname
                    For Each sh In Workbooks("Testing_Data sample_2020.07.15").Worksheets
                        If sh.Name <> "Total.Data" Then
                            sh.Copy After:=wb.Sheets(wb.Sheets.Count)
                            With ActiveSheet
                                For Each pv In .PivotTables
                                    With pv
                                        pv.SourceData = "'Sheet1'!R1C1:R10000C30"
                                    End With
                                Next pv
                            End With
                        End If
                    Next sh
                    .Close savechanges:=True
                End With
            End If
        End If
    Next i
    .ShowAllData
End With
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Cảm ơn phần code của bạn rất nhiều. Mình thấy file tách đúng như mong muốn của mình 99% rồi. Còn 1% rơi vào trường hợp bên dưới:

Vì dữ liệu của Pivot để làm biểu đồ vẫn còn đang lấy từ sheet dữ liệu "Total.data" trong file excel gốc của mình => Trong trường hợp người nhận file được tách có điều chỉnh một số thông tin trong "sheet 1", các dữ liệu các sheet Pvt còn lại sẽ không thay đổi (data range cho Pivot mình dùng Offset).

Mình có cách nào dữ liệu Pvt cũng động theo "sheet 1", chứ không phải Total.data trong file gốc của mình không?

Lần đầu tiên tham gia các diễn đàn dạng này, rất biết ơn cả nhà dù không quen biết vẫn giúp đỡ mình rất nhiều nhé. :)
 
Upvote 0
Web KT

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

Back
Top Bottom