Macro para copiar filas de datos encabezadas por su concepto de varias hojas e Excel de un libro i copiarlas en otro libro

Estoy intentando intentando crear un histórico a partir de varias hojas donde tengo datos de varias empresas por periodos,

Ej.

hoja 1= empresa 1 2015

hoja 2= empresa 1 2016

hoja 3= Empresa 2 2015

...

estos datos están clasificados por conceptos. Columna A

El caso es que necesito que estos datos se copien siguiendo el orden establecido de la página destino. Columna A

El programa que tengo hasta la fecha es el siguiente:

Sub ordenar_tarifas() 

Application.ScreenUpdating = False

Application.DisplayAlerts = False

Dim Tar As Range

Dim col As Range

Dim ArchivoEntrada As String

Set l1 = ThisWorkbook

Set h1 = l1.Worksheets("Tarifas")

Range("A2").Select

Range(Selection, Selection.End(xlDown)).Select

Set Tar = Selection

ArchivoEntrada = "C:\Julen\Excel mesos empresas\Macro meses Empresa"

Set l2 = Workbooks.Open(ArchivoEntrada, True, True)

ws_count = l2.Sheets.Count

For i = 2 To Tar.Count + 1

   For j = 2 To ws_count + 1

       Set h2 = l2.Worksheets(j)

       Range("A3").Select

       Range(Selection, Selection.End(xlDown)).Select

       Set col = Selection

       For k = 3 To col.Count + 2

             If h1.Cells(i, 1) = h2.Cells(k, 1) Then

                h2.Select

                 h2.Cells(k, 2).Select

                 h2.Range(Selection, Selection.End(xlToRight)).Copy

                 h1.Select

                 h1.Cells(i, 1).Select

                 h1.Range(Selection, Move.End(xlToRight)).Paste

             End If

       Next k    

   Next j

Next i

MsgBox ("Fin")

End Sub

Este siempre me esta dando errores de método select sin importar que haga.

1 respuesta

Respuesta
1

Puede subir una imagen de sus archivo para intentar ayudarle

Ya he solucionado dichos problemas. No obstante sigo teniemdo problemas para copiar las líneas de longitud variable al final de los datos que ya se encuentran al final de la línea destino.

Queria saber ai hay algun comando para pegar un rango sin tener k especificar su dimension a la hora de pegarlo. Por ejemplo pegar a partir de la celda x, sin temer k entrar la celda donde acavara el rango pegado.

Gracias por interesaros por las dudas anteriorss.

¿La macro que envió le funciona correctamente?. ¿Los datos que quiere pegar a partir de una celda x forma parte de otra macro?. Así como también es interesante saber o ver una imagen donde se encuentra o en que posición de su archivo se encenta a partir de donde quiere pegar, para ver como formar la variable, espero me entienda lo que quiero saber para tratar de solucionar su situación.

Hola buenas,

por desgracia no puedo mostrar los datos con los que trabajo ya que estos son privados.

la macro que tengo hasta ahora es la siguiente:

Sub ordenar_tarifas()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim Tar As Range
Dim col As Range
Dim fila As Range
Dim ArchivoEntrada As String

Set l1 = ThisWorkbook
l1.Worksheets("Tarifas").Select
l1.Worksheets("Tarifas").Range("A2").Select
l1.Worksheets("Tarifas").Range(Selection, Selection.End(xlDown)).Select
Set Tar = Selection

ArchivoEntrada = "C:\Julen\Excel mesos empresas\Macro meses Empresa"
Set l2 = Workbooks.Open(ArchivoEntrada, True, True)

ws_count = l2.Sheets.Count
For i = 2 To Tar.Count + 1
   For j = 2 To ws_count + 1
        l2.Worksheets(j).Select
        Range("A3").Select
        l2.Worksheets(j).Range(Selection, Selection.End(xlDown)).Select
        Set col = Selection
        For k = 3 To col.Count + 2
             If l1.Worksheets("Tarifas").Cells(i, 1) = l2.Worksheets(j).Cells(k, 1) Then
                 l2.Worksheets(j).Cells(k, 2).Select
                 l2.Worksheets(j).Range(Selection, Selection.End(xlToRight)).Select
                 Selection.Copy
                 Set fila = Selection
                 l1.Activate
                 Cells(i, 1).Select
                 Selection.End(xlToRight).Offset(1, 0).Select
                 Range(Selection, Selection.Offset(0, fila.Count)).Select
                 Selection.Paste
             End If
        Next k
   Next j

Next i
MsgBox ("Fin")
End Sub

Las líneas en negrita son aquellas que entregan error.

La macro recorre una por una las tarifas que se encuentran escritas en la hoja de destino, i para cada una de ellas busca esa misma tarifa en el libro de origen el qual esta hecho a partir de una macro diferente. cuando coinciden los nombres de dichas tarifas la macro tiene que copiar todos los datos que se encuentran a la derecha de la tarifa de origen i pegarlas a partir de los últimos datos entrados en la tarifa de destino. Esto es asi para que el histórico se pueda actualizar sin tener que entrar los datos anteriores.

El problema que tengo es que para copiar los datos en el libro de destino me pide que entre también la dimensión de estos, o sea, pega estos datos desde la celda x hasta la y. he intentado hacer-lo con la línea:

Range(Selection, Selection.Offset(0, fila.Count)).Select
                 Selection.Paste

pero me sigue diciendo que la longitud no coincide. Por eso quería saber si hay algún comando que sea pega a partir de la celda x.

Siento no poder proporcionar mas información.

Gracias de antemano.

Puede cambiar sus datos por ficticios que sean totalmente diferentes a los reales y no tiene que ser todos a lo mucho dos o tres casos, de esa manera se facilita encontrar el problema, salidos

Siento las molestias pero ya lo e solucionado.

Al final he indicado donde acabaría el paste utilizando offsets.

A continuación dejo el programa por si puede ser de utilidad para alguien que tenga dudas similares:

Sub ordenar_tarifas()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim Tar As Range
Dim col As Range
Dim ArchivoEntrada As String

Set l1 = ThisWorkbook
l1.Worksheets("Tarifas").Select
l1.Worksheets("Tarifas").Range("A3").Select
l1.Worksheets("Tarifas").Range(Selection, Selection.End(xlDown)).Select
Set Tar = Selection

ArchivoEntrada = "C:\Julen\Excel mesos empresas\Macro meses Empresa"
Set l2 = Workbooks.Open(ArchivoEntrada, True, True)

ws_count = l2.Sheets.Count
For j = 2 To ws_count
   For i = 3 To Tar.Count + 2
        l2.Activate
        l2.Worksheets(j).Select
        Range("A3").Select
        l2.Worksheets(j).Range(Selection, Selection.End(xlDown)).Select
        Set col = Selection
        For k = 3 To col.Count + 2
             If l1.Worksheets("Tarifas").Cells(i, 1) = l2.Worksheets(j).Cells(k, 1) Then
                 l2.Worksheets(j).Cells(k, 2).Select
                 l2.Worksheets(j).Range(Selection, Selection.Offset(0, 13)).Select
                 Selection.Copy
                 l1.Activate
                 Cells(i, 1).End(xlToRight).Offset(0, 1).Select
                 Range(Selection, Selection.Offset(0, 13)).Select
                 ActiveSheet.Paste
             End If
        Next k
   Next i
l2.Activate
l2.Worksheets(j).Cells(2, 2).Select
l2.Worksheets(j).Range(Selection, Selection.Offset(0, 13)).Select
Selection.Copy
l1.Activate
Cells(2, 1).End(xlToRight).Offset(0, 1).Select
Range(Selection, Selection.Offset(0, 13)).Select
ActiveSheet.Paste

l1.Activate
Cells(1, 1).End(xlToRight).Offset(0, 1).Select
Range(Selection, Selection.Offset(0, 12)).Select
Selection = l2.Worksheets(j).Name

l1.Activate
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.SpecialCells(xlCellTypeBlanks).Value = 0
  On Error Resume Next
Next j
MsgBox ("Fin")
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas