Lưu dưới dạng Giữ nguyên bản Mở - Mẹo Excel

Mục lục

Có nhiều lần trong một tháng, tôi cần sổ làm việc Excel để tạo nhiều bản sao của chính nó. Tôi thường gặp lỗi logic khi mở * sổ làm việc * và bắt đầu viết mã để lặp qua danh sách và sử dụng Tệp, Lưu Dưới dạng để lưu bản sao của sổ làm việc.

Đây là sơ đồ:

Lỗi logic khi tôi đóng sổ làm việc

Bạn có thấy vấn đề trên không? Macro đang chạy trong WorkbookA. Khi tôi Lưu dưới dạng tệp dưới dạng RegionEast.xlsx và sau đó đóng RegionEast.xlsx, macro sẽ ngừng chạy.

Tôi thường đi sâu vào mã giả trước khi tôi thấy vấn đề.

Sub MakeCopies() Dim WBT As Workbook Dim WSD As Worksheet Dim WSR As Worksheet Set WBT = ThisWorkbook Set WSD = WBT.Worksheets("Data") Set WSR = WBT.Worksheets("Report") FinalRow = WSD.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To FinalRow ' Copy this product to WSR.B2 WSR.Cells(2, 1).Value = WSD.Cells(i, 1).Value ' Save this workbook with a new name NewFN = "C:aaa " & WSD.Cells(i, 1).Value & ".xlsx" ' Save As a file type without macros WBT.SaveAs Filename:=NewFN, FileFormat:=xlOpenXMLWorkbook ' Close the new workbook ' But that won't work because I need this workbook to stay open End Sub

Nếu tôi suy nghĩ trước, tôi đã tạo ra một giải pháp hai sổ làm việc. Đặt tất cả các macro trong WorkbookA. Đặt tất cả dữ liệu trong WorkbookB. Yêu cầu WorkbookA mở nhiều lần WorkbookB, thay đổi dữ liệu, SaveA, Close.

Phức tạp hơn một chút

Khi tôi già đi và trở nên cáu kỉnh hơn, tôi nhận ra rằng tôi không còn tâm trạng để làm những việc phức tạp hơn một chút. Đặc biệt là vì tôi có hầu hết mã hoạt động cho lệnh SaveAs ban đầu.

Bài viết hôm nay là về phương pháp VBA tuyệt vời cho SaveAsCopy. Lệnh này sẽ giữ cho WorkbookA luôn mở và được gọi là WorkbookA. Macro có thể tiếp tục chạy. Nhưng nó sẽ ghi trạng thái hiện tại của sổ làm việc vào một sổ làm việc mới đóng có tên là WorkbookB.

Điều này cho phép tôi quay lại lưu đồ ban đầu:

Logic đơn giản hơn, tất cả đều khép kín

Tuy nhiên, tôi đã phát hiện ra một vấn đề với SaveAsCopy. Khi tôi thực hiện ThisWorkbook.SaveAs, tôi có thể chọn nếu tôi muốn lưu dưới dạng XLSX hoặc XLSM. Nếu tôi cần macro có sẵn trong sổ làm việc mới, thì tôi sử dụng XLSM. Nếu không, tôi sử dụng XLSX và các macro sẽ biến mất.

Thật không may, nếu bạn đang ở trong sổ làm việc XLSM, bạn không thể .SaveAsCopy thành công và thay đổi thành XLSX. Mã sẽ hoạt động. Tuy nhiên, sổ làm việc kết quả sẽ không mở vì Excel phát hiện thấy sự trùng khớp giữa loại tệp và phần mở rộng tệp.

Giải pháp của tôi là SaveAsCopy dưới dạng XLSM. Sau khi bản sao được lưu, tôi có thể mở sổ làm việc (tạo hai bản sao của sổ làm việc trong bộ nhớ) và sau đó SaveAs XLSX.

Sub MakeCopies() Dim WBT As Workbook Dim WBN As Workbook Dim WSD As Worksheet Dim WSR As Worksheet Set WBT = ThisWorkbook Set WSD = WBT.Worksheets("Data") Set WSR = WBT.Worksheets("Report") FinalRow = WSD.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To FinalRow ' Copy this product to WSR.B2 WSR.Cells(2, 1).Value = WSD.Cells(i, 1).Value ' Save this workbook with a new name FN = "C:aaa " & WSD.Cells(i, 1).Value & ".xlsx" ' Save a Temp Copy of this workbook NewFN = "C:aaaDeleteMe.xlsm" ' Delete any previous copy left over from before On Error Resume Next Kill (NewFN) On Error GoTo 0 ' **************************************** ' Use SaveCopyAs instead of SaveAs WBT.SaveCopyAs Filename:=NewFN ' Open the workbook we just saved Set WBN = Workbooks.Open(NewFN) ' Delete the worksheets that we don't need Application.DisplayAlerts = False For Each WS In WBN.Worksheets Select Case WS.Name Case "BuyTheBook", "Info", "Form", "Template", "Article", "NotesForApp", "Data" WS.Delete End Select Next WS Application.DisplayAlerts = True NewFN = FN WBN.Worksheets(1).Select On Error Resume Next Kill (NewFN) On Error GoTo 0 Application.DisplayAlerts = False WBN.SaveAs NewFN, FileFormat:=xlOpenXMLWorkbook Application.DisplayAlerts = True WBN.Close False ' Delete the temporary copy NewFN = "C:aaaDeleteMe.xlsm" On Error Resume Next Kill (NewFN) On Error GoTo 0 End Sub

Xem video

Bản ghi video

Học Excel từ Podcast, Tập 2213: Lưu dưới dạng sử dụng VBA, nhưng vẫn giữ nguyên trạng thái mở.

Này, chào mừng bạn trở lại với netcast. Tôi là Bill Jelen. Chà, bạn có thể nhận thấy rằng gần đây tôi đã cung cấp tải xuống từng podcast vì rất nhiều người đã yêu cầu tôi làm điều đó và vì vậy tôi đang cố gắng làm cho cuộc sống dễ dàng nhất có thể. Và toàn bộ mục đích là để lưu một bản sao mà bạn có thể tải xuống, nhưng tôi không muốn có thêm những thứ-- bạn biết đấy, những thứ dành cho mục đích sử dụng nội bộ của riêng tôi-- ở đó, vì vậy tôi muốn loại bỏ nó.

Và, bạn biết đấy, hãy giả sử rằng tôi đã gặp phải tình huống phải viết 12 sách bài tập, phải không? Mỗi người có một sản phẩm khác nhau. Vì vậy, tôi sẽ lặp lại các sản phẩm này và tôi sẽ ghi nó ở đó vào A2, sau đó lưu sổ làm việc và có thể dọn dẹp một số thứ. Ổn thỏa. Vì vậy, chuyển đầu tiên của tôi ở đây là một macro như thế này, được chứ? Vì vậy, chúng tôi xác định sổ làm việc hiện tại-- Trang tính ("Dữ liệu), Trang tính (" Báo cáo ") để tìm những thứ đó-- và sau đó tìm ra bao nhiêu hàng dữ liệu chúng ta có ngày hôm nay, chúng tôi sẽ lặp lại từ Hàng 2 xuống hàng cuối cùng, sao chép sản phẩm từ sổ làm việc dữ liệu sang sổ làm việc báo cáo.

Được rồi, và bây giờ đây là nơi tôi sắp gặp rắc rối. Vì vậy, sổ làm việc mới sẽ được gọi là "C: aaa " và sau đó là Apple.xlsx, và tôi sẽ Lưu dưới dạng, bạn biết đấy, với Apple.xlsx và thay đổi thành XML-- mở sổ làm việc xml- - sẽ loại bỏ các macro. Ổn thỏa. Nhưng bây giờ tôi muốn đóng sổ làm việc đó, nhưng rất tiếc khi bạn thực hiện Lưu dưới dạng-- hãy xem ngay bây giờ, tôi đang ở trong podcast 2013-- khi tôi thực hiện Lưu dưới dạng sau thời điểm đó trong mã, tôi không sẽ còn trong Podcast 2013; Tôi sẽ sử dụng Apple.xlsx. Ổn thỏa? Vì vậy, bây giờ, nếu tôi muốn bắt đầu xóa nội dung, tôi sẽ xóa nó trong bản sao, nhưng khi tôi đóng bản sao, tôi không thể quay lại tệp gốc. Ổn thỏa? Và macro này-- thực ra, đầu tôi sắp nổ tung khi cố tìm hiểu xem vòng lặp vẫn hoạt động hay không hoạt động,đúng? Vì vậy, tôi nghĩ Save As là một cách sai lầm khi đi đến đây.

Thực ra thì, chờ đã. Chúng ta có thể đi theo hai hướng: Đầu tiên, tôi có thể có một sổ làm việc khác mở Podcast 2213, thực hiện nội dung và sau đó Lưu Như với tên mới, hoặc tôi sẽ đi theo hướng này, được rồi, và đây là phương pháp tôi đã kết thúc bằng cách sử dụng-- được rồi, và chúng tôi sẽ xác định sổ làm việc này, nhưng sau đó cũng là một sổ làm việc mới. Đúng. Và mọi thứ vẫn diễn ra như cũ ở đây cho đến khi chúng ta đi đến điểm mà tôi chuẩn bị làm WBT.SaveAs. Kiểm tra điều này: SaveCopyAs-- bây giờ, điều này không tồn tại, theo như tôi có thể nói, trong Excel thông thường… đây chỉ là VBA. SaveCopyAs nói, "Này, hãy xem chúng tôi đang ở trong một tệp có tên là 2213 và tôi muốn bạn lấy tệp 2213 đó ở trạng thái hiện tại, lưu vào đĩa và đóng lại." Giữ tệp gốc luôn mở - 2213 vẫn mở - nhưng bây giờ chúng tôi có một tệp hoàn toàn mới trên đĩa có tên Apple.xlsm. Thực ra, lúc đầu, tôi 'Tôi sẽ gọi nó là DeleteMe.xlsm. Ổn thỏa. Nhưng nó tạo ra một bản sao giống hệt nhau và giữ tệp gốc - tệp mà macro đang chạy - mở và đó là phần quan trọng, phải không? Vì vậy, bây giờ tôi có DeleteMe ngoài đó, tôi mở nó, gán nó cho WBN, làm những việc tôi cần làm, loại bỏ tất cả các trang tính thừa-- Tôi biết mình có gì. Lưu ý, trước khi xóa trang tính, bạn muốn thực hiện DisplayAlerts = False, nếu không nó sẽ tiếp tục hỏi bạn, "Này, bạn sẽ không lấy lại được trang tính." Tôi hiểu rồi. Và sau đó, cuối cùng ở đây, chọn bảng tính đầu tiên FN sẽ là Apple.xlsx, và sau đó chúng ta có thể thực hiện WBN.SaveAs Apple, dưới dạng Open XMLWorkbook. Không có macro. Và sau đó Close-- điều tuyệt vời về Close là bây giờ tôi đã quay trở lại sổ làm việc này, 2213.Nhưng nó tạo ra một bản sao y hệt và giữ tệp gốc - tệp mà macro đang chạy - mở, và đó là phần quan trọng, phải không? Vì vậy, bây giờ tôi có DeleteMe ngoài đó, tôi mở nó, gán nó cho WBN, làm những việc tôi cần làm, loại bỏ tất cả các trang tính thừa-- Tôi biết mình có gì. Lưu ý, trước khi xóa trang tính, bạn muốn thực hiện DisplayAlerts = False, nếu không nó sẽ tiếp tục hỏi bạn, "Này, bạn sẽ không lấy lại được trang tính." Tôi hiểu rồi. Và sau đó, cuối cùng ở đây, chọn bảng tính đầu tiên FN sẽ là Apple.xlsx, và sau đó chúng ta có thể làm WBN.SaveAs Apple, dưới dạng Open XMLWorkbook. Không có macro. Và sau đó Close-- điều tuyệt vời về Close là bây giờ tôi đã quay trở lại sổ làm việc này, 2213.Nhưng nó tạo ra một bản sao y hệt và giữ tệp gốc - tệp mà macro đang chạy - mở, và đó là phần quan trọng, phải không? Vì vậy, bây giờ tôi đã có DeleteMe ở ngoài đó, tôi mở nó, gán nó cho WBN, làm những việc tôi cần làm, loại bỏ tất cả các trang tính thừa-- Tôi biết mình có gì. Lưu ý, trước khi xóa trang tính, bạn muốn thực hiện DisplayAlerts = False, nếu không nó sẽ tiếp tục hỏi bạn, "Này, bạn sẽ không lấy lại được trang tính." Tôi hiểu rồi. Và sau đó, cuối cùng ở đây, chọn bảng tính đầu tiên FN sẽ là Apple.xlsx, và sau đó chúng ta có thể thực hiện WBN.SaveAs Apple, dưới dạng Open XMLWorkbook. Không có macro. Và sau đó Close-- điều tuyệt vời về Close là bây giờ tôi đã quay trở lại sổ làm việc này, 2213.đúng? Vì vậy, bây giờ tôi có DeleteMe ngoài đó, tôi mở nó, gán nó cho WBN, làm những việc tôi cần làm, loại bỏ tất cả các trang tính thừa-- Tôi biết mình có gì. Lưu ý, trước khi xóa trang tính, bạn muốn thực hiện DisplayAlerts = False, nếu không nó sẽ tiếp tục hỏi bạn, "Này, bạn sẽ không lấy lại được trang tính." Tôi hiểu rồi. Và sau đó, cuối cùng ở đây, chọn bảng tính đầu tiên FN sẽ là Apple.xlsx, và sau đó chúng ta có thể thực hiện WBN.SaveAs Apple, dưới dạng Open XMLWorkbook. Không có macro. Và sau đó Close-- điều tuyệt vời về Close là bây giờ tôi đã quay trở lại sổ làm việc này, 2213.đúng? Vì vậy, bây giờ tôi đã có DeleteMe ở ngoài đó, tôi mở nó, gán nó cho WBN, làm những việc tôi cần làm, loại bỏ tất cả các trang tính thừa-- Tôi biết mình có gì. Lưu ý, trước khi xóa trang tính, bạn muốn thực hiện DisplayAlerts = False, nếu không nó sẽ tiếp tục hỏi bạn, "Này, bạn sẽ không lấy lại được trang tính." Tôi hiểu rồi. Và sau đó, cuối cùng ở đây, chọn bảng tính đầu tiên FN sẽ là Apple.xlsx, và sau đó chúng ta có thể làm WBN.SaveAs Apple, dưới dạng Open XMLWorkbook. Không có macro. Và sau đó Close-- điều tuyệt vời về Close là bây giờ tôi đã quay trở lại sổ làm việc này, 2213.tôi sẽ không lấy lại trang tính. "Tôi hiểu rồi. Và cuối cùng ở đây, hãy chọn trang tính đầu tiên FN sẽ là Apple.xlsx, sau đó chúng ta có thể làm WBN.SaveAs Apple, dưới dạng Open XMLWorkbook. Không có macro Và sau đó Close-- điều tuyệt vời về Close là bây giờ tôi đã quay trở lại sổ làm việc này, 2213.tôi sẽ không lấy lại trang tính. "Tôi hiểu rồi. Và cuối cùng ở đây, hãy chọn trang tính đầu tiên FN sẽ là Apple.xlsx, sau đó chúng ta có thể làm WBN.SaveAs Apple, dưới dạng Open XMLWorkbook. Không có macro Và sau đó là Đóng-- điều tuyệt vời về Đóng là bây giờ tôi đã quay lại sổ làm việc này, 2213.

Alright, it's been working really, really well, and the key to this whole thing is SaveCopyAs-- SaveCopyAs. So, to me-- well that's been around for a long time-- I never used it, and now I realize there's probably been a lot of times in the past where I should have used it. And maybe, you know, you should be using it or consider using it as well.

Okay, I forgot to mention one thing: the important thing is, with Save As Copy-- Save As Copy-- so when I do the Save As Copy, if I try to change to an xslx file type, I cannot change the file type here just by changing the extension in NewFN and when trying to open that subsequent workbook, they'll detect that it has macros, and it has the wrong extension, and it will yell at you. Right? So, you have to save it as xlsm and then later come back, reopen it, and save it as xlsx. But that all works with this macro.

So, hey, when I'm updating this book, Excel 2016, this summer, for Excel 2019, I'll make sure to include this tip. I think it's a useful tip to SaveCopyAs.

Tóm tắt từ hôm nay: Bạn muốn VBA viết một số bản sao của sổ làm việc hiện tại; Lưu Dưới dạng gây ra sự cố vì sổ làm việc gốc không còn mở nữa; thay vào đó, bạn sử dụng .SaveAsCopy để lưu bản sao của sổ làm việc. Nếu bạn muốn tải xuống sổ làm việc từ video hôm nay, bao gồm cả macro, hãy truy cập URL trong mô tả YouTube.

Tôi muốn bạn đã ghé qua, tôi sẽ gặp bạn lần sau cho một netcast khác từ.

Tải xuống tệp Excel

Để tải xuống tệp excel: save-as-keep-original-open.xlsm

Suy nghĩ của Excel trong ngày

Tôi đã hỏi những người bạn Excel Master của mình để được tư vấn về Excel. Hôm nay cần suy ngẫm:

"Ngày là những con số, không phải lời nói."

Duane Aubin

thú vị bài viết...