Macro que copia celdas sin repetir los datos copiados

Hará cosa de dos meses os consultaba una duda sobre una macro que me copiase celdas de una hoja a otra en determinadas columnas (la pregunta era: "Crear macro que copie celdas si cumplen una condición".)
Me funcionó a la perfección, pero usándola me he encontrado con el problema que si ejecuto la macro una vez y la vuelvo a ejecutar otra vez me vuelve a copiar todos los elementos.
La hoja en la que copio los datos tiene el siguiente formato:
Articulo Cantidad
Ejemplo X
Mi pregunta es la siguiente:
¿Cómo puedo completar la macro para que al copiar los datos compruebe primero si ya se encuentran en la lista, y si se encuentran en la lista que compruebe si la cantidad es la misma, mayor o menor, para que si es la misma no lo copie y si es mayor o menor la aumente o la disminuya?
La macro que me facilitasteis fue la siguiente
Sub chequea()
Application.ScreenUpdating = False
Hoja2.Select
i = 4
For i = 4 To 67
If Cells(i, 5).Value > 0 Then
valor1 = Cells(i, 1)
valor2 = Cells(i, 5)
Hoja3.Select
If Range("A6") <> "" Then
Range("A100").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = valor1
ActiveCell.Offset(0, 2) = valor2
Hoja2.Select
Else
Range("A6").Select
ActiveCell = valor1
ActiveCell.Offset(0, 2) = valor2
Hoja2.Select
End If
End If
Next i
Application.ScreenUpdating = True
End Sub
Desde que me contestasteis la última vez he intentado darle una solución pero me faltan todavía conocimientos suficientes para dar con la solución.
1

1 respuesta

Respuesta
1
Prueba esto a ver
Sub chequea()
Application.ScreenUpdating = False
Hoja2.Select
i = 4
For i = 4 To 67
If Cells(i, 5).Value > 0 Then
valor1 = Cells(i, 1)
valor2 = Cells(i, 5)
Hoja3.Select
Range("A6").Select
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) = valor2 Then
GoTo ya_esta
Else
If ActiveCell = valor1 Then
ActiveCell.Offset(0, 2) = valor2 + ActiveCell.Offset(0, 2)
Else
Range("A100").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = valor1
ActiveCell.Offset(0, 2) = valor2
Hoja2.Select
End If
End If
End If
ya_esta:
Next i
Application.ScreenUpdating = True
End Sub
Añádele las condiciones si es mayor o menor para que sue o reste. Sino puedes me consultas nuevamente
Hola, he modificado un poco lo que me has mandado y he intentado añadir que sume o reste si es mayor o menor, pero continua repitiéndome todos los artículos, ni lo salta si ya está y es la misma cantidad, ni lo suma, ni lo resta, es decir lo vuelve a repetir todo sin tener en cuenta lo que hay.
Esto es lo que me ha quedado:
Sub TraspasoDatos()
Application.ScreenUpdating = False
Sheets("Hoja2").Select
I = 4
For I = 4 To 77
If Cells(I, 5).Value > 0 Then
valor1 = Cells(I, 1)
valor2 = Cells(I, 5)
Sheets("Hoja3").Select
Range("A6").Select
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) = valor2 Then
GoTo ya_esta
Else
If ActiveCell = valor1 Then
ActiveCell.Offset(0, 2) = valor2 + ActiveCell.Offset(0, 2)
Else
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) < valor2 Then
ActiveCell.Offset(0, 2) = valor2 - ActiveCell.Offset(0, 2)
Else
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) > valor2 Then
ActiveCell.Offset(0, 2) = valor2 + ActiveCell.Offset(0, 2)
Else
Range("A100").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = valor1
ActiveCell.Offset(0, 2) = valor2
Sheets("Hoja2").Select
End If
End If
End If
End If
End If
ya_esta:
Next I
Application.ScreenUpdating = True
End Sub
Prueba así
Sub TraspasoDatos()
Application.ScreenUpdating = False
Sheets("Hoja2").Select
I = 4
For I = 4 To 77
If Cells(I, 5).Value > 0 Then
valor1 = Cells(I, 1)
valor2 = Cells(I, 5)
Sheets("Hoja3").Select
Range("A6").Select
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) = valor2 Then
GoTo ya_esta
Else
If ActiveCell = valor1 Then
ActiveCell.Offset(0, 2) = valor2 + ActiveCell.Offset(0, 2)
Else
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) < valor2 Then
ActiveCell.Offset(0, 2) = valor2 - ActiveCell.Offset(0, 2)
Else
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) > valor2 Then
ActiveCell.Offset(0, 2) = valor2 + ActiveCell.Offset(0, 2)
Else
Range("A100").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = valor1
ActiveCell.Offset(0, 2) = valor2
Sheets("Hoja2").Select
End If
End If
End If
End If
End If
ya_esta:
Sheets("Hoja2").Select
Next I
Application.ScreenUpdating = True
End Sub
Lo primero gracias por la ayuda, ya se ha solucionado el problema de que lo vuelva a repetir pero solo con la la primera casilla, el resto lo vuelve a repetir, te pongo un ejemplo:
Lo que aparece la primera vez que activo la macro:
Articulo cantidad
Por 1
Y 2
Si le vuelvo a dar ocurre lo siguiente:
Articulo cantidad
Por 1
Y 2
Y 2
Supongo que el comando será que repita el proceso, pero no se donde colocarlo.
Hay algo que no entiendo
Articulo y cantidad están contiguos. (¿Uno al lado del otro)? Si es así la programación esta totalmente mala.
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) = valor2
Con esto yo estoy verificando columna A y C de la hoja 3 con los valores de la hoja 2. No las columnas contiguas.
Yo probé el código y funciona bien
No, no están contiguas, la programación está bien las columnas son la A y la C de la hoja tres, pero a mi solo me reconoce el primer artículo el resto me lo vuelve a repetir aunque ya estén copiados y tengan la misma cantidad.
Con ste creo que si
Sub TraspasoDatos()
Application.ScreenUpdating = False
Sheets("Hoja2").Select
I = 4
For I = 4 To 77
If Cells(I, 5).Value > 0 Then
valor1 = Cells(I, 1)
valor2 = Cells(I, 5)
Sheets("Hoja3").Select
Range("A6").Select
Do While ActiveCell <> valor1
ActiveCell.Offset(1, 0).Select
Loop
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) = valor2 Then
GoTo ya_esta
Else
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) < valor2 Then
ActiveCell.Offset(0, 2) = valor2 - ActiveCell.Offset(0, 2)
Else
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) > valor2 Then
ActiveCell.Offset(0, 2) = valor2 + ActiveCell.Offset(0, 2)
Else
Range("A100").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = valor1
ActiveCell.Offset(0, 2) = valor2
Sheets("Hoja2").Select
End If
End If
End If
End If
ya_esta:
Sheets("Hoja2").Select
Next I
Application.ScreenUpdating = True
End Sub
Pruébalo y me avisas
Con este último que me has pasado me aparece un error 1004 y cuando le doy a depurar me señala ActiveCell. Offset(1, 0). Select que se encuentra justo después de Do While ActiveCell <> valor1.
He modificado un poco el resto para que no sean tantas instrucciones y me ha quedado así
Sub TraspasoDatos()
Application.ScreenUpdating = False
Sheets("Hoja 2").Select
I = 4
For I = 4 To 77
If Cells(I, 5).Value > 0 Then
valor1 = Cells(I, 1)
valor2 = Cells(I, 5)
Sheets("Hoja 3").Select
Range("A11").Select
If ActiveCell = valor1 And ActiveCell.Offset(0, 2) = valor2 Then
GoTo ya_esta
Else
If ActiveCell = valor1 Then
ActiveCell.Offset(0, 2) = valor2
Else
Range("A100").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = valor1
ActiveCell.Offset(0, 2) = valor2
Sheets("Hoja 2").Select
End If
End If
End If
ya_esta:
Sheets("Hoja 2").Select
Next I
Application.ScreenUpdating = True
Sheets("Hoja 3").Select
End Sub
De esta forma utiliza el último valor al comparar sin que sume ni reste, que es más sencillo.
Debes usar una estructura repetitiva para comparar todos los valores de la hoja 3 con los de la hoja 2
Anexale un while al ultimo código que tienes; yo no tengo el archivo y estoy programando "a ciegas"
Por ejemplo ahora no es la celda A6 sino la A11, las modificaciones que haces afectan el código

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas