Mi tarea es eliminar los contactos duplicados. Para eso estoy creando una
macro y necesito que me ayuden en esta parte:
A B C D E F
1=EXACT(D2,D3) =EXACT(E2,E3) =EXACT(F2,F3) Nombre Apellido Empresa
2=EXACT(D3,D4) =EXACT(E3,E4) =EXACT(F3,F4) Nombre Apellido Empresa
3=EXACT(D4,D5) =EXACT(E4,E5) =EXACT(F4,F5) Nombre Apellido Empresa
... etc
Como hago un loop que repita el proceso hasta llegar a la primera fila que
tengas las 3 celdas vacias en las columnas D, E y F??
Muchas gracias!
AndreaC
> ... problemilla... planilla con... datos
> ... tarea es eliminar los contactos duplicados... estoy creando una macro y necesito que me ayuden en
> ... como hago un loop que repita el proceso hasta llegar a la primera fila que tengas las 3 celdas vacias en... D, E y F?
[en tanto comentas los avances que llevas en la creacion de la macro... y si te sirve una 'alternativa' SIN macros]...
suponiendo los datos 'a verificar' en las columnas D, E y F [y 'esperando' que a partir de la fila 2]...
1) introduce la siguiente formula en una celda vacia [p.e. G2]...
=sumproduct(1*($d$2:d2&$e$2:e2&$f$2:f2=d2&e2&f2))
[esta formula ira contando las veces que 'aparece' cada 'trio de celdas' en el rango 'acumulado']
2) copiala hacia abajo hasta la ultima fila donde existan datos en alguna de las 3 columnas [E, E y F]
3) aplica 'autofiltros' a la columna donde hayas puesto la formula
4) 'filtra' utilizando el criterio <>1 [o 'no es igual a..' 1]... es decir... las que 'aparecen' 2 o mas veces en el listado ;)
5) selecciona el rango 'filtrado resultante'... pulsa la tecla {F5}... luego el boton 'especial...' y marca 'solo celdas visibles'
6) [opcional] 'quita' los autofiltros [y solo para 'comprobar' que]...
queda un rango seleccionado con SOLO aquellas filas con datos 'repetidos' 2 o mas veces en el listado
7) elimina las filas completas del rango seleccionado ;)
si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.
Entonces, yo lo que quiero es agregar 3 columnas para comparar nombre con
nombre, apellido con apellido, empresa con empresa.
Como esto lo debo hacer en todos los archivos, quiero crear una macro que me
agregue 3 columnas al principio (A,B y C) y rellene las celdas con la funcion
"exacto".
El asunto quedaria asi:
A B C D
E F
1 "Exact1" "Exact2" "Exact3" "Empresa"
"Nombre" "Apellido"
2=exact(D2,D3) =exact(E2,E3) =exact(F2,F3) Telefonica S.A. Andres
Mujica
3=exact(D3,D4) =exact(E3,E4) =exact(F3,F4) Telefonica SA Andres
Mujica
4=exact(D4,D5) =exact(E4,E5) =exact(F4,F5) McDonald's Octavio
Sepulveda
5=exact(D5,D6) =exact(E5,E6) =exact(F5,F6) McDonald's Octabio
Sepulveda
6=exact(D6,D7) =exact(E6,E7) =exact(F6,F7) Coca Cola S.A. Gonzao
Gutierrez
7=exact(D7,D8) =exact(E7,E8) =exact(F7,F8) Coca Cola Gonzalo
Gutierrez
En este minuto no tengo la macro disponible (estoy en mi casita) pero puedo
avanzar contandote que (entre otras cosas) me ordena los datos
alfabeticamente, agrega las columnas, escribe la funcion exacto en las celdas
A2, B2 y C2 y les da un formato condicional.
Entonces yo ahora quisiera que la macro continue completando las funciones
hasta llegar a la primera fila donde no hayan mas datos (a eso me referia
antes con "hasta llegar a la primera fila que tengas las 3 celdas vacias en
las columnas D, E y F").
Yo me imagino que se debe hacer con un loop pero no se como se escriben (do
until? if not empty? while?).
De todos modos, mañana te puedo agregar la macro si es necesaria.
Me explique mejor ahora?? :D
Muchas gracias por la paciencia y el tiempo dedicado.
Saludos
An.
"Héctor Miguel" escribió:
> ... con esa formula terminaria borrando todas las filas pues siempre tendre los 3 datos (empresa, nombre y apellido)
> ... trabajo con bases de datos de aprox 1500 contactos y todos los dias me llegan archivos con datos distintos.
> Las columnas vienen asi:
> "Empresa" "Nombre" "Apellido"
> 1 Telefonica S.A. Andres Mujica
> 2 Telefonica SA Andres Mujica
> 3 McDonald's Octavio Sepulveda
> 4 McDonald's Octabio Sepulveda
> 5 Coca Cola S.A. Gonzao Gutierrez
> 6 Coca Cola Gonzalo Gutierrez [...]
> Me explique mejor ahora?? :D
[de todas maneras] te sugiero hacer una prueba SIN 'llegar hasta' la eliminacion de las filas :DD
'quedate' hasta quitar los autofiltros y revisa que filas quedan seleccionadas :))
solo modifica la formula cambiando las columnas del ejemplo anterior...
de: =sumproduct(1*($d$2:d2&$e$2:e2&$f$2:f2=d2&e2&f2))
a: =sumproduct(1*($a$2:a2&$b$2:b2&$c$2:c2=a2&b2&c2))
[obviamente] si requieres continuar con la macro... quedamos a la espera de 'como la llevas' hasta ahorita ;)
saludos,
hector.
1 Telefonica S.A. Andres Mujica
2 Telefonica SA Andres Mujica
3 Telefónica SA Andrés Mujca
4 Telefonica Sociedad Anonima Andrea Mujica
Todos son la misma persona, por lo tanto debo eliminar 3 y dejar 1. En un
listado de 1500, 3000 o 5000 filas, las columnas con exact me ayudan mucho a
indentificar esto, pues no puedo eliminar a cualquiera... debo verificar que
el contacto que estoy dejando tenga todos los datos (tengo mas columnas con
telefono1, telefono2, direccion, mail, etc)
Esta es la macro:
Sub SortBy()
Selection.Sort Key1:=Range("O1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Dim rng As Range
Set rng = Range([O65536].End(xlUp).Offset(1, -1), _
[N65536].End(xlUp).Offset(1, 0))
rng.Copy rng.Offset(0, 1)
Selection.Sort Key1:=Range("O1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Selection.Sort Key1:=Range("C2"), Order1:=xlAscending, Key2:=Range("B2") _
, Order2:=xlAscending, Key3:=Range("A2"), Order3:=xlAscending,
Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Columns("A:C").Select
Selection.Insert Shift:=xlToRight
Range("A1").Select
Selection.Font.Bold = True
ActiveCell.FormulaR1C1 = "COMP"
Range("B1").Select
Selection.Font.Bold = True
ActiveCell.FormulaR1C1 = "FIRST"
Range("C1").Select
Selection.Font.Bold = True
ActiveCell.FormulaR1C1 = "LAST"
Range("A2").Select
ActiveCell.FormulaR1C1 = "=EXACT(RC[3],R[1]C[3])"
Selection.AutoFill Destination:=Range("A2:C2"), Type:=xlFillDefault
Columns("A:C").Select
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="TRUE"
Selection.FormatConditions(1).Font.ColorIndex = 3
Selection.FormatConditions(1).Interior.ColorIndex = 1
Range("A:A,C:C").EntireColumn.AutoFit
' aqui es donde me falta agregar que se copie automaticamente hasta ultima
fila con datos
End Sub
Bueno HM, por ahora esta es la unica manera que se me ocurre de simplificar
el proceso. Pero si tienes alguna idea mejor que la mia... bienvenida!
Muchas gracias por todo
An.
> ... para este caso realmente necesito esas 3 columnas
> ... necesito identificar los contactos que se repiten pero que... "exact" no los reconoce porque alguno... esta mal escrito.
> 1 Telefonica S.A. Andres Mujica
> 2 Telefonica SA Andres Mujica
> 3 Telefónica SA Andrés Mujca
> 4 Telefonica Sociedad Anonima Andrea Mujica
> ... son la misma persona... debo eliminar 3... no puedo eliminar a cualquiera... debo verificar que el contacto [...]
> Esta es la macro:
> Sub SortBy()
> [sigue codigo de 'ordenacion' de -varias- selecciones de rangos :)) ]
> Columns("A:C").Select
> Selection.Insert Shift:=xlToRight
> [sigue codigo de 'acciones diversas' trabajando con rangos :)) ]
> ' aqui es donde me falta agregar que se copie automaticamente hasta ultima fila con datos
> End Sub
> ... por ahora esta es la unica manera que se me ocurre de simplificar el proceso
> ... si tienes alguna idea mejor... bienvenida!
[por lo pronto]... me da la impresion de que el codigo que expones viene 'recortado' -?-
-> no alcance a ver el porque de tantas ordenaciones de 'selecciones actuales' sin ver como se van seleccionando :-(
[de momento]... dejo 'tal cual' el codigo con el que estas 'ordenando' y...
-> a partir de que 'seleccionas' las columnas 'A.C' para insertar [nuevas] columnas... meter formulas... y copiar hasta el final...
prueba con las siguientes lineas ->como continuacion a las ordenaciones / sustitucion de las 'formulaciones' <-
-> estoy suponiendo que 'la ultima' fila es [en realidad] la ultima celda del 'rango usado' de la hoja de calculo :))
si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.
=====
' despues del ultimo 'Selection.Sort...' etc. etc. etc. copia las siguientes lineas...
With [a1:c1]
.EntireColumn.Insert
.Value = Array("COMP", "FIRST", "LAST")
.Font.Bold = True
End With
With [a2]
.Formula = "=exact(d2,d3)"
With .FormatConditions.Add(xlCellValue, xlEqual, "True")
.Font.ColorIndex = 3
.Interior.ColorIndex = 1
End With
.Copy .Resize(ActiveSheet.UsedRange.Rows.Count - 1, 3)
End With
[a:c].EntireColumn.AutoFit
End Sub
Y ahora, a lo importante...
Gracias! Ahora se ve mas ordenada la macro... sabia que me ayudarias con eso
:D
Solo tenemos un problemita... me aparece "Error 400" y solo llega hasta
crear la primera formula en A2. Algo pasa con:
.Copy .Resize(ActiveSheet.UsedRange.Rows.Count - 1, 3)
Y respondiendo a tu ultima suposicion ("...que 'la ultima' fila es... la
ultima celda del 'rango usado' de la hoja de calculo...") Mmmm... me refiero
a que las funciones en ABC se copien hasta donde no encuentre mas datos en
DEF (rango usado?).
Saludos
An.
"Héctor Miguel" wrote:
> hola, Andrea !
> ... todo bien... copie la macro donde no debia... Funciona... Gracias!
;)