Tu macro podría usar .xls .xlsx .xlsm

Andy Machin, buena stardes.

He seguido la pregunta de AQUI POR EL AMIG@ Rodrigo Guerrero

Resulta interesanticima, visto interesarme por la cantidad de archivos XLSX y XLSM y alguno que otro XLS que tengo sobretodo los 2 primeros; XLSX y XLSM.

Al ejecutar tu macro m presenta error en línea

newBook.SaveAs newBookName, FileFormat:=51

aunque cambio a 52

Nombre a Libro a crear SOLO con las hojas1 de los demás libros = CONTAINER

Estas Hojas1 tienen variedos nombre, ninguna es igual, Ej.: una se llama Cotización, otra Lista, etc etc.

Visto yo querer usar archivos XLSX y XLSM de una sola ves, para 1 solo libro. El container podría ser el nombre creado por LA PROPIA MACRO

Usando SOLO archivos (libros) XLSX o SOLO XLSM Con 51 me dice igual para las dos usando una a la ves, no en conjunto sea una o sea otra extensión:

Usando con 52 y solamente con extension XLSX o SOLO extension XLSM:

También presenta error en la misma línea si uso las 2 extensiones en conjunto

Quisiera PODER usar mezcla, en el mismo container, XSLM y XSLX SI SE PUDIERA claro está.

La pregunta de las mil y una lochas, (¿cómo se dice acá) es necesario tener o crear una carpeta especifica para la colocación del container? ¿O el container va directamente a la carpeta donde están los libros de los cuales se integra la hoja1 al container.

¿Algo más que saber? Pregunte con confianza

1 Respuesta

Respuesta
2

Hello Sr.

Con gusto le ayudaré. El primer error parece que se debe a la ruta, si copió y pegó literalmente el código que le di a Rodrigo, debe asegurarse de que las rutas estén correctas y que existan.

En el código hice referencia a la primera parte de la ruta con la instrucción ThisWorkbook. Path y a ese pedazo de ruta le concatené una parte más: "\Archivos Excel\Aninado.xlsx"

Esa parte incluye una carpeta llamada Archivos Excel que debe existir (si no existe habría que crearla con otro código que no fue incluido en mi ejemplo), y el futuro nombre que tendrá el archivo con su extensión. De todo eso lo único que no tiene que existir obligatoriamente es el nombre del archivo y la extensión, el resto de la ruta (las carpetas) deben existir en la PC.

-

El segundo error es, claramente, si la extensión especificada arriba (en la ruta) no coincide con el numero del formato especificado en la instrucción SaveAs.

-

Ahora mi duda es, ¿a qué se refiere con "mezclar" dos contenedores en uno? Se refiere a crear dos versiones del mismo archivo, ¿uno con extensión XSLM y otro con extensión XSLX?

Crear dos versiones no seria tan difícil, con un par de lineas extra en mi ejemplo se podría hacer.

-

En cuanto a donde se guarda el archivo, la ruta se especifica en la linea:

Dim newBookName As String: newBookName = ThisWorkbook.Path & "\Archivos Excel\Aninado.xlsx"

Pero como le dije, cada carpeta que incluya en esa ruta debe existir. Ahora bien, se podría crear una pequeña macro o agregar unas pocas lineas extras a esa misma macro, que se encargue de chequear si esa ruta existe, y si no existe, entonces que la cree.

Andy M

No estoy seguro si mi respuesta se publicó. Esta página a veces me decepciona.

Creo que recién ahora después de mi segundo mensaje es que aparece la respuesta, déjame saber si ves algo.

Si, se veen 2 respuestas suyas

1ª respuesta:

Respuesta de Andy Machin

Ello Sr.

Con gusto le ayudaré.

2ª respuesta

No estoy seguro si mi respuesta se publicó

Y 3ª Creo que recién ahora después de mi segundo mensaje

Vale, disculpe si mi respuesta no fue de ayuda.

Salu2

Le mi 2ª mensage de arriba hacia abajo, el 2ª comentario

Container = Libro que va a recibir las hojas1 desde LIBROS XSLM y XSLX para su resguardo

Pregunto: ¿Con cuál extensión queda el container?

Cree la SUBcarpeta Archivos Excel dentro de la carpeta donde tengo los archivos XSLM y XSLX, que es D:\1\Archivos Excel.

Entiendo que ThisWorkbook. Path es la carpeta desde donde menciono los archivos a entrar su hoja al container y dentro de la SUB Archivos Excel, es donde se va a colocar el container, (Container.xlsx) lo entiendo así, ¿equivocado?

El 51 es para XLSX ¿mm? ¿Si? Creo refiere la extensión a la extensión del donde se va a copiar la hoja, ¿no el container?.

Contenedor es el que va a abarcar todas las hojas de los demás libros, un solo container. Ai tengo que crear otr ocontainer visto la cantidad de libros (hojas) a copiar al container seren muchas, pues yo mismo tendré que hacer nuevo container con más hojas, pero eso de Container, Container 1, Container 2 etc, me encargo. LO que si quisiera es poder copiar hojas al container de libros con extensión XSLM y XSLX al mismo container que va a ser uno solo en cada ejecución de la macro.

Pero como le dije, cada carpeta que incluya en esa ruta debe existir. Ahora bien, se podría crear una pequeña macro o agregar unas pocas líneas extras a esa misma macro, que se encargue de chequear si esa ruta existe, y si no existe, entonces que la cree.

Si es posible, BIEN VENIDA SEA

Serviría también si da la oportunidad de tener:

'Abre cuadro dialogo en la carpeta ThisWorkbook. Path Guardar Container desde el cuadro dialogo
    With Application.FileDialog(msoFileDialogFolderPicker) 'Abre el cuadro dialogo
        .Title = "Selecciona destino"
        .AllowMultiSelect = False
        . InitialFileName = ruta

Faltaría si la carpeta Container (Archivos Excel) no existe crearla
Si existe la carpeta Container, crear la Container2 (Container3, Container4, etc), numero sucesivo

Tal vez ( ME REFIERO A MI, YO, YO NO TU) explique o escriba mucho para tan poco

Vaya vaya, es posible hacer todo eso, pero hay dos opciones que solo "puede" ir una, debes elegir cual prefieres usar. Me refiero a esto:

'Abre cuadro dialogo en la carpeta ThisWorkbook. Path Guardar Container desde el cuadro dialogo

Si abres el cuadro de dialogo para elegir la carpeta o crearla si no existe (en el mismo cuadro de dialogo el usuario puede crear carpetas manualmente)

Entonces no tendría sentido tener una macro encargada de chequear si la carpeta existe y crearla si no. Ya que si usted la crea o la selecciona manualmente a través del cuadro de dialogo, este código no tendría utilidad, ya que la carpeta siempre existiría.

Dígame cual de las dos opciones prefiere usar:

1- Cuadro de dialogo para guardar Container.

2- Código que detecte automáticamente la existencia de la carpeta, y que la cree si no existe.


PD: El FileNumber 51, 52, etc etc... aplica para el archivo que se esta creando, osea el container, los archivos de donde vienen las hojas originales no influye su formato (siempre y cuando sean libros de Excel validos obviamente)

Tienes razón absoluta sobre crear o seleccionar carpeta.

Pero ¿puede chequear si la carpeta existe o no? Si tu respuesta es positiva

Con esta: La macro abre el cuadro de dialogo chequea si existe. Si existe ok, si no existe el usuario la crea y guarda el container. Como dices, desde el mismo cuadro de dialogo el usuario puede crear carpetas manualmente si no existe.

Bien, aquí te paso el mismo código que le hice a Rodrigo pero un poco modificado. En realidad no importa el tema de las rutas si las estas eligiendo tu con el Dialog Box.

Como le dije a él, son dos macros, pero solo debes ejecutar la primera, llamada "MultiSelector"

Cuando se ejecute esa macro, sucederá lo siguiente:

Se abrirá un Dialog Box para que escojas los archivos de donde quieres copiar las hojas. Luego que has escogido los archivos y des al botón Aceptar, aparecerá otro Dialog Box pidiéndote que selecciones la carpeta donde deseas guardar el nuevo libro que se va a generar.

Este segundo dialogo pondrá por defecto el nombre del archivo Container y la extensión .xlsm

Eso lo puedes cambiar en ese momento, puedes poner otro nombre y/o puedes cambiar la extensión a .xlsx

Solo son permitidos esos dos formatos (si quieres que agregue más, déjame saber)

A continuación el código (pega todo en un modulo estándar):

Sub MultiSelector()
Dim NombreInicial As String: NombreInicial = "Container"
Dim NumeroFormato As Byte
Dim fGuardarComo As Variant
Dim VentanaElegir As FileDialog
Dim newBookName As String
Dim newBook As Workbook
Set VentanaElegir = Application.FileDialog(msoFileDialogFilePicker)
Dim vrtSelectedItem As Variant
With VentanaElegir
    .Title = "Seleccione los archivos Excel"
    .Filters.Add "Archivos Excel", "*.xls; *.xlsx; *.xlsm", 1
    .InitialFileName = ThisWorkbook.Path
    .AllowMultiSelect = True
    If .Show = -1 Then
        With Application
            .ScreenUpdating = False
            .EnableEvents = False
            .DisplayAlerts = False
            .DisplayStatusBar = False
            .Calculation = xlCalculationManual
        End With
        fGuardarComo = Application.GetSaveAsFilename(InitialFileName:=NombreInicial, fileFilter:="Excel Macro-Enabled (*.xlsm), *.xlsm, Excel File (*.xlsx), *.xlsx")
        If fGuardarComo <> False Then
        Set newBook = Workbooks.Add
            For Each vrtSelectedItem In .SelectedItems
                Call CrearAnidado(vrtSelectedItem, newBook)
            Next
        newBook.Sheets(1).Delete
        If Right(fGuardarComo, 1) = "m" Then NumeroFormato = 52 Else NumeroFormato = 51
        newBook.SaveAs fGuardarComo, NumeroFormato
        newBook.Close
        End If
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .DisplayAlerts = True
            .DisplayStatusBar = True
            .Calculation = xlCalculationAutomatic
        End With
    Else
        'Aquí no va nada, dejalo así, esto determina si se dio
 'click en cancelar y no se selecciono ningún archivo
 'osea si se interrumpió el proceso que no suceda nada
    End If
End With
Set VentanaElegir = Nothing
End Sub
Sub CrearAnidado(fPath As Variant, LibroAnidado As Workbook)
Dim shts As Worksheet
Dim LibroOrigen As Workbook
Set LibroOrigen = Workbooks.Open(fPath)
For Each shts In LibroOrigen.Worksheets
    shts.Copy After:=LibroAnidado.Worksheets(LibroAnidado.Sheets.Count)
Next shts
LibroOrigen.Close SaveChanges:=True
End Sub

Andy

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas