Contar Libros Abiertos en excel con macros y getopenfile

Hola estimados,

He estado haciendo una macro para que me cuente los libros seleccionados pero la verdad que no he podido hacerlo:

Aqui es donde selecciono y luego trato de contar los archivos seleccionados

MiArchivo = Application.GetOpenFilename("Archivos Excel (*.xls*), *.xls*", , "Selecciona los archivos a trabajar", , True)
If TypeName(MiArchivo) = "Boolean" Then Exit Sub
For I = LBound(MiArchivo) To UBound(MiArchivo)
Workbooks.OpenText Filename:=MiArchivo(I)
Archivo = Archivo + 1
Next I

Luego lo utilizo en este codigo siguiente

Fin = Archivo
For vlLibro = 1 To Fin
vlContLib = vlLibro
Nombrelibro = Workbooks(vlContLib).Name
If Nombrelibro = Reporte Then
vlContLib = vlContLib + 1

Luego utilizo otros codigos para jalar la informacion pero en esencia es este y he notado que no me cuenta todos los libros, por ejemplo si solo selecciono 1 solo libro no me cuenta, pero si selecciono 2 solo me cuenta 1.

Espero puedan ayudarme, 

Gracias.

1 respuesta

Respuesta
1

Veo que tienes varios contadores.

En primer lugar en UBound(miarchivo), ya tienes el número de archivo seleccionados

Después tienes esto

    Archivo = Archivo + 1, en esta variable ya tienes el total de libros abiertos

Seguido de esto:

Fin = Archivo, en la variable "Fin" ahora también tiene el total de libros.

En el siguiente for tienes esto:

VlContLib = vlLibro, lo que estás haciendo es pasar el valor de vlLibro a vlContLib

Y por último tienes una condición

        If Nombrelibro = Reporte Then
            vlContLib = vlContLib + 1
        End If

No sé a cuál contador te refieres.

- UBound(miarchivo)

- Archivo

- Fin

- VlContLib

Si te refieres a este: "vlContLib, solamente te va a contar los libros que son iguales a la variable "Reporte"


Te explico lo que haces con esta instrucción:

Workbooks(vlContLib). Name

Lo que estás haciendo es tomar el nombre del libro según el índice de libros abiertos.

Seleccionas 2 libros y los abres, en realidad tienes 3 libros abiertos, el primer libro corresponde al libro que tiene la macro.

Entonces tu for debería empezar en el índice 1 y acabar en el fin +1, de esa forma abarcas los 3 libros abiertos, puede ser así:

    Fin = Archivo
    For vlLibro = 1 To Fin + 1
        vlContLib = vlLibro
        Nombrelibro = Workbooks(vlContLib).Name
        If Nombrelibro = Reporte Then
            VlContLib = vlContLib + 1

Recomendación: no utilices muchas variables para lo mismo, como te dije ya tienes el número de libros en ubound, puedes utilizarlo así:

    miarchivo = Application.GetOpenFilename("Archivos Excel (*.xls*), *.xls*", , "Selecciona los archivos a trabajar", , True)
    If TypeName(miarchivo) = "Boolean" Then Exit Sub
    For I = LBound(miarchivo) To UBound(miarchivo)
        Workbooks.OpenText Filename:=miarchivo(I)
    Next I
    vlContLib = 1
    For I = 2 To UBound(miarchivo) + 1
        If Workbooks(I).Name = Reporte Then
            vlContLib = vlContLib + 1
        End If
    Next

Lo que no entendí es si vlContLib debe empezar en 1 o en 0.


Utiliza cualquiera de las 2 opciones.

Saludos. Dante Amor

No olvides valorar la respuesta.

Se me pasó, si quieres revisar todos los libros abiertos, también puedes hacerlo con esta opción:

    miarchivo = Application.GetOpenFilename("Archivos Excel (*.xls*), *.xls*", , "Selecciona los archivos a trabajar", , True)
    If TypeName(miarchivo) = "Boolean" Then Exit Sub
    For I = LBound(miarchivo) To UBound(miarchivo)
        Workbooks.OpenText Filename:=miarchivo(I)
    Next I
    For Each wb In Workbooks
        If wb.Name = Reporte Then vlContLib = vlContLib + 1
    Next

De esta forma te olvidas de tanta variable.

MiArchivo = Application.GetOpenFilename("Archivos Excel (*.xls*), *.xls*", , "Selecciona los archivos a trabajar", , True)
If TypeName(MiArchivo) = "Boolean" Then Exit Sub
For I = LBound(MiArchivo) To UBound(MiArchivo)
Workbooks.OpenText Filename:=MiArchivo(I)
Next I
Reporte = ActiveSheet.Parent.Name
Call UbicacionCampos
Fin = Archivo
For vlLibro = 1 To Fin
    vlContLib = vlLibro
    Nombrelibro = Workbooks(vlContLib).Name
If Nombrelibro = Reporte Then
    vlContLib = vlContLib + 1
Else
    'Buscar duplicados
    Workbooks(Nombrelibro).Activate
    NCot = Range("K4").Value
    Call ContadorCel
    CantLin = vlCont - 2
    Workbooks(Reporte).Activate
    Call ContadorCel
    FinReport = vlCont + 6
    Final = FinReport + CantLin
For X = 9 To Final
    PosBus = CStr(Código) + CStr(X)
    CodRepor = Range(PosBus).Value
        If NCot = CodRepor Then
        C = 1
        End If
Next X
If C = 1 Then
vlContLib = vlContLib + 1
C = 0
Else
    Call Copiarinfo
    Call Formulas
    Call Formatos
End If
End If
Next vlLibro


Lo que sucede es que quiero que solo copie la informacion de los libros seleccionados, realice las sugerencias que me indicaste pero aun asi cuando ejecuto la macro solo me copia un archivo y no los demas,por ejemplo abri dos libros pero solo me reconoce 1.

Pero no veo que hayas puesto

For vlLibro = 1 To Fin + 1

Pero si vas a trabajar con los libros seleccionados no utilices esto

Nombrelibro = Workbooks(vlContLib). Name

Con esa instrucción lo que haces es leer los libros abiertos, es decir, si tienes 5 libros abiertos y luego seleccionas 2, entonces tienes ahora 7 libros.

¿Qué es lo que quieres leer los 2 libros que acabas de abrir o leer los 7 libros?

Solo los q

Solo los que acabo de abrir, osea como mencionaste, yo ya tengo dos libros abiertos pero solo quiero que lea solo los 2 libros que acabo de seleccionar o abrir.

No puedo probarla completa, porque no tengo todas las funciones, pero prueba con esto:

Sub seleccionados()
'Mod.Por.DAM
    MiArchivo = Application.GetOpenFilename("Archivos Excel (*.xls*), *.xls*", , "Selecciona los archivos a trabajar", , True)
    If TypeName(MiArchivo) = "Boolean" Then Exit Sub
    '
    For i = LBound(MiArchivo) To UBound(MiArchivo)
        Workbooks.OpenText Filename:=MiArchivo(i)
    Next i
    '
    Reporte = ThisWorkbook.Name
    '
    Call UbicacionCampos
    '
    For i = LBound(MiArchivo) To UBound(MiArchivo)
        'Buscar duplicados
        arch = LTrim(Mid(MiArchivo(i), 1 + InStrRev(MiArchivo(i), "\")))
        Workbooks(arch).Activate
        '
        NCot = Range("K4").Value
        Call ContadorCel
        CantLin = vlCont - 2
        Workbooks(Reporte).Activate
        Call ContadorCel
        FinReport = vlCont + 6
        Final = FinReport + CantLin
        '
        For X = 9 To Final
            PosBus = CStr(Código) + CStr(X)
            CodRepor = Range(PosBus).Value
            If NCot = CodRepor Then
                C = 1
            End If
        Next X
        '
        If C = 1 Then
            vlContLib = vlContLib + 1
            C = 0
        Else
            Call Copiarinfo
            Call Formulas
            Call Formatos
        End If
    Next
End Sub
Sub Copiarinfo()
    Call ContadorCel
    FinReport = vlCont + 6
    Workbooks(Nombrelibro).Activate
    Call ContadorCel
    CantLin = vlCont - 2
    Workbooks(Reporte).Activate
    Final = FinReport + CantLin
For I = 9 To Final
vlPos = N° + CStr(I) 'Condicional en el campo de Número
If Len(Range(vlPos).Value) = 0 Then
B = B + 1
A = 22 + B 'Hacer referencia a la columna del Cotizador donde se encuentra la información
Call DatosTecEco
Call DatosFijos
End If
Next I
A = 0
B = 0
End Sub
Sub DatosTecEco()
'Posición de Línea
    Workbooks(Nombrelibro).Activate
    vlPoslin = "B" + CStr(A)
    Linea = Range(vlPoslin).Value
    Workbooks(Reporte).Activate
    vlPos = N°Línea + CStr(I)
    Range(vlPos).Value = Linea
'Tipo de Ahorro
    Workbooks(Nombrelibro).Activate
    vlPoscot = "O" + CStr(A)
    TipAho = Range(vlPoscot).Value
    Workbooks(Reporte).Activate
    vlPos = TipodeCálculoAhorro + CStr(I)
    Range(vlPos).Value = TipAho
'Marca
    Workbooks(Nombrelibro).Activate
    vlPoscot = "C" + CStr(A)
    MarcaR = Range(vlPoscot).Value
    Workbooks(Reporte).Activate
    vlPos = Marca + CStr(I)
    Range(vlPos).Value = MarcaR
end sub


Si disculpa es que el archivo es bien extenso y no se si tendrás el time de revisarlo, además del problema radica que el nombre NOMBRELIBRO se repite en las demás macros por ejemplo las indicadas

Dante me sirvió mucho ya pude solucionar el problema de seleccionar solo los libros que elijo, ahora se me presento el problema de cerrar esos mismos libros una vez terminada la operación, haré otra pregunta para que me orientes,

Saludos

Solo quisiera saber que es l que hace esto:

arch = LTrim(Mid(MiArchivo(i), 1 + InStrRev(MiArchivo(i), "\")))

Dante volví a revisar y hay un error, en mi otra pregunta esta como lo hice pero el problema esta en que debo repetir varias veces la misma macro, por ejemplo si seleccione 3 libros y ejecuto la macro solo me ejecuta la macro para un libro, si vuelvo a ejecutar otra vez la macro me realiza para el siguiente libro y así hasta la cantidad de libros que tengo abierto y que seleccione.

Ya lo corregí

En la variable MiArchivo tienes la ruta y el nombre del archivo.

Con esto

arch = LTrim(Mid(MiArchivo(i), 1 + InStrRev(MiArchivo(i), "\")))

Obtienes únicamente el nombre del archivo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas