Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Como usar "while not empty"

30 views
Skip to first unread message

AndreaC

unread,
Jun 16, 2005, 10:57:07 AM6/16/05
to
Hola Chicos!
Tengo este problemilla... tengo una planilla con los siguientes datos
A B C
1 Nombre Apellido Empresa
2 Nombre Apellido Empresa
3 Nombre Apellido Empresa
4 Nombre2 Apellido2 Empresa2
5 Nombre2 Apellido2 Empresa2
6 Nombre3 Apellido3 Empresa3

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

Héctor Miguel

unread,
Jun 16, 2005, 10:31:46 PM6/16/05
to
hola, Andrea !

> ... 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.


AndreaC

unread,
Jun 17, 2005, 2:09:05 AM6/17/05
to
Hellocita!
Sorry! :D Tal vez no supe explicarme bien, pero con esa formula terminaria
borrando todas las filas pues siempre tendre los 3 datos (empresa, nombre y
apellido).
Comenzare por explicar lo que hago... yo trabajo con bases de datos de aprox
1500 contactos y todos los dias me llegan archivos con datos distintos.
Las columnas vienen asi:
A B C
"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

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ó:

Héctor Miguel

unread,
Jun 17, 2005, 2:24:49 AM6/17/05
to
hola, Andrea !

> ... 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.


AndreaC

unread,
Jun 17, 2005, 1:34:10 PM6/17/05
to
Hola Hector Miguel, tu formula funciona de maravilla! Sin embargo, la deje
guardada en mis registros para otras situaciones, porque para este caso
realmente necesito esas 3 columnas.
La razon? porque necesito identificar los contactos que se repiten pero que
la funcion "exact" no los reconoce porque alguno de los 3 datos esta mal
escrito.
Ejemplo:

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.

Héctor Miguel

unread,
Jun 18, 2005, 2:37:05 AM6/18/05
to
hola, Andrea !

> ... 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


AndreaC

unread,
Jun 18, 2005, 1:52:02 PM6/18/05
to
Hola!
:( No me pongas triste... la macro no esta recortada, solo esta creada con
la grabadora. Pero dame un tiempo, aprendo rapido :D
El tema de las columnas ordenadas... trust me... son imprescindibles para el
manejo de los datos.

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 !

AndreaC

unread,
Jun 18, 2005, 2:27:02 PM6/18/05
to
Perdon, perdon!
Esta todo bien... tuve un pequeño lapsus y copie la macro donde no debia...
Funciona perfecto :D
Gracias!

Héctor Miguel

unread,
Jun 18, 2005, 2:42:57 PM6/18/05
to
hola, Andrea !

> ... todo bien... copie la macro donde no debia... Funciona... Gracias!

;)


0 new messages