Saltar al contenido

Consultar última fila con datos de otro libro sin seleccionarlo


Recommended Posts

Hola que tal, un saludo a todos.

Mi consulta creo que es muy sencilla (cuando se sabe claro), y es que tengo una hoja donde importo datos de otro libro pero que no conozco el nombre, ya que es un reporte del banco y cada vez me lo da de distinta forma.

La cuestión es que necesito saber cual es la última fila de ese libro con datos para poder copiarlas todas y pegarlas en el libro de destino, que es el que tiene la macro. Por razones de "afinamiento" del código no quiero seleccionarlo, sinó que, quiero consultar simplemente, porque me he dado cuenta que aunque se tenga el "Application.ScreenUpdating = False" da un pequeño pantallazo. La línea que he puesto me da error, en cambio, para cargar la variable con el nombre del libro no me da error.

Pongo parte  del código aquí. No subo ejemplo porque lo único que necesito es que alguien me corrija la línea esta.

Workbooks(OtroLibro).Activate ' <<<----Esta línea es la que quiero evitar.
           OtraHoja = ActiveSheet.Name
           UltimaFila = Workbooks(OtroLibro).Sheets(OtraHoja).Range("A" & Cells.Rows.Count).End(xlUp).Row '<<<---Esta es la que me da error si no está activo.
           Range("A5:A" & UltimaFila).Copy

 

Insisto que es parte del código que mas arriba entro sin problemas para llenar la variable "OtroLibro"

Muchas gracias por vuestra atención y saludos.

 

Enlace a comentario
Compartir con otras webs

A priori yo cambiaría

UltimaFila = Workbooks(OtroLibro).Sheets(OtraHoja).Range("A" & Cells.Rows.Count).End(xlUp).Row 

por esta otra

UltimaFila = Workbooks(OtroLibro).Sheets(OtraHoja).Range("A1048576").End(xlUp).Row 

Aunque coincido con Macro Antonio que sin todo el contexto es difícil deducir que puede ser...

Saludos

Enlace a comentario
Compartir con otras webs

Gracias por la rapidez en la respuesta.

Quizás mi error ha sido de cálculo en lo de solo publicar el trocito de código.

Sub ImportING()
Dim PrimeraFila As Integer, UltimaFila As Integer, FilaOtroLibro As Integer
Dim NumCuentaOrigen As String, NumCuentaDestino As String, OtraHoja As String, Entidad As String
Dim OtroLibro As String

Application.ScreenUpdating = False

'Verificamos si el libro es correcto
    OtroLibro = Workbooks(2).Name
    NumCuentaDestino = Sheets("Parámetros").Range("C2").Value
    NumCuentaOrigen = Workbooks(OtroLibro).Sheets(1).Cells(1, 2).Value '<<<--Aquí entra sin problemas

    If NumCuentaDestino <> NumCuentaOrigen Then
        MsgBox "EL LIBRO ABIERTO NO ES DE ING", vbExclamation, "IMPORTACIÓN DATOS"
    Else

'Verifica última fila con datos de esta hoja
    UltimaFila = 1 + Range("A" & Rows.Count).End(xlUp).Row
          
       'Copia y pega fechas
           Workbooks(OtroLibro).Activate ' <<<----Esta línea es la que quiero evitar.
           OtraHoja = ActiveSheet.Name
           FilaOtroLibro = Workbooks(OtroLibro).Sheets(OtraHoja).Range("A" & Cells.Rows.Count).End(xlUp).Row '<<<---Esta es la que me da error si no está activo.
           Range("A5:A" & FilaOtroLibro).Copy
           ThisWorkbook.Activate
           Range("A" & UltimaFila).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
               :=False, Transpose:=False
              
       'Copia y pega Descripción
           Workbooks(OtroLibro).Worksheets(OtraHoja).Range("D5:D" & FilaOtroLibro).Copy
           Range("C" & UltimaFila).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
               :=False, Transpose:=False
              
       'Copia y pega Importe
           Workbooks(OtroLibro).Worksheets(OtraHoja).Range("I5:I" & FilaOtroLibro).Copy
           Range("D" & UltimaFila).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
               :=False, Transpose:=False
              
       'Añade Entidad en columna E
            PrimeraFila = UltimaFila
            UltimaFila = Range("A" & Rows.Count).End(xlUp).Row
            Entidad = Sheets("Parámetros").Range("B2").Value
              
            For x = PrimeraFila To UltimaFila
                Cells(x, 5) = Entidad
            Next x
           
       'Autoajuste filas
           Range(Cells(PrimeraFila, 3), Cells(UltimaFila, 3)).Select
          
           With Selection
               .WrapText = True
           End With
          
        'Importes a positivos
           Cells(3, 4).Select
           Call NegativoPositivo
    End If
 

Application.ScreenUpdating = True
Application.CutCopyMode = False
Cells(4, 1).Select
End Sub

 

He de aclarar que tal cual está funciona pero me gustaría darle un "toque" más profesional.

Gracias

Enlace a comentario
Compartir con otras webs

Prueba a ver si es esto.

Fíjate que no es necesario activar ni libros, ni hojas, ni rangos para copiar y pegar.

 

Sub ImportING()
   Dim PrimeraFila As Integer, UltimaFila As Integer, FilaOtroLibro As Integer
   Dim NumCuentaOrigen As String, NumCuentaDestino As String, Entidad As String
   Dim HojaOrigen As Worksheet
   Dim Parámetros As Worksheet
   Dim HojaDestino As Worksheet
   
   'Asignamos valores a las variables
   Set HojaDestino = Workbooks(1).ActiveSheet
   Set Parámetros = Workbooks(1).Sheets("Parámetros")
   Set HojaOrigen = Workbooks(2).ActiveSheet

   'Verificamos si el libro es correcto
   Application.ScreenUpdating = False
   NumCuentaDestino = Parámetros.Range("C2").Value
   NumCuentaOrigen = HojaOrigen.Range("B1").Value '<<<--Aquí entra sin problemas
   
   If NumCuentaDestino <> NumCuentaOrigen Then
       MsgBox "EL LIBRO ABIERTO NO ES DE ING", vbExclamation, "IMPORTACIÓN DATOS"
   Else

   'Verifica última fila con datos de esta hoja
   UltimaFila = 1 + HojaDestino.Range("A" & Rows.Count).End(xlUp).Row
      
   'Copia y pega fechas
       FilaOtroLibro = HojaOrigen.Range("A" & Cells.Rows.Count).End(xlUp).Row
       HojaOrigen.Range("A5:A" & FilaOtroLibro).Copy
       HojaDestino.Range("A" & UltimaFila).PasteSpecial xlPasteValues
          
   'Copia y pega Descripción
       HojaOrigen.Range("D5:D" & FilaOtroLibro).Copy
       HojaDestino.Range("C" & UltimaFila).PasteSpecial xlPasteValues
          
   'Copia y pega Importe
       HojaOrigen.Range("I5:I" & FilaOtroLibro).Copy
       HojaDestino.Range("D" & UltimaFila).PasteSpecial xlPasteValues
          
   'Añade Entidad en columna E
        PrimeraFila = UltimaFila
        UltimaFila = HojaDestino.Range("A" & Rows.Count).End(xlUp).Row
        Entidad = Parámetros.Range("B2").Value
        For x = PrimeraFila To UltimaFila
            HojaDestino.Cells(x, 5) = Entidad
        Next x
       
   'Autoajuste filas
       HojaDestino.Range(Cells(PrimeraFila, 3), Cells(UltimaFila, 3)).WrapText = True
      
    'Importes a positivos
       HojaDestino.Cells(3, 4).Select
       Call NegativoPositivo
   End If

   Application.ScreenUpdating = True
   Application.CutCopyMode = False
   HojaDestino.Cells(4, 1).Select
End Sub


 

Enlace a comentario
Compartir con otras webs

Gracias Macro Antonio, precisamente esa es la idea, el no activar nadq y así evitar esos pequeños pantallazos que salen cuqndo se cambia de hoja.

Ahora estoy en el móvil, cuqndo llegue a casa le hecho un vistazo, pero tiene buena pinta, veo que le has puesto a las variables el Set que no lo había usado nunca.

Comento luego

Enlace a comentario
Compartir con otras webs

No he podido probar porqué el archivo origen me da error de lectura, ya que no puede abrir archivos .xls 64 bits.

Si no se soluciona con lo siguiente, vuélvelo a subir como xlsx.

De todas formas creo que los tiros van por aquí:

Sustituye:

FilaOtroLibro = HojaOrigen.Range("A" & Cells.Rows.Count).End(xlUp).Row '<<<<<-------AQUI EL ERROR <<<<<<<<<<<<<<

 

Por:

FilaOtroLibro = HojaOrigen.Range("A" & Rows.Count).End(xlUp).Row 

 

Enlace a comentario
Compartir con otras webs

Hola. Macro Antonio, era eso que tú comentabas, la extensión del archivo. Es un archivo que te genera una entidad bancaria y tal cual me daba error, si le cambio a .xlsx ya no ha dado error.

La línea que me has mandado funciona en ambos casos, no me ha hecho falta cambiarla.

Como siempre, mil gracias.

TEMA SOLUCIONADO

Enlace a comentario
Compartir con otras webs

  • Silvia bloqueó este tema

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 97 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
    • Agradecido Antoni! Tus sugerencias me ayudaron mucho! Como pudiese hacerte llegar el archivo?
    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
    • Hola a ambos, @MarianoCruz, si con la respuesta de @Israel Cassales ya tienes resuelto el problema, perfecto. Punto final y a otra cosa. Pero piensa que tu archivo lleva vínculos externos, así que se hace difícil (prácticamente imposible) comprobar si las propuestas dadas ofrecen el resultado esperado. A tal efecto, te sugiero que vuelvas a subir otro archivo, esta vez insertando nuevas hojas que contengan los datos existentes en esos archivos externos.  Tal vez así se vea claro qué es lo que buscas conseguir, y se puedan hacer pruebas que verifiquen la bondad de el/los resultado/s. Tampoco iría mal que insertaras a mano qué resultado debe aparecer en la celda C3 en cada uno de los 3 casos: cuando se inserte 'XI', 'XL' o unos u otros números en los lugares apropiados. Así iremos totalmente sobre seguro acerca del método a emplear. Saludos,
    • Hi Trate de ver que hacían las fórmulas en cuestión pero a su libro le falta o le faltan hojas, por lo que solo podría participar con un par de ideas en general. Lo que entiendo es que según el valor de B3 en C3 debe poner una fórmula u otra, así que es posible que si combina DIRECCION() con INDIRECTO() pueda intercambiar de una fórmula a otra. =SI(B3="Xl",INDIRECTO(DIRECCION(3,5)),SI(O(B3=1,B3=2,B3=3),INDIRECTO(DIRECCION(4,5)),"")) Otra forma sería poner nombre a esas fórmulas en el cuadro de nombres para que las pueda mandar llamar a una o a la otra según el resultado de B3. Por favor tome en cuenta, es solo una idea.
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.