Hay muchas ocasiones en un mes en las que necesito un libro de Excel para crear muchas copias de sí mismo. Por lo general, me meto en un error de lógica al abrir * el * libro de trabajo y comienzo a escribir código para recorrer una lista y usar Archivo, Guardar como para guardar una copia del libro de trabajo.
Aquí está el diagrama de flujo:
¿Ves el problema de arriba? La macro se está ejecutando en WorkbookA. Cuando guardo el archivo como RegionEast.xlsx y luego cierro RegionEast.xlsx, la macro dejará de ejecutarse.
Por lo general, me sumerjo profundamente en el pseudocódigo antes de ver el problema.
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
Si hubiera estado pensando en el futuro, habría creado una solución de dos libros de trabajo. Coloque todas las macros en WorkbookA. Coloque todos los datos en WorkbookB. Haga que WorkbookA abra WorkbookB repetidamente, cambie los datos, SaveAs, Close.
A medida que envejezco y me vuelvo más irritable, descubro que estoy menos de humor para ir con algo más complicado. Especialmente porque tengo la mayor parte del código funcionando para el comando SaveAs original.
El artículo de hoy trata sobre el impresionante método VBA para SaveAsCopy. Este comando mantendrá WorkbookA abierto y llamado WorkbookA. La macro puede seguir ejecutándose. Pero escribirá el estado actual del libro de trabajo en un nuevo libro cerrado llamado WorkbookB.
Esto me permite volver al diagrama de flujo original:
Sin embargo, descubrí un problema con SaveAsCopy. Cuando hago ThisWorkbook.SaveAs, puedo elegir si quiero guardar como XLSX o XLSM. Si necesito que las macros estén disponibles en el nuevo libro de trabajo, entonces uso XLSM. De lo contrario, uso XLSX y las macros desaparecerán.
Desafortunadamente, si está en un libro de trabajo XLSM, no puede guardar correctamente .SaveAsCopy y cambiar a XLSX. El código funcionará. Pero el libro de trabajo resultante no se abrirá ya que Excel detecta una falta de coincidencia entre el tipo de archivo y la extensión del archivo.
Mi solución es SaveAsCopy como XLSM. Una vez que se guarda la copia, puedo abrir el libro de trabajo (creando dos copias del libro de trabajo en la memoria) y luego Guardar como 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
Ver video
Transcripción del video
Aprenda Excel de Podcast, Episodio 2213: Guarde como usando VBA, pero mantenga el original abierto.
Oye, bienvenido de nuevo al netcast. Soy Bill Jelen. Bueno, habrás notado que he estado ofreciendo la descarga de cada podcast recientemente porque mucha gente me lo ha estado pidiendo, por lo que estaba tratando de hacer la vida lo más fácil posible. Y todo el objetivo era guardar una copia que puedas descargar, pero no quería el material adicional, ya sabes, el material que es para mi propio uso interno, ahí, así que quería deshacerme de eso.
Y, ya sabes, digamos que tuve una situación en la que tuve que escribir 12 libros de trabajo, ¿verdad? Cada uno con un producto diferente. Entonces, voy a recorrer estos productos y escribirlo allí en A2 y luego guardar el libro de trabajo, y tal vez limpiar algunas cosas. Bien. Entonces, mi primer paso por aquí es una macro como esta, ¿de acuerdo? Entonces, definimos el libro de trabajo actual - Hojas de trabajo ("Datos), Hojas de trabajo (" Informe ") para encontrarlos - y luego averiguamos cuántas filas de datos tenemos hoy, vamos a recorrer desde la Fila 2 hasta la última fila, copie el producto del libro de trabajo de datos en el libro de trabajo del informe.
Muy bien, y ahora aquí es donde estoy a punto de meterme en problemas. Entonces, el nuevo libro de trabajo se llamará "C: aaa " y luego Apple.xlsx, y voy a Guardar como, ya sabes, con Apple.xlsx, y cambiar a XML (abrir libro de trabajo xml) - lo que eliminará las macros. Bien. Pero ahora me gustaría cerrar ese libro de trabajo, pero desafortunadamente cuando haces un Guardar como (mira ahora mismo, estoy en el podcast 2013) cuando hago un Guardar como después de ese punto en el código, no soy ya estará en Podcast 2013; Estaré en Apple.xlsx. ¿Bien? Entonces, ahora, si quiero comenzar a eliminar cosas, las eliminaré en la copia, pero cuando cierre la copia, bueno, no puedo volver al archivo original. ¿Bien? Y esta macro, en realidad, mi cabeza está a punto de explotar tratando de averiguar si el bucle seguirá funcionando o no,¿derecho? Así que creo que Guardar como es la forma incorrecta de hacerlo.
Bueno, en realidad, espera. Podríamos seguir dos rutas: primero, podría tener otro libro de trabajo que abra Podcast 2213, haga las cosas y luego guarde como con el nuevo nombre, o voy a ir por este camino, está bien, y este es el método que terminé usando-- está bien, y vamos a definir este libro de trabajo, pero también un nuevo libro de trabajo. Correcto. Y todo sigue igual aquí abajo hasta que llegamos al punto en el que estaba a punto de hacer WBT.SaveAs. Mira esto: SaveCopyAs-- ahora, esto no existe, por lo que puedo decir, en Excel normal … esto es solo VBA. SaveCopyAs dice: "Oye, mira, estamos en un archivo llamado 2213 y quiero que tomes ese archivo 2213 en su estado actual, lo guardes en el disco y lo cierres". Mantenga abierto el archivo original (2213 permanece abierto), pero ahora tenemos un archivo nuevo en el disco llamado Apple.xlsm. En realidad, al principio,Voy a llamarlo DeleteMe.xlsm. Bien. Pero crea una copia idéntica y mantiene abierto el archivo original, el archivo en el que se ejecuta la macro, y esa es la parte importante, ¿verdad? Así que ahora que tengo DeleteMe, lo abro, lo asigno a WBN, hago las cosas que tengo que hacer, me deshago de todas las hojas adicionales, sé lo que tengo. Observe que, antes de eliminar las hojas, desea hacer DisplayAlerts = False; de lo contrario, le sigue preguntando: "Oye, no vas a recuperar la hoja". Lo entiendo. Y luego, finalmente aquí, seleccione la primera hoja de trabajo que FN será Apple.xlsx, y luego podemos hacer WBN.SaveAs Apple, como un Open XMLWorkbook. Sin macros. Y luego Close: lo hermoso de Close es que ahora estoy de vuelta en este libro de trabajo, 2213.Pero crea una copia idéntica y mantiene abierto el archivo original, el archivo en el que se ejecuta la macro, y esa es la parte importante, ¿verdad? Así que ahora que tengo DeleteMe, lo abro, lo asigno a WBN, hago las cosas que tengo que hacer, me deshago de todas las hojas adicionales, sé lo que tengo. Observe que, antes de eliminar las hojas, desea hacer DisplayAlerts = False; de lo contrario, le sigue preguntando: "Oye, no vas a recuperar la hoja". Lo entiendo. Y luego, finalmente aquí, seleccione la primera hoja de trabajo que FN será Apple.xlsx, y luego podemos hacer WBN.SaveAs Apple, como un Open XMLWorkbook. Sin macros. Y luego Close: lo hermoso de Close es que ahora estoy de vuelta en este libro de trabajo, 2213.Pero crea una copia idéntica y mantiene abierto el archivo original, el archivo en el que se ejecuta la macro, y esa es la parte importante, ¿verdad? Así que ahora que tengo DeleteMe, lo abro, lo asigno a WBN, hago las cosas que tengo que hacer, me deshago de todas las hojas adicionales, sé lo que tengo. Observe que, antes de eliminar las hojas, desea hacer DisplayAlerts = False; de lo contrario, le sigue preguntando: "Oye, no vas a recuperar la hoja". Lo entiendo. Y luego, finalmente aquí, seleccione la primera hoja de trabajo que FN será Apple.xlsx, y luego podemos hacer WBN.SaveAs Apple, como un Open XMLWorkbook. Sin macros. Y luego Close: lo hermoso de Close es que ahora estoy de vuelta en este libro de trabajo, 2213.¿derecho? Así que ahora que tengo DeleteMe, lo abro, lo asigno a WBN, hago las cosas que tengo que hacer, me deshago de todas las hojas adicionales, sé lo que tengo. Observe que, antes de eliminar las hojas, desea hacer DisplayAlerts = False; de lo contrario, le sigue preguntando: "Oye, no vas a recuperar la hoja". Lo entiendo. Y luego, finalmente aquí, seleccione la primera hoja de trabajo que FN será Apple.xlsx, y luego podemos hacer WBN.SaveAs Apple, como un Open XMLWorkbook. Sin macros. Y luego Close: lo hermoso de Close es que ahora estoy de vuelta en este libro de trabajo, 2213.¿derecho? Así que ahora que tengo DeleteMe, lo abro, lo asigno a WBN, hago las cosas que tengo que hacer, me deshago de todas las hojas adicionales, sé lo que tengo. Observe que, antes de eliminar las hojas, desea hacer DisplayAlerts = False; de lo contrario, le sigue preguntando: "Oye, no vas a recuperar la hoja". Lo entiendo. Y luego, finalmente aquí, seleccione la primera hoja de trabajo que FN será Apple.xlsx, y luego podemos hacer WBN.SaveAs Apple, como un Open XMLWorkbook. Sin macros. Y luego Close: lo hermoso de Close es que ahora estoy de vuelta en este libro de trabajo, 2213.no voy a recuperar la hoja ". Lo entiendo. Y luego, finalmente aquí, seleccione la primera hoja de trabajo FN va a ser Apple.xlsx, y luego podemos hacer WBN.SaveAs Apple, como un Open XMLWorkbook. Sin macros .Y luego Close: lo hermoso de Close es que ahora estoy de vuelta en este libro de trabajo, 2213.no voy a recuperar la hoja ". Lo entiendo. Y luego, finalmente aquí, seleccione la primera hoja de trabajo FN va a ser Apple.xlsx, y luego podemos hacer WBN.SaveAs Apple, como un Open XMLWorkbook. Sin macros .Y luego Close: lo hermoso de Close es que ahora estoy de vuelta en este libro de trabajo, 2213.
Muy bien, ha funcionado muy, muy bien, y la clave de todo esto es SaveCopyAs-- SaveCopyAs. Entonces, para mí, bueno, eso ha existido durante mucho tiempo, nunca lo usé, y ahora me doy cuenta de que probablemente ha habido muchas veces en el pasado en las que debería haberlo usado. Y tal vez, ya sabes, deberías usarlo o considerar usarlo también.
De acuerdo, olvidé mencionar una cosa: lo importante es que con Guardar como copia, Guardar como copia, cuando hago Guardar como copia, si intento cambiar a un tipo de archivo xslx, no puedo cambiar el archivo. escriba aquí simplemente cambiando la extensión en NewFN y cuando intenten abrir ese libro de trabajo posterior, detectarán que tiene macros y que tiene la extensión incorrecta, y le gritarán. ¿Correcto? Por lo tanto, debe guardarlo como xlsm y luego volver, volver a abrirlo y guardarlo como xlsx. Pero todo eso funciona con esta macro.
Entonces, oye, cuando actualice este libro, Excel 2016, este verano, para Excel 2019, me aseguraré de incluir este consejo. Creo que es un consejo útil para SaveCopyAs.
Resumen a partir de hoy: desea que VBA escriba varias copias del libro de trabajo actual; Guardar como causa problemas porque el libro de trabajo original ya no está abierto; en su lugar, usa .SaveAsCopy para guardar una copia del libro. Si desea descargar el libro de trabajo del video de hoy, incluida la macro, visite la URL en la descripción de YouTube.
Quiero que pases por aquí, nos vemos la próxima vez para otro netcast de.
Descargar archivo de Excel
Para descargar el archivo de Excel: save-as-manteniendo-original-open.xlsm
Pensamiento del día de Excel
Les he pedido a mis amigos de Excel Master sus consejos sobre Excel. Pensamiento de hoy para reflexionar:
"Las fechas son números, no palabras".
Duane Aubin