elementos unicos en una coleccion

17/12/2006 - 21:56 por Ivan | Informe spam
hola a todos

estoy intentando usar una coleccion para cargar en una hoja los
registros de otra que no esten ya en la 1ª.

para ello hago esto->

1º.- en el modulo de un formulario ->

Dim colFavoritos as Collection ' a nivel de modulo

en el evento Initialice del formulario cargo la 1ª celda de cada
registro de la 1ª hoja (en la que quiero cargar los no repetidos de la
otra) en la coleccion

With Worksheets("Favoritos")
If .[a2] <> "" Then
For Each celdaF In .Range("a2:a" & .[a65536].End(xlUp).Row)
On Error Resume Next
colFavoritos.Add celdaF ' tambien he probado con '',
CStr(celdaF)''
On Error GoTo 0
Next
End If
End With

2º.- en un modulo normal tengo esta funcion, que intenta cargar los
registros no coincidentes de la 2ª hoja en otra coleccion. Para ello
cargo (intento) en la segunda coleccion solo la direccion de los
registros que al intentar cargarlos en la 1ª col. no den error

Function Coleccion(ByVal hjNuevos As String, _
ByRef colPrincipal As Collection) As Collection
Dim celda As Range, fila As String
With Worksheets(hjNuevos)
If .[a2] = "" Then Exit Function
Set Coleccion = New Collection
For Each celda In .Range("a2:a" & .[a65536].End(xlUp).Row)
On Error Resume Next
colPrincipal.Add celda ' tambien he probado con '' , CStr(celda)
''
On Error GoTo 0
If Err.Number = 0 Then
fila = celda.Address(0, 0) & ":" & celda.Offset(0,
25).Address(0, 0)
Coleccion.Add fila
End If
Next
End With
End Function

3º.- en un boton del formulario intento actualizar/ la 1ª hoja de
esta forma

With Worksheets("Favoritos")
If .[a2] = "" Then
Worksheets("Seleccion").UsedRange.Copy .[a1]
Else
f = .[a65536].End(xlUp).Row
Set colF = Coleccion("Seleccion", colFavoritos)
For i = 1 To colF.Count
Set CeldaO = .Range("a" & f + i)
Worksheets("Seleccion").Range(colF(i)).Copy CeldaO
Next
End If
End With

no se lo que hago mal, pero me carga todos los registros, unicos o no.
Quizas lo que intento no tenga mucho sentido, pñero no deja de
intrigarme el motivo del error.

bueno, si podeis echarme una mano una vez mas os lo agradezco

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
17/12/2006 - 23:48 | Informe spam
hola, Ivan !

la 'causa' del error que comentas al final... ["no se lo que hago mal, pero me carga todos los registros, unicos o no"]
[segun parece] esta en el segundo procedimiento que expones ["Function Coleccion(..."]
-> ya que si su proposito es [segun expones]:
"cargo (intento) en la segunda coleccion solo la direccion de los registros que al intentar cargarlos en la 1ª col. no den error"

a) tienes al inicio del bucle "For Each celda In .Range("a2:a" &..." -> una instruccion On Error Resume Next
b) despues haces 'la carga' [intento] con: -> colPrincipal.Add celda ' tambien he probado con '' , CStr(celda) ''
c) INMEDIATAMENTE despues de la carga [o intento]... tienes una instruccion: -> On Error GoTo 0
d) la siguiente linea [If Err.Number = 0 Then] -> obviamente... NUNCA va a 'encontrar' un error 'distinto' de 0 [cero]

-> 'solucion' ?... -> elimina/omite/comenta/... la linea con la instruccion: -> On Error GoTo 0 ;)
o... ponla despues del 'End If' [por si necesitas 'controlar' otros errores en el codigo de la misma funcion o procedimiento]
creo que podras ver 'la logica' de una instruccion 'On Error GoTo 0' y cuando si/no es conveniente su uso...
[al menos... nunca ANTES de haber podido evaluar si la instruccion 'realmente' ha generado un error] :)

saludos,
hector.

__ la consulta original __
estoy intentando usar una coleccion para cargar en una hoja los registros de otra que no esten ya en la 1ª...
1º.- en el modulo de un formulario -> Dim colFavoritos as Collection ' a nivel de modulo
en el evento Initialice del formulario cargo la 1ª celda de cada registro de la 1ª hoja
(en la que quiero cargar los no repetidos de la otra) en la coleccion


With Worksheets("Favoritos")
If .[a2] <> "" Then
For Each celdaF In .Range("a2:a" & .[a65536].End(xlUp).Row)
On Error Resume Next
colFavoritos.Add celdaF ' tambien he probado con '', CStr(celdaF)''
On Error GoTo 0
Next
End If
End With
2º.- en un modulo normal tengo esta funcion, que intenta cargar los registros no coincidentes de la 2ª hoja en otra coleccion.
Para ello cargo (intento) en la segunda coleccion solo la direccion de los registros que al intentar cargarlos en la 1ª col. no den error


Function Coleccion(ByVal hjNuevos As String, _
ByRef colPrincipal As Collection) As Collection
Dim celda As Range, fila As String
With Worksheets(hjNuevos)
If .[a2] = "" Then Exit Function
Set Coleccion = New Collection
For Each celda In .Range("a2:a" & .[a65536].End(xlUp).Row)
On Error Resume Next
colPrincipal.Add celda ' tambien he probado con '' , CStr(celda) ''
On Error GoTo 0
If Err.Number = 0 Then
fila = celda.Address(0, 0) & ":" & celda.Offset(0, 25).Address(0, 0)
Coleccion.Add fila
End If
Next
End With
End Function
3º.- en un boton del formulario intento actualizar/ la 1ª hoja de esta forma


With Worksheets("Favoritos")
If .[a2] = "" Then
Worksheets("Seleccion").UsedRange.Copy .[a1]
Else
f = .[a65536].End(xlUp).Row
Set colF = Coleccion("Seleccion", colFavoritos)
For i = 1 To colF.Count
Set CeldaO = .Range("a" & f + i)
Worksheets("Seleccion").Range(colF(i)).Copy CeldaO
Next
End If
End With
no se lo que hago mal, pero me carga todos los registros, unicos o no.
Quizas lo que intento no tenga mucho sentido, pñero no deja de intrigarme el motivo del error.
bueno, si podeis echarme una mano una vez mas os lo agradezco
Respuesta Responder a este mensaje
#2 Ivan
18/12/2006 - 00:40 | Informe spam
hola , Hector Miguel, muchas gracias de nuevo

justo hace un momento acababa de caer en ello, he pasado la cancelacion
de errores justo detras de la carga de la 2ª coleccion y ahora parece
funcionar bien excepto en una situacion que despues te comento.

En cuanto a On Error Goto 0, gracias por la aclaracion, hasta ahora
pensaba (sin ningun sentido) que no anulaba el error, que solo evitaba
sus efectos pero el error 'seguia existiendo' hasta que finalizaba la
parte involucrada (en este caso pasar al siguiente elemento del bucle).
Eso explica mas de un 'problemilla' que he tenido en otras situaciones.

por otro lado, y como habras supuesto, esta consulta es continuacion de
la ultima en que nos hemos 'visto', y siguiendo un poco tu consejo
sobre la posibilidad de utilizar las colecciones (disculpa no haber
continuado en aquel, pero ahora realmente la duda iba mas hacia las
colecciones en si mismas que hacia el motivo de aquella consulta, y
tampoco queria sobrecargar aquel hilo con otro tema),

en realidad no tenia muchas esperanzas de lograr acelerar la carga de
los seleccionados con las colecciones, por lo que tu mismo comentabas
sobre el nº de registros, sin embargo si parece ser bastante mas
rapido en general, al menos en mis pruebas.

paso a intentar explicarte la situacion en que me carga tambien los
repetidos ( que hasta ahora, corriendo bastantes pruebas en diferentes
situaciones, solo parece hacerlo en esta, en los demas trabaja bien y
muy rapido < - de 1 sg>)

pej-> cargo el listbox con los registros que empiezan por la l, y se
cargan 4300 reg aprox, le doy a seleccionar todos y con la lista de
favoritos vacia (solo encabezados) le doy a 'añadir a favoritos', los
registros se cargan sin problemas rapidamente en la hoja favoritos

Nota-> comentarte que trabajo con los registros de la hoja "Seleccion",
que contiene/ se actualiza con los seleccionados en el listbox

hasta aqui todo bien, pero si ahora le vuelvo a dar directamente a
añadir a favoritos y me los vuelve a cargar todos en favoritos,
duplicando los registros,

sin embargo, si por ej. borro la seleccion (otro boton que
deselecciona los elementos del listbox) y vuelvo a seleccionar todos y
a actualizar favoritos, ya no me carga los repetidos. Y en todas las
demas situaciones que he probado, tambien solamente me carga los
unicos.

no se si habre sabido explicarme y captaras la situacion, pero no se a
que puede deberese. He pensado que quizas la colecion con los unicos
continue 'viva'. pero en teoria me la 'cargo' al final del
procedimiento del boton actualizar favoritos.

bueno, en cualquier caso muchas gracias de nuevo por todo y si se te
ocurre algo sera bienvenido

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#3 Ivan
18/12/2006 - 00:56 | Informe spam
hola de nuevo, Hector Miguel

creo que, a falta de probarlo, ya he encontrado el problema al leer mi
propia consulta (suele ocurrirme, y es otra de las ventajas del foro)

si no me equivoco, lo que ocurre es que la coleccion principal
(colFavoritos) la inicializo al cargar el formulario, y si en ese
momento la hoja favoritos esta vacia, no contiene elementos y hasta que
la lista no contiene algun elemento no se cargan sus elementos en la
coleccion

y dado que si la lista esta vacia, la primera carga de favoritos no se
hace a traves de la coleccion sino pegando rangos, cuando haces una 2ª
garga en favoritos la coleccion esta realmente vacia, y claro carga
todos los registros, uncos o no.

bueno, un galimatias, pero estoy seguro que me has entendido. Voy a ver
lo que se me ocurre

un saludo y hasta pronto
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida