Copy tất cả sheet sang file mới

Liên hệ QC

nguyentebby

Thành viên mới
Tham gia
20/4/21
Bài viết
18
Được thích
0
Hi cả nhà, có ai có đoạn mã copy tất cả các sheet sang 1 file mới không cho mình xin với ạ! Hay là copy 1 sheet, trong đó 1 nửa paste có công thức và 1 nửa paste value cũng được ạ!
Cảm ơn cả nhà!!!
 
Mục đích để làm gì vậy. Sao 1 nửa nọ nửa kia vậy
 
Upvote 0
Mục đích để làm gì vậy. Sao 1 nửa nọ nửa kia vậy
mình cần tách file 2 sheet chính ra file mới nhưng đều có công thức liên quan đến các sheet còn lại không coppy nên khi người khác sử dụng sẽ bị lỗi ạ, diễn đàn mình không đăng file được do file rất nặng ạ :(
 
Upvote 0
mình cần tách file 2 sheet chính ra file mới nhưng đều có công thức liên quan đến các sheet còn lại không coppy nên khi người khác sử dụng sẽ bị lỗi ạ, diễn đàn mình không đăng file được do file rất nặng ạ :(
Thử code này, thay đổi nó phù hợp với yêu cầu thực tế của bạn.

PHP:
Sub CopySheet()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

    Sheets(Array("Don dat hang", "Gimick")).Copy 'Change here
    With ActiveWorkbook
        .Sheets("Don dat hang").Range("O:R").Value = .Sheets("Don dat hang").Range("O:R").Value
        .Sheets("Gimick").Range("N:O").Value = .Sheets("Gimick").Range("N:O").Value
        .SaveAs ThisWorkbook.Path & "\" & Format(Now, "yyyyMMdd_hhmmss") & ".xlsx", FileFormat:=xlOpenXMLWorkbook
        .Close False
    End With
    
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • CopySheet.xlsm
    30.5 KB · Đọc: 18
Upvote 0
đúng ý mình muốn rồi ạ. mình cảm ơn ạ!
 
Upvote 0
Thử code này, thay đổi nó phù hợp với yêu cầu thực tế của bạn.

PHP:
Sub CopySheet()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

    Sheets(Array("Don dat hang", "Gimick")).Copy 'Change here
    With ActiveWorkbook
        .Sheets("Don dat hang").Range("O:R").Value = .Sheets("Don dat hang").Range("O:R").Value
        .Sheets("Gimick").Range("N:O").Value = .Sheets("Gimick").Range("N:O").Value
        .SaveAs ThisWorkbook.Path & "\" & Format(Now, "yyyyMMdd_hhmmss") & ".xlsx", FileFormat:=xlOpenXMLWorkbook
        .Close False
    End With
   
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Anh cho em hỏi chút ạ. Giờ muốn copy ALL sheet trong File mà loại trừ không copy Sheet Main và Gimick thì sửa đoạn Sheets(Array("Don dat hang", "Gimick")).Copy như thế nào ạ.
 
Upvote 0
Anh cho em hỏi chút ạ. Giờ muốn copy ALL sheet trong File mà loại trừ không copy Sheet Main và Gimick thì sửa đoạn Sheets(Array("Don dat hang", "Gimick")).Copy như thế nào ạ.
Có nhiều cách như:

1. Liệt kê các sheet muốn sao chép trong Array: Sheets(Array("A","B","C","D"))

2. Xóa các sheet muốn loại trừ rồi dùng .SaveAs với tên mới.

...
 
Upvote 0
Có nhiều cách như:

1. Liệt kê các sheet muốn sao chép trong Array: Sheets(Array("A","B","C","D"))

2. Xóa các sheet muốn loại trừ rồi dùng .SaveAs với tên mới.

...
Tại vì em chỉ biết chắc em không muốn copy 2 sheet Sheet Main và Gimick nhưng số lượng Sheet trong File là không cố định nên nếu liệt kê ra thì không khả thi ạ ? Em chưa biết cách viết lấy ALL sheet loại trừ 2 sheet kia ạ
 
Upvote 0
Anh cho em hỏi chút ạ. Giờ muốn copy ALL sheet trong File mà loại trừ không copy Sheet Main và Gimick thì sửa đoạn Sheets(Array("Don dat hang", "Gimick")).Copy như thế nào ạ.

Bạn thử sửa đoạn:
Mã:
Sheets(Array("Don dat hang", "Gimick")).Copy
Thành:
Mã:
    Dim aSheet(), book As Workbook, sheet As Worksheet, count
    Set book = ThisWorkbook
    For Each sheet In book.Worksheets
        If sheet.Name <> "Main" And sheet.Name <> "Gimick" Then
            count = count + 1
            ReDim Preserve aSheet(1 To count)
            aSheet(count) = sheet.Name
        End If
    Next sheet
    Sheets(aSheet).Copy
Sau khi sửa các dòng code phía sau có thể bị lỗi vì không có tên sheet tồn tại nữa nên phải sửa lại:
Mã:
Option Explicit

Sub CopySheet()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

    Dim aSheet(), book As Workbook, sheet As Worksheet, count
    Dim bookName As String, bookNew As Workbook, rValueTuyChinh As Range
    Set book = ThisWorkbook
    For Each sheet In book.Worksheets
        If sheet.Name <> "Main" And sheet.Name <> "Gimick" Then
            count = count + 1
            ReDim Preserve aSheet(1 To count)
            aSheet(count) = sheet.Name
        End If
    Next sheet
    book.Worksheets(aSheet).Copy
    bookName = book .Path & "\" & Format(Now, "yyyyMMdd_hhmmss") & ".xlsx"
 
    Set bookNew = ActiveWorkbook
    With bookNew
        For count = 1 To .Worksheets.count
            Set sheet = .Worksheets(count)
            If sheet.Name = "Don dat hang" Then
                Set rValueTuyChinh = sheet.Range("O1:R100")
                rValueTuyChinh.Value = rValueTuyChinh.Value
            End If
        Next count
        .SaveAs bookName, FileFormat:=xlOpenXMLWorkbook
        .Activate
        '.Close False
    End With

 
Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
    Dim aSheet(), book As Workbook, sheet As Worksheet, count
    Set book = ThisWorkbook
    For Each sheet In book.Worksheets
        If sheet.Name <> "Main" And sheet.Name <> "Gimick" Then
           

End Sub

Theo anh không nên code chết (hard coding) tên sheet vào code VBA vì như vậy sẽ không linh động. Muốn thay đổi tên sheet, số lượng sheet nhiều hơn lại phải can thiệp vào code VBA. :)
 
Upvote 0
Theo anh không nên code chết (hard coding) tên sheet vào code VBA vì như vậy sẽ không linh động. Muốn thay đổi tên sheet, số lượng sheet nhiều hơn lại phải can thiệp vào code VBA. :)
Code sử dụng vào nhiều chỗ mới cần linh động.
Loại đề bài ở đây chỉ cần code chữa cháy, chỉ áp dụng vào mọt công việc duy nhất là yêu cầu của thớt. Và code chữa cháy chỉ cần dễ đọc thôi.
Điển hình, code chỉ cần sao cho người đọc biết chỗ tìm "tên của những sheets bỏ qua copy".

Cái quan trọng hơn mà hầu hết người code ở GPE này luôn bỏ qua là code đáng lẽ phải báo cáo những gì nó làm suông sẻ và những gì vướng mắc.
 
Upvote 0
Loại đề bài ở đây chỉ cần code chữa cháy, chỉ áp dụng vào mọt công việc duy nhất là yêu cầu của thớt. Và code chữa cháy chỉ cần dễ đọc thôi.
Điển hình, code chỉ cần sao cho người đọc biết chỗ tìm "tên của những sheets bỏ qua copy".

:D Vậy là sao này sẽ có bài hỏi tiếp: "em không biết VBA, giờ muốn thêm tên nhiều sheet nữa thì sửa chỗ nào anh....?" :search::D
Bài đã được tự động gộp:

Chạy code xong nó im lặng ngoan ngoãn, và chả thấy điều gì xảy ra, lúc đó không biết phải hỏi ai

Theo tôi hiểu ý anh Vetmini là: thường người viết nên nêu lên những hạn chế của bộ code này, những điều kiện qui ước để code chạy đúng v.v... Không biết đúng ý không :).
 
Upvote 0
thường người viết nên nêu lên những hạn chế của bộ code này, những điều kiện qui ước để code chạy đúng
cái này thì đúng rồi, và ý của bác Vẹt là cần có một bản log cho quá trình chạy ( cái này bác ý nói nhiều, thuộc như bảng cửu chương)
 
Upvote 0
:D Vậy là sao này sẽ có bài hỏi tiếp: "em không biết VBA, giờ muốn thêm tên nhiều sheet nữa thì sửa chỗ nào anh....?" :search::D
...
Chuyện đó gần như chắc chắn sẽ xảy ra. Dầu cho bạn có viết code cách nào đi nữa.

cái này thì đúng rồi, và ý của bác Vẹt là cần có một bản log cho quá trình chạy ( cái này bác ý nói nhiều, thuộc như bảng cửu chương)
Bất cứ cái gì copy/ chỉnh sửa nhiều đơn vị đều cần log.
Toi sợ nhất là có mấy vị viết code kèm thêm bẫy lỗi, chạy xong chả biết nổi có chỗ nào lỗi và được bỏ qua.
 
Upvote 0
Web KT

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

Back
Top Bottom