Macro copiar datos a otra hoja y verificar

En una hoja de Excelen la que ingresamos datos tengo una columna con datos únicos, es un número consecutivo, tengo un macro que me copia esa información a otra página, tengo que mejorar el macro y lo que quiero hacer es que solo me copié la información nueva o la que haga falta, ya que actualmente me copia toda la información y me desordena un poco los datos, mi intención es que verifique por medio del número consecutivo, por ejemplo tengo en la hoja 1 en la celda A1 el consecutivo 220, el macro verificará en la hoja 2 en la columna A si aparece ese consecutivo, si apareciera el 220, no copia la información, si no aparece copia la información al final de la hoja 2, luego pasaría a la hoja 1 y pasa a la siguiente celda A2 que tienen el consecutivo 221 y vuelve a repetir el proceso, algo así es la idea.

Aquí les dejo el código que tengo, sé que está horrible pero la idea no es mala.

2 respuestas

Respuesta
1

Te anexo la macro

Sub Verficar_Consecutivo()
    Set h1 = Sheets("Hoja1")    'origen
    Set h2 = Sheets("Hoja2")    'destino
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        Set b = h2.Columns("A").Find(h1.Cells(i, "A"), lookat:=xlWhole)
        If b Is Nothing Then h1.Rows(i).Copy h2.Range("A" & h2.Range("A" & Rows.Count).End(xlUp).Row + 1)
    Next
    MsgBox "Fin"
End Sub

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

Dante muchas gracias, también funciona bien, ahora tengo que aplicar el macro a que lea varias hojas de origen pero tengo ese bendito error que le comenté a Bond.

No sé a cuál error te refieres.

Tampoco explicaste que se tenía que aplicar en varias macros.

Si explicas en cuáles hojas y cómo se debe aplicar, te actualizo mi macro.

No quería ahondar mucho en el tema, quería hacerlo simple para que se entendiera, luego yo le haría los cambios que ocupara pero tengo ese error que no se solucionarlo, el archivo tiene 15 hojas, la información está de la hoja 2 a la hoja 13, la hoja 1 es un menú, la hoja 14 es el consolidado donde se copian todos los datos de las 12 hojas  (hojas 2 a la 13) todas manejan la misma información solo que diferentes valores, te puedo pasar el archivo para que lo veas.

Si las hojas origen se llaman : "Hoja2", "Hoja3", "Hoja4", así hasta la "Hoja13", entonces quedaría así:

Sub Verficar_Consecutivo()
    Set h2 = Sheets("Hoja14")    'destino
    For h = 2 To 13
        Set h1 = Sheets("Hoja" & h)
        For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
            Set b = h2.Columns("A").Find(h1.Cells(i, "A"), lookat:=xlWhole)
            If b Is Nothing Then h1.Rows(i).Copy h2.Range("A" & h2.Range("A" & Rows.Count).End(xlUp).Row + 1)
        Next
    Next
    MsgBox "Fin"
End Sub

Si tienen otro nombre, entonces vas a tener que explicar con detalle.


'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

Dante, el nombre de las hojas no importa ya que internamente para Excel me estoy basando en la posición de la hoja, no en el nombre.

Le realice los cambios que ocupaba y funciona bien con todas las hojas justamente hace lo que quiero, pero me copia hasta las formulas, que le tengo que modificar para que solo tome los valores de las celdas, estoy probando con el LookIn:=xlValues, pero ni idea.

Cambia esta línea

If b Is Nothing Then h1.Rows(i).Copy h2.Range("A" & h2.Range("A" & Rows.Count).End(xlUp).Row + 1)

Por estas:

If b Is Nothing Then 
   h1.Rows(i).Copy 
   h2.Range("A" & h2.Range("A" & Rows.Count).End(xlUp).Row + 1).pastespecial xlvalues
end if

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
Respuesta

Esta macro es más simple lo que hace es verificar que exista la información de la hoja 1 en la hoja2 a través de un conteo de cada celda si es mayor a 0 no copiara nada puesto que la info ya existe, si es 0 copiara la información una fila después de la ultima fila con datos de la hoja2

Sub copiar_datos()
Set h1 = Worksheets("hoja1")
Set h2 = Worksheets("hoja2")
Set origen = h1.Range("a1").CurrentRegion
Set destino = h2.Range("a1").CurrentRegion
With origen
    r = .Rows.Count
    For i = 2 To r
        cons = .Cells(i, 1)
        cuenta = WorksheetFunction.CountIf(destino.Columns(1), cons)
        If cuenta = 0 Then
            r1 = destino.CurrentRegion.Rows.Count
            c1 = destino.CurrentRegion.Columns.Count
            destino.Rows(r1 + 1).Resize(1, c1).Value = origen.Rows(i).Value
        End If
    Next i
End With
Set origen = Nothing: Set destino = Nothing
End Sub

Muchas gracias Bond funciona bien, pero, estoy intentando hacer que el macro tome como origen varias hojas, sin embargo tengo este problema

Estoy utilizando un for para seleccionar las hojas de origen, en total son 12 hojas a copiar en la hoja de consolidado, cada hoja maneja la misma información solo que con diferentes valores, me puedes ayudar.

De hecho a como lo planteas la macro que te envíe no te sirve, esta es la maco que ocupas, todos los datos de la hoja2 en adelante que sean iguales a los que estén en la hoja 1 se van a descartar y solo se copiaran aquellos que no estén en dicha hoja, para mayor rapidez la macro no se moverá de la hoja 1, tu no vas a notar más que el resultado final cambie el for i por un for each es mucho más rápido cuando se trata de procesar hojas, la hoja 1 en la macro se llama destino puedes cambiarle el nombre por la hoja donde quieras que se copien tus datos en todas las partes de la macro donde veas hoja 1 igual con el rango "A1" estoy suponiendo que en todas tus hojas esta celda es el origen de todos los datos

Sub COPIA_CONDICIONADO()
Set H1 = Worksheets("HOJA1")
Set DESTINO = H1.Range("A1").CurrentRegion
C = DESTINO.Rows.Count
For Each HOJA In Worksheets
    NOMBRE = UCase(HOJA.Name)
    If NOMBRE = "HOJA1" Then GoTo SIG
    Set H2 = Worksheets(NOMBRE)
    Set ORIGEN = H2.Range("A1").CurrentRegion
    With ORIGEN
        R = .Rows.Count
        For I = 1 To R
            CONS = .Cells(I, 1)
            CUENTA = WorksheetFunction.CountIf(DESTINO.Columns(1), CONS)
            If CUENTA = 0 Then
                R1 = DESTINO.CurrentRegion.Rows.Count
                C1 = DESTINO.CurrentRegion.Columns.Count
                DESTINO.Rows(R1 + 1).Resize(1, C1).Value = .Rows(I).Value
            End If
        Next I
    End With
SIG:
Next HOJA
MsgBox ("REGISTROS COPIADOS " & R1 - R & " DE " & Sheets.Count - 1 & " HOJAS"), _
vbInformation, "AVISO EXCEL"
Set ORIGEN = Nothing: Set DESTINO = Nothing
End Sub

Por cierto tu error es porque te falta un select sheets(a).select pero como dije moverse entre hojas con una macro la alenta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas