Macro excel, comparación de columnas

Te cuento, tengo 3 columnas en un libro:
----------A------------ B----------- C
1----- Oscar--------- si----------- si
2---- Gabriel--------- si---------- no
3---- Hector ---------no--------- no
4----- Nancy ---------si----------- si
5 -----Yuriko --------no----------- si
Me gustaría me ayudaras a crear una macro que compare las columnas B y C, si ambas son "si" copie el nombre de la columna A a otro libro.
¿Está dentro de tus alcances?
Yo apenas estoy aprendiendo, con tu solución avanzaré mucho en este mundo de Excel.

2 respuestas

Respuesta
1
Ok lo podemos solucionar con un "if" con doble condición incluso podemos meter un "for"
num= numero de la fila donde comienzan tus valores
mnum= numero de valores que tienes + num
for x = num to mnum
dim valor1 as string
dim valor2 as string
valor1 = cells(num,2).value
valor2 = cells(num,3).value
if valor1="si" & valor2="si" then
'aca va la macro que copia la fila al otro libro
cells(num,1).select
selection.copy
Worbooks(el otro libro).sheets(la hoja donde quieres pegar).range(rango donde lo quieres pegar).activate
activesheet.paste
end if
next x
Debe quedar algo así OJO la escribí aquí entonces no lo he probado, en teoría no debería fallar si poner bien los datos que necesita
Ok, muy bien. Tampoco he probado la macro pero no dudo que resuelva lo que te pedí.
Ahora voy a meter una aclaración una modificación, en la macro noté esto:
if valor1="si" & valor2="si" then
¿Qué pasa si en las columnas B y C no tengo solo "si" y "no" sino cosas muy diferentes como por ejemplo todas las letras del abecedario?
----------A------------ B----------- C
1----- Oscar--------- c------------ i
2---- Gabriel---------h------------ h
3---- Hector ---------a----------- g
4----- Nancy ---------z-----------e
5 -----Yuriko ---------t----------- t
Ok se resueve fácil
Cambia esa linea por
if valor1 = valor2 then
Esto hará que haga lo que le pidas cuando los valores sean iguales, eso es lo que necesitas, ¿cierto?
Oh sí, eso es lo que necesito.
Voy a elaborar la macro y en un ratito te cuento si tuve éxito y te califico.
Gracias.
Mira no hace nada. La macro quedó así:
Sub comparacion()
'mis valores inician en la fila 2
num = 2
'mis datos llegan hasta la fila 8
mnum = 8 + num
For x = num To mnum
Dim valor1 As String
Dim valor2 As String
valor1 = Cells(num, 2).Value
valor2 = Cells(num, 3).Value
If valor1 = valor2 Then
'aca va la macro que copia la fila al otro libro
Cells(num, 1).Select
Selection.Copy
'el libro se llama Libro2 y la hoja Hoja1, quiero pegar en la columna A fila 2
Workbooks("Libro2").Sheets("Hoja1").Range(2, 1).Activate
ActiveSheet.Paste
End If
Next x
End Sub
Nombres Valores Otros Valores
Nancy a s
Oscar b d
Akane c c
Ranma d y
Gabriel e u
Noriko f f
Magda g g
Asi me fuciono pruebala
Sub comparacion()
Dim valor1 As String
Dim valor2 As String
'mis valores inician en la fila 2
NUM = 2
'mis datos llegan hasta la fila 8
MNUM = 6 + NUM
For X = NUM To MNUM
valor1 = Cells(X, 2).Value
valor2 = Cells(X, 3).Value
If valor1 = valor2 Then
'aca va la macro que copia la fila al otro libro
Cells(X, 1).Select
Selection.Copy
'el libro se llama Libro2 y la hoja Hoja1, quiero pegar en la columna A fila 2
Workbooks("Libro2").Sheets("Hoja1").Activate
Cells(X, 1).Activate
ActiveSheet.Paste
Workbooks("LIBRO3").Activate 'OJO AQUI NO ES EL MISMO NOMBRE DEL LIBRO
End If
Next X
End Sub
Excelente, funcionó muy bien.
Te califico con la excelencia de tu solución.
Lo único que me faltaría sería agregar otras columnas que también se deben copiar al cumplir la condición, pero me imagino que hay que repetir este paso las veces necesarias con sus modificaciones pertinentes:
'aca va la macro que copia la fila al otro libro
Cells(X, 1).Select
Selection.Copy
'el libro se llama Libro2 y la hoja Hoja1, quiero pegar en la columna A fila 2
Workbooks("Libro2").Sheets("Hoja1").Activate
Cells(X, 1).Activate
ActiveSheet. Paste
¿Correcto?
Te califico.
Gracias
Respuesta
1
Bueno observando tu ejemplo debes cargar
Dim Nombre, variableA, variable B
usar un condicional que compare las variables
If variableA = variableB then
Crear un libro nuevo, ¿seleccionar un libro abierto previamente?
Copiar a dicho libro
Else
Otra accion que decidas
End if
Empieza a crear el código, envialo y con mucho gusto lo revisamos...
Saludos...

Ok, gracias.
Elaboré la macro pero desafortunadamente nada hace. ¿Una pista de en que estoy mal?
Explico:
Libro PLANTILLA = Columnas que quiero comparar y también la columna que quiero copiar a otro libro.
Libro ESTADO_DE_FUERZA = Aquí estará la MACRO, aquí quiero copiar la columna que viene del libro PLANTILLA
Sub CAMBIOS()
Application.ScreenUpdating = False
'Abro mi libro plantilla
Workbooks.Open ThisWorkbook.Path & "\" & "PLANTILLA.xlsx"
Windows("PLANTILLA.xlsx").Activate
Range("A1").Select
'Aplico un filtro para que la columna 10 = A y la columna 14 = P
Selection.AutoFilter
ActiveSheet.Range("A:T").AutoFilter Field:=10, Criteria1:="A"
ActiveSheet.Range("A:T").AutoFilter Field:=14, Criteria1:="P"
'Comienzo a construir el recorrido de la columna
Dim valor1 As String
Dim valor2 As String
'Mis datos empiezan en la fila 2 y terminan en la fila 5000
For X = 2 To 5000
'En la columna C y W tengo tengo los datos a comparar
valor1 = Cells(X, "C").Value
valor2 = Cells(X, "W").Value
'Si columna C es diferente de columna W, entonces...
If valor1 <> valor2 Then
'Selecciono y copio el dato correspondiente de la celda de la columna F
Cells(X, "F").Select
Selection.Copy
'Cambio al libro ESTADO_DE_FUERZA hoja %CAMBIOS y pego en fila 7 de la columna B
Windows("ESTADO_DE_FUERZA").Activate
Sheets("%CAMBIOS").Select
Cells(7, "B").Activate
ActiveSheet.Paste
End If
Next X
End Sub
Saludos.
Al final me equivoqué, en esta parte:
Cells(7, "B").Activate
Me imagino que es:
Cells(X, "B").Activate
Bueno asumiendo que tienes una carpeta en C:\ llamada (xxxxxx) y que allí tienes los archivos (PLANTILLA.xlsx, ESTADO_DE_FUERZA.xlsm osea donde esta la macro que pegaste) y usando los mismos datos de ejemplo que colocaste en la pregunta inicial; te coloco el código con las modificaciones en negrita y tu lo terminas de organizar:
----------A------------ B----------- C
1----- Oscar--------- si----------- si
2---- Gabriel--------- si---------- no
3---- Hector ---------no--------- no
4----- Nancy ---------si----------- si
5 -----Yuriko --------no----------- si
Sub CAMBIOS()
Application.ScreenUpdating = False 'Cuando ya tengas corregido el codigo y lo pruebes puedes habilitar la previsualización en pantalla, mientras aprendes a validar que hace tu macro.
'Abro mi libro plantilla
Workbooks.Open ThisWorkbook.Path & "\" & "PLANTILLA.xlsx"
Windows("PLANTILLA.xlsx").Activate
Range("A2").Select
'Aplico un filtro para que la columna 10 = A y la columna 14 = P
'Selection.AutoFilter
'ActiveSheet.Range("A:T").AutoFilter Field:=10, Criteria1:="A"
'ActiveSheet.Range("A:T").AutoFilter Field:=14, Criteria1:="P"
'Te deshabilite los filtros, ya que cuando filtras debes trabajar con las celdas visibles lo cual puede llegar a ser bastante dispendioso
'La idea es que trabajes con los datos ya previamente filtrados
'Comienzo a construir el recorrido de la columna
Dim valor1 As String
Dim valor2 As String
'Mis datos empiezan en la fila 2 y terminan en la fila 5000
For X = 2 To 5000
'En la columna C y D tengo tengo los datos a comparar
valor1 = Cells(X, "C").Value
valor2 = Cells(X, "D").Value
'Si columna C es diferente de columna D, entonces...
If valor1 <> valor2 Then
'Selecciono y copio el dato correspondiente de la celda de la columna F
Cells(X, "B").Select
Selection.Copy
'Cambio al libro ESTADO_DE_FUERZA hoja %CAMBIOS y pego en fila 7 de la columna B
Windows("ESTADO_DE_FUERZA").Activate
Sheets("%CAMBIOS").Select
Cells(X, "B"). Activate 'Aquí seleccionas la misma ubicación del libro PLANTILLA de donde copias pero en ESTADO_DE_FUERZA que es donde pegas.
ActiveSheet.Paste
End If
Windows("PLANTILLA.xlsx").Activate 'Aqui te devuelves al libro a seguir analizando los valores.
Application.CutCopyMode = False 'Aqui desactivas la opción de pegado.
Next X
End Sub
Esta muy bien! Y no tiene más instrucciones para incluir...
Ok. Gracias.
Voy a armar así la macro y te aviso cómo me fue. Lo que no me deja muy a gusto es la parte de deshabilitar el filtro.
¿No hay alguna forma de aplicar el filtro automático? Es necesario...
Buen día amigo
Pues se puede, pero como te digo siempre debes utilizar las celdas visibles, pues al aplicar filtros, visual no distingue (a menos que le indiques) al seleccionar el rango, que trabaje solo las celdas visibles al aplicar los filtros.
Te indico, por ejemplo:
Tienes la columna A fila 1 con el titulo Ejemplo
Columna A fila 2 valor 1
Columna A fila 3 valor 2
Columna A fila 4 valor 3
Columna A fila 5 valor 4
Si aplicas filtro (sin incluir titulo) en esta columna >2 quedarían fila 1, fila 4 y fila 5...
Ahora para trabajar con estas 3 Filas (incluido el filtro),
Debes indicar en visual:
Seleccione "A1:A5" pero debes indicar seleccionar celdas visibles para no incluir (al copiar por ejemplo) los valores de las celdas "A2" y "A3"...
Ok, entendido. Estoy pensando que mejor aplico el filtro al final en la nueva hoja donde fueron copiados los datos.
La macro pinta muy bien, me gustaría que me aclararas una duda, en esta parte del código ¿cómo le especifico que quiero empezar a pegar a partir de una determinada fila? Por ejemplo la fila 7
Cells(X, "B").Activate
ActiveSheet. Paste
Ah, en este momento se me esta ocurriemdo algo así como esto:
Cells(X+6, "B").Activate
ActiveSheet.Paste
...pero no sé, estoy loco =X
Soy muy nuevo en esto, apenas estoy aprendiendo.
Muchas gracias por tu iluminación =D
Ups me acabo de dar cuenta que la macro me está copiando todos los datos sin importar que:
If valor1 <> valor2 Then
Y es que analizando esta parte:
If valor1 <> valor2 Then
Cells(X, "B").Select
Selection.Copy
... le estoy diciendo que si columna POR es diferente de columna Y empiece a copiar TODOS y y uno por uno por lo datos de la columna "B"
¿Cómo decirle que sólo copie el dato correspondiente al que cumpla valor1 <> valor2?
¿O cuál es la razón por la que esta macro me copia todos los datos?
Hasta luego
Bueno, lamento atacarte con todos estos post.
If valor1 <> valor2 Then
Cambie el símbolo <> por = y la macro sí funciona bien
If valor1 = valor2 Then
... ¿entonces el problema parece ser el símbolo <> qué puede ser?
Entonces para no confundirte con tantos post resumo todo aquí, además de lo del símbolo <> que no funciona bien tengo la otra duda de como especificarle que empiece a copiar desde la fila 7
Cells(X, "B").Activate
ActiveSheet. Paste
Para consolidar efectivamente uno después del otro, seleccionas un rango en la otra hoja por ejemplo "A2", luego antes de copiar analizas sí allí hay algo...
Line1:
Analiza los valores comparación
Analiza valor sí es vacío y continua sino ir a linea final
Si celda. Activa. Valor <> empty entonces
Pega valor
Avanza 1 fila cero columnas
goto Line1 'repite el ciclo
Sino
Avanza 1 fila cero columnas 'en hoja donde esta consolidando
Fin sí
Lineafinal:
Dejar de copiar.
Lamento decirte que no entendí muy bien la solución, mi problema es que al comparar:
If valor1 <> valor2 Then
Me copia todo sin tomar en cuenta que necesito solo los diferentes entre ellos. Algo pasa con este símbolo <> por que si pongo el = para que me copie los que son iguales sí lo hace bien.
... y así como por arte de magia esta expresión ya sirve como debe de ser:
If valor1 <> valor2 Then
Ahora intentaré lo que me comentas para ir llenando las celdas que en el proceso de copiado van quedando vacías.
Muchas gracias, esto parece que ya casi queda listo y la verdad estoy aprendiendo mucho.
Ah olvidé mencionarlo, pero todavía hay algo que no logro hacer. Quiero indicarle desde que celda del otro libro comience a copiar.
Cells(X, "B").Select
Selection.Copy
¿Cómo indicarle aquí desde que celda quiero empezar a copiar?
Inmediatamente después de Selection. Copy colocas ActiveSheet. Paste
El algoritmo anterior que te coloque permite analizar antes de pegar, que se revise la celda donde vas a copiar para que no te sobrescriba y te consolide la información sin filas en blanco.
La idea es que se realice un algoritmo para luego llevarlo a la practica, de esta manera es más fácil programar.
Ok, así fue como solucioné todo lo que quería y expresé en mis post:
(Pongo esto para los que lleguen buscando información)
Sub CAMBIOS()
'abro el libro en donde voy a comparar y copiar mis datos.
Workbooks.Open ThisWorkbook.Path & "\" & "PLANTILLA.xlsx"
Windows("PLANTILLA").Activate
'preparo el recorrido de las columnas que voy comparar, el copiado y el pegado de la información en otro libro
'creo las variables para usarlas más adelante
Dim adscripcion_actual As String
Dim adscripcion_anterior As String
Dim comisionados As String
Dim activos As String
Dim policias As String
'creo el recorrido y demás cosas para mis datos que empiezan en la fila 2 y terminan en la fila 5000.
For X = 2 To 5000
'asigno la posición donde comenzarán mis variables a obtener los datos para ser usados más adelante.
adscripcion_actual = Cells(X, "C").Value
adscripcion_anterior = Cells(X, "W").Value
comisionados = Cells(X, "D").Value
activos = Cells(X, "J").Value
policias = Cells(X, "A").Value
'empiezo a utlilzar las variables, necesito que las 5 se cumplan para empezar a copiar los datos necesarios.
If activos = "A" And policias = "P" comisionados = "" And adscripcion_anterior <> adscripcion_actual Then
'copio el dato correspondiente en la columna F
Cells(X, "F").Select
Selection.Copy
'cambio al libro y selecciono la hoja en donde necesito ir pegando la información que cumpla las condiciones de arriba.
Windows("ESTADO_DE_FUERZA").Activate
Sheets("%CAMBIOS").Select
'selecciono la fila 6 de la columna B, aquí tengo el título de mi columna
Cells(6, "B").Activate
'con esto voy pegando dentro de la columna B fila tras fila los datos que estoy obteniendo y no dejo filas en blanco.
'Hacer mientras la fila 6 columna B no esté vacía
Do While Not IsEmpty(ActiveCell)
'Con 1 la fila activa se mueve un lugar hacia abajo y con 0 la columna permanece igual
ActiveCell.Offset(1, 0).Activate
Loop
'pego el dato obtenido
ActiveSheet.Paste
Application.CutCopyMode = False
'cambio a la hoja de donde extraigo y comparo columnas para buscar el siguiente dato.
Windows("PLANTILLA").Activate
End If
Next X
'El mismo proceso se repetirá hasta que el recorrido llegue a la fila 5000 como lo especifiqué con For X = 2 To 5000
Windows("ESTADO_DE_FUERZA").Activate
Sheets("%CAMBIOS").Select
End Sub
Espero haber sido claro, soy muy nuevo en esto.
Gracias experto, tu ayuda mi ayudó mucho a hacer esto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas