Copy sheet trong file thành file riêng biệt

Liên hệ QC

zerocoldtn

Thành viên hoạt động
Tham gia
2/6/16
Bài viết
148
Được thích
7
- Trong một file excel có rất nhiều sheet chứa dữ liệu khác nhau, khi cần xuất hoặc gửi nội dung của một sheet thì không thể gửi file tổng (vì dung lượng lớn và mỗi sheet chứa dữ liệu khác nhau), nếu làm thủ công thì copy sheet muốn xuất rồi mở file excel mới paste vào rồi lưu lại tên file vào thư mục, như vậy hơi mất thời gian và dài dòng. Có cách nào chỉ cần 1 click trên file tổng sẽ có file mới và copy nội dung của sheet file tổng sang file mới vẫn giữ nguyên định dạng và lưu tên file lại theo tên sheet không? Mong các AC trên GPE chỉ dùm (dùng code vba hoặc hướng dẫn nào khác). Nội dung câu hỏi như hình bên dưới và file đính kèm!Copy sheet thanh file rieng.png
 

File đính kèm

  • Phan lop.xls
    331 KB · Đọc: 6
- Trong một file excel có rất nhiều sheet chứa dữ liệu khác nhau, khi cần xuất hoặc gửi nội dung của một sheet thì không thể gửi file tổng (vì dung lượng lớn và mỗi sheet chứa dữ liệu khác nhau), nếu làm thủ công thì copy sheet muốn xuất rồi mở file excel mới paste vào rồi lưu lại tên file vào thư mục, như vậy hơi mất thời gian và dài dòng. Có cách nào chỉ cần 1 click trên file tổng sẽ có file mới và copy nội dung của sheet file tổng sang file mới vẫn giữ nguyên định dạng và lưu tên file lại theo tên sheet không? Mong các AC trên GPE chỉ dùm (dùng code vba hoặc hướng dẫn nào khác). Nội dung câu hỏi như hình bên dưới và file đính kèm!View attachment 198274

Code chữa cháy
 

File đính kèm

  • Phan lop.xlsm
    176 KB · Đọc: 14
- Trong một file excel có rất nhiều sheet chứa dữ liệu khác nhau, khi cần xuất hoặc gửi nội dung của một sheet thì không thể gửi file tổng (vì dung lượng lớn và mỗi sheet chứa dữ liệu khác nhau), nếu làm thủ công thì copy sheet muốn xuất rồi mở file excel mới paste vào rồi lưu lại tên file vào thư mục, như vậy hơi mất thời gian và dài dòng. Có cách nào chỉ cần 1 click trên file tổng sẽ có file mới và copy nội dung của sheet file tổng sang file mới vẫn giữ nguyên định dạng và lưu tên file lại theo tên sheet không? Mong các AC trên GPE chỉ dùm (dùng code vba hoặc hướng dẫn nào khác). Nội dung câu hỏi như hình bên dưới và file đính kèm!
Chỉ cần dựa vào sheet DS_Khoi6 là tách được các File lớp, chứ đâu cần phải Copy ra từng sheet lớp.
 
Tách như thế là rất vừa ý, nhưng chưa lưu được tên file mới như tên sheet vào cùng folder chưa file gốc, anh chỉ thêm với!
Bài đã được tự động gộp:

Chỉ cần dựa vào sheet DS_Khoi6 là tách được các File lớp, chứ đâu cần phải Copy ra từng sheet lớp.
Em muốn tách hẵn sheet ra file mới luôn anh be09, và đặt tên file như tên sheet tổng!!!!
 
Tách như thế là rất vừa ý, nhưng chưa lưu được tên file mới như tên sheet vào cùng folder chưa file gốc, anh chỉ thêm với!
Bài đã được tự động gộp:


Em muốn tách hẵn sheet ra file mới luôn anh be09, và đặt tên file như tên sheet tổng!!!!
Tôi tách hẳn sheet ra file mới, còn việc của bạn là lưu hay không thì tùy. Nếu muốn lưu luôn tên file thì bạn cho biết tên file là gì?
 

File đính kèm

  • Phan lop.xls
    73 KB · Đọc: 31
Tên file sau khi tách ra chính là tên sheet đó anh.

"tên file mới như tên sheet"
Vậy sửa code lại chút thế này.
Mã:
Public Sub GPE()
Dim Dic As Object, sArr(), Ws As Worksheet, i As Integer, Rng1 As Range, Rng2 As Range, n As Long
Application.ScreenUpdating = False
    sArr() = Sheets("DS_Khoi6").Range("E5:E" & Sheets("DS_Khoi6").Range("E65000").End(xlUp).Row).Value
    Set Dic = CreateObject("Scripting.Dictionary")
    With Sheets("DS_Khoi6")
        .Range("N4").Value = .Range("E4").Value
        Set Rng1 = .Range("B65000").End(xlUp).Offset(1, 2).Resize(2, 5)
        For i = 1 To UBound(sArr, 1)
            If Not Dic.exists(sArr(i, 1)) Then
                Dic.Add sArr(i, 1), ""
                .Range("N5").Value = sArr(i, 1)
                Set Ws = Worksheets.Add(, Sheets("DS_Khoi6"))
                Ws.Name = sArr(i, 1)
                .Range("A4:H" & .Range("E65000").End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
                CriteriaRange:=.Range("N4:N5"), CopyToRange:=Ws.Range("A4:H4"), Unique:=False
                Set Rng2 = Ws.Range("B65000").End(xlUp).Offset(1, 2)
                Ws.Columns("A:A").ColumnWidth = 6
                Ws.Columns("B:B").ColumnWidth = 31.14
                Ws.Columns("C:C").ColumnWidth = 12
                Ws.Columns("D:G").ColumnWidth = 8
                Ws.Columns("H:H").ColumnWidth = 10
                n = Ws.Range("A65000").End(xlUp).Row
                Ws.Range("A5").Value = 1
                Ws.Range("A5").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Step:=1, Stop:=(n - 4), Trend:=False
                .Range("A1:H3").Copy Ws.Range("A1")
                Rng1.Copy Rng2
            End If
        Next i
        .Range("N4:N5").ClearContents
    End With
    Dim Wb As Workbook
    Sheets(Dic.Keys).Move
    Set Wb = ActiveWorkbook
    Wb.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Sheets(1).Name & ".xls", FileFormat:=52
    Wb.Close False
    Set Dic = Nothing
    Application.ScreenUpdating = True
    MsgBox "Da xuat xong"
End Sub
Sẳn @befaint cho tôi hỏi đoạn code đánh số thứ tự luôn, Ví dụ để đánh số thứ tự vùng a5:a10 thì dùng code ngắn gọn thế nào, tôi dùng lệnh này nhưng không đúng.
Mã:
Range("A5:A10") = [row()]
 
Chưa hiểu ý anh lắm. Như thế này được không anh?
Mã:
Range("A5").Value = 1
Range("A5:A10").DataSeries Step:=1
'Range("A5").Resize(6, 1).DataSeries Step:=1
Thì #5 tôi đã làm cách này, nhưng tôi nhớ có lần thấy code anh nào đó viết dùng lệnh Row, nhưng mò mãi vẫn chưa ra (Chắc mò chưa đúng chổ). :D:D:D:D:D
À @befaint ơi đã tìm ra rồi, sẳn chia sẻ cho ai cần.
Mã:
[a1:a10] = [row(r:r)]
 
Lần chỉnh sửa cuối:
Tách như thế là rất vừa ý, nhưng chưa lưu được tên file mới như tên sheet vào cùng folder chưa file gốc, anh chỉ thêm với!
Bài đã được tự động gộp:


Em muốn tách hẵn sheet ra file mới luôn anh be09, và đặt tên file như tên sheet tổng!!!!

Tách 1 Sheet từ file tổng mà lưu cùng tên file cùng thư mục sao được ta? Em chưa hiểu ý của anh
 
Tách như thế là rất vừa ý, nhưng chưa lưu được tên file mới như tên sheet vào cùng folder chưa file gốc, anh chỉ thêm với!
.....................................................
Em muốn tách hẵn sheet ra file mới luôn anh be09, và đặt tên file như tên sheet tổng!!!!

Tham khảo File trong bài 12 của Link sau (về Tách, gộp File).
https://www.giaiphapexcel.com/diend...iều-kiện-thành-nhiều-file.135049/#post-862432
 
Chào các bạn,
Mình có 1 file gồm sheet cần xử lý (sheet tổng hợp) giống như bạn chủ top, khi chuyển sang từng sheet theo điều kiện ở cột B thì dữ liệu 2 dòng đầu không mất đi và có thêm cả tên của chi nhánh theo đúng cột điều kiện và cuối trang đều có 2 dòng để những người liên quan kí tên. Xin lỗi vì mình không biết diễn tả như nào nên mình đã thử ví dụ 1 sheet kết quả _ Hà nội-399 Phạm Văn Đồng
Số cột và số dòng của file tổng hợp không cố định, có tháng có 8 cột có tháng có 6 cột. Mong các bạn giúp mình chia dữ liệu ra từng sheet theo điều kiện.
Mình rất cảm ơn.
 

File đính kèm

  • Tam ung T9.2018.xlsx
    108.5 KB · Đọc: 7
Lần chỉnh sửa cuối:
Thì #5 tôi đã làm cách này, nhưng tôi nhớ có lần thấy code anh nào đó viết dùng lệnh Row, nhưng mò mãi vẫn chưa ra (Chắc mò chưa đúng chổ). :D:D:D:D:D
À @befaint ơi đã tìm ra rồi, sẳn chia sẻ cho ai cần.
Mã:
[a1:a10] = [row(r:r)]
Cái này chắc không ổn, nếu nó không bằng 10 mà nó lộn xộn, không cố định lúc 3, lúc 5, 7, 100 ..v...v....thì làm thế nào?
 
Chào các bạn,
Mình có 1 file gồm sheet cần xử lý (sheet tổng hợp) giống như bạn chủ top, khi chuyển sang từng sheet theo điều kiện ở cột B thì dữ liệu 2 dòng đầu không mất đi và có thêm cả tên của chi nhánh theo đúng cột điều kiện và cuối trang đều có 2 dòng để những người liên quan kí tên. Xin lỗi vì mình không biết diễn tả như nào nên mình đã thử ví dụ 1 sheet kết quả _ Hà nội-399 Phạm Văn Đồng
Số cột và số dòng của file tổng hợp không cố định, có tháng có 8 cột có tháng có 6 cột. Mong các bạn giúp mình chia dữ liệu ra từng sheet theo điều kiện.
Mình rất cảm ơn.
Với file này thì sử dụng code như sau:
Mã:
Public Sub GPE()
Dim Dic As Object, sArr(), Ws As Worksheet, i As Integer, Rng1 As Range, Rng2 As Range, n As Long
Application.ScreenUpdating = False
    sArr() = Sheets("Tong hop").Range("B4:F" & Sheets("Tong hop").Range("A65000").End(xlUp).Row).Value
    Set Dic = CreateObject("Scripting.Dictionary")
    With Sheets("Tong hop")
        .Range("N1").Value = .Range("B3").Value
        Set Rng1 = .Range("A65000").End(xlUp).Offset(1).Resize(7, 6)
        For i = 1 To UBound(sArr, 1)
            If Not Dic.exists(sArr(i, 1)) Then
                Dic.Add sArr(i, 1), ""
                .Range("N2").Value = sArr(i, 1)
                Set Ws = Worksheets.Add(, Sheets("Tong hop"))
                Ws.Name = sArr(i, 1)
                .Range("A3:F" & .Range("A65000").End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
                CriteriaRange:=.Range("N1:N2"), CopyToRange:=Ws.Range("A3:F3"), Unique:=False
                Ws.Range("A4:A" & Ws.Range("A65000").End(xlUp).Row).Value = [row(r:r)]
                Ws.Columns("A:F").EntireColumn.AutoFit
                Ws.Range("A1:F1").Merge: Ws.Range("A2:F2").Merge
                Ws.Range("A1:F1").HorizontalAlignment = xlCenter
                Ws.Range("A1:F1").VerticalAlignment = xlCenter
                Ws.Range("A2:F2").HorizontalAlignment = xlCenter
                Ws.Range("A2:F2").VerticalAlignment = xlCenter
                Ws.Range("A1").Value = .Range("B1").Value
                Ws.Range("A2").Value = sArr(i, 1)
                Set Rng2 = Ws.Range("A65000").End(xlUp).Offset(1)
                Rng1.Copy Rng2
            End If
        Next i
        .Range("N1:N2").ClearContents
    End With
    Dim Wb As Workbook
    Sheets(Dic.Keys).Move
    'Set Wb = ActiveWorkbook
    'Wb.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Sheets(1).Name & ".xls", FileFormat:=52
    'Wb.Close False
    Set Dic = Nothing
    Application.ScreenUpdating = True
    MsgBox "Da xuat xong"
End Sub
Cái này chắc không ổn, nếu nó không bằng 10 mà nó lộn xộn, không cố định lúc 3, lúc 5, 7, 100 ..v...v....thì làm thế nào?
Cái này thử sẽ biết liền chứ gì anh. Còn cái 10 kia là chỉ ví dụ thôi còn khi áp dụng thì tùy trường hợp chứ.
 
Tách như thế là rất vừa ý, nhưng chưa lưu được tên file mới như tên sheet vào cùng folder chưa file gốc, anh chỉ thêm với!
Em muốn tách hẵn sheet ra file mới luôn anh be09, và đặt tên file như tên sheet tổng!!!!
Tôi có thắc mắc, mỗi lớp có 1 giáo viên chủ nhiệm khác nhau, sao không tách danh sách mỗi lớp 1 File mà lại tách các lớp chung 1 File.
 
Với file này thì sử dụng code như sau:
Mã:
Public Sub GPE()
Dim Dic As Object, sArr(), Ws As Worksheet, i As Integer, Rng1 As Range, Rng2 As Range, n As Long
Application.ScreenUpdating = False
    sArr() = Sheets("Tong hop").Range("B4:F" & Sheets("Tong hop").Range("A65000").End(xlUp).Row).Value
    Set Dic = CreateObject("Scripting.Dictionary")
    With Sheets("Tong hop")
        .Range("N1").Value = .Range("B3").Value
        Set Rng1 = .Range("A65000").End(xlUp).Offset(1).Resize(7, 6)
        For i = 1 To UBound(sArr, 1)
            If Not Dic.exists(sArr(i, 1)) Then
                Dic.Add sArr(i, 1), ""
                .Range("N2").Value = sArr(i, 1)
                Set Ws = Worksheets.Add(, Sheets("Tong hop"))
                Ws.Name = sArr(i, 1)
                .Range("A3:F" & .Range("A65000").End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
                CriteriaRange:=.Range("N1:N2"), CopyToRange:=Ws.Range("A3:F3"), Unique:=False
                Ws.Range("A4:A" & Ws.Range("A65000").End(xlUp).Row).Value = [row(r:r)]
                Ws.Columns("A:F").EntireColumn.AutoFit
                Ws.Range("A1:F1").Merge: Ws.Range("A2:F2").Merge
                Ws.Range("A1:F1").HorizontalAlignment = xlCenter
                Ws.Range("A1:F1").VerticalAlignment = xlCenter
                Ws.Range("A2:F2").HorizontalAlignment = xlCenter
                Ws.Range("A2:F2").VerticalAlignment = xlCenter
                Ws.Range("A1").Value = .Range("B1").Value
                Ws.Range("A2").Value = sArr(i, 1)
                Set Rng2 = Ws.Range("A65000").End(xlUp).Offset(1)
                Rng1.Copy Rng2
            End If
        Next i
        .Range("N1:N2").ClearContents
    End With
    Dim Wb As Workbook
    Sheets(Dic.Keys).Move
    'Set Wb = ActiveWorkbook
    'Wb.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Sheets(1).Name & ".xls", FileFormat:=52
    'Wb.Close False
    Set Dic = Nothing
    Application.ScreenUpdating = True
    MsgBox "Da xuat xong"
End Sub

Cái này thử sẽ biết liền chứ gì anh. Còn cái 10 kia là chỉ ví dụ thôi còn khi áp dụng thì tùy trường hợp chứ.
1539043984195.png
Bị như vầy anh ơi !
 

File đính kèm

  • Tam ung T9.2018.xlsx
    108.5 KB · Đọc: 11
Vậy có khắc phục lỗi này như thế nào vậy anh ?
Thêm 1 đoạn để kiểm tra sự tồn tại của Sheet. Nếu có thì xóa Sheet
Mã:
Public Sub GPE()
    Dim Dic As Object, sArr(), Ws As Worksheet, i As Integer, Rng1 As Range, Rng2 As Range, n As Long
Application.ScreenUpdating = False
sArr() = Sheets("Tong hop").Range("B4:F" & Sheets("Tong hop").Range("A65000").End(xlUp).Row).Value
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Tong hop")
    .Range("N1").Value = .Range("B3").Value
    Set Rng1 = .Range("A65000").End(xlUp).Offset(1).Resize(7, 6)
    For i = 1 To UBound(sArr, 1)
        If Not Dic.exists(sArr(i, 1)) Then
            Dic.Add sArr(i, 1), ""
            .Range("N2").Value = sArr(i, 1)
            Set Ws = Worksheets.Add(, Sheets("Tong hop"))
            If WsExit(sArr(i, 1)) Then Sheets(sArr(i, 1)).Delete                '*****"
            Ws.Name = sArr(i, 1)
            .Range("A3:F" & .Range("A65000").End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
                    CriteriaRange:=.Range("N1:N2"), CopyToRange:=Ws.Range("A3:F3"), Unique:=False
            Ws.Range("A4:A" & Ws.Range("A65000").End(xlUp).Row).Value = [row(r:r)]
            Ws.Columns("A:F").EntireColumn.AutoFit
            Ws.Range("A1:F1").Merge: Ws.Range("A2:F2").Merge
            Ws.Range("A1:F1").HorizontalAlignment = xlCenter
            Ws.Range("A1:F1").VerticalAlignment = xlCenter
            Ws.Range("A2:F2").HorizontalAlignment = xlCenter
            Ws.Range("A2:F2").VerticalAlignment = xlCenter
            Ws.Range("A1").Value = .Range("B1").Value
            Ws.Range("A2").Value = sArr(i, 1)
            Set Rng2 = Ws.Range("A65000").End(xlUp).Offset(1)
            Rng1.Copy Rng2
        End If
    Next i
    .Range("N1:N2").ClearContents
End With
    Dim Wb As Workbook
Sheets(Dic.Keys).Move
'Set Wb = ActiveWorkbook
'Wb.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Sheets(1).Name & ".xls", FileFormat:=52
'Wb.Close False
Set Dic = Nothing
Application.ScreenUpdating = True
MsgBox "Da xuat xong"
End Sub
Public Function WsExit(ByVal wsName As String) As Boolean
    On Error Resume Next
    WsExit = CBool(Len(Worksheets(wsName).Name) > 0)
End Function
 
Web KT
Back
Top Bottom