encontrar sin bucles 1er nro que falte en serie

13/09/2007 - 01:47 por Ivan | Informe spam
hola a todos de nuevo,

sabeis como puedo buscar [via codigo] la primera ocurrencia que falte
[en una columna] en una serie numerica consecutiva (y claro, sin
repeticiones)

con bucles no creo que tenga ningun problema, pero si la lista es
larga y como el proceso ya va englobado con otros cuantos, podria
suponer una demora añadida

supongo que debe haber alguna funcion de hoja (CountIf pej????) que se
pueda aplicar para agilizar el proceso, pero no se me ocurre cual ni
como

si teneis alguna idea os lo agradezco

un saludo
Ivan

Preguntas similare

Leer las respuestas

#6 Ivan
15/09/2007 - 04:24 | Informe spam
hola Hector,

lo 1º muchas gracias de nuevo, vuelves a dejarme alucinado

solo con relacion a la instruccion donde verificas si hubo error en la evaluacion de los rangos...
...
-> falla si la numeracion NO inicia desde 1
...
-> falla si la ultima celda esta vacia
..
-> falla si el salto ocurre precisamente en la ultima celda



y a volverme casi loco a base de darle vueltas a tu ultimo codigo para entenderlo y para intentar evitar los posibles
fallos que comentas [reconozco que por puro vicio y por seguir 'rizando el rizo', pues realmente ne mi caso concreto
serian evitables de antemano pasando el rango adecuado] =>

al final solo he conseguido evitarlos [creo] adaptando mi codigo, pero el tuyo sigue siendo demasiado para mi, aunque al
menos he logrado empezar a entender el funcionamiento de varias funciones de hoja en vba (aparte de las utilizadas me he
dado una vuelta [infructuosa en su mayoria] por unas cuantas mas haciendo pruebas)

de todas formas te pongo ambos, probados con los siguientes rangos y series:

1.- rango empezando en fila 2 (pej: a2:a20)
1.1 -todas las filas con numeros
1.1.1.-empezando la serie en el 1
1.1.1.1.-serie completa
1.1.1.2.-faltando un nº intermedio
1.1.1.3.-faltando el penultimo nº
1.1.2. - empezando en otro nº
1.1.2.los mismos casos
1.2.- con la 1ª y/o la ultima fila vacias
1.2los mismos casos
2.-rango empezando en una fila mayor que 2
2.1...los mismos caso

3.- End Casos

bueno, creo que lo entenderas,

con la adaptacion de la mia creo que se obtienen los resultados correctos, pero con la tuya (e intentando respectar su
estructura) no lo he conseguido, e incluso creo que he acabado desvariando un poco (devuelve todos bien, excepto cuando
la 1ª o ult. fila estan vacias, que devuelve, para el 1er caso el valor de la 1ª celda - 1, y para el 2º el de la ultima
+1).

aqui te las pongo para ver donde me he atascado (como te digo no es que me sea imprescindible pues lo normal seria
restringir el rango al adecuado y asegurarte de que es correcto, pero por ir practicando)

Function SaltoEnSerie_2(Rango As Range) As Long ' HM
Dim Hoja As String, pf As Long, Gpo1 As String, Gpo2 As String, Max As Long, Min As Long, Salto
With Rango: Hoja = .Parent.Name & "!": Max = .Rows.Count
If .Cells(1) <> "" Then pf = 0 Else pf = .Cells(1).End(xlDown).Row - .Cells(1).Row
Gpo1 = .Offset(pf, 0).Resize((Max - pf) - 1, 1).Address(0, 0): End With
Gpo2 = Range(Gpo1).Offset(1).Address(0, 0): Min = Application.Min(Rango) - 1
Salto = Evaluate("match(false," & Hoja & Gpo1 & "=" & Hoja & Gpo2 & "-1,0)+1")
Salto = IIf(IsError(Salto), 0, Salto) * -(Application.Count(Rango) = _
Max - (pf + (-1 * (Rango.Cells(Max, 1) = ""))))
SaltoEnSerie_2 = Salto + Min
End Function

Public Function Salto_Serie_4(rng As Range) As Variant
Dim uf As Long, pf As Long, ref1 As String, ref2 As String, _
Hoja As String, Salto, inicio
With rng
Hoja = .Parent.Name
uf = .Rows.Count
If .Cells(1) <> "" Then pf = 1 Else _
pf = (.Cells(1).End(xlDown).Row - .Cells(1).Row) + 1
inicio = .Cells(pf, 1).Value
ref1 = Range(.Cells(pf, 1), .Cells(uf - 1, 1)).Address(0, 0)
ref2 = Range(.Cells(pf + 1, 1), .Cells(uf, 1)).Address(0, 0)
On Error Resume Next
Salto = Evaluate("match(false," & Hoja & "!" & ref1 & "=" & _
Hoja & "!" & ref2 & "-1,0)+1") + inicio - 1
If Err.Number <> 0 Or Salto > Application.Max(rng) Then Salto = ""
End With
Salto_Serie_4 = Salto
End Function

bueno, si sigues animado a rizarzo un poco mas por aqui ando (bueno, ya mañana)

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#7 Héctor Miguel
15/09/2007 - 06:14 | Informe spam
hola, Ivan !

[no me lo vas a creer... pero]... *sabia que preguntarias por eso* :))

si es requisito que la funcion considere como *saltos en el consecutivo* las celdas que se dejan en blanco
[ya sea intermedias, al inicio y/o al final del rango con la numeracion que se espera sea consecutiva]...
solo necesitas eliminar la comparacion contra la *cuenta de numeros* en la ultima linea de la propuesta anterior

de: -> SaltoEnSerie = IIf(IsError(Salto), 0, Salto) * -(Application.Count(Rango) = Max)
a: -> SaltoEnSerie = IIf(IsError(Salto), 0, Salto)

saludos,
hector.

__ la consulta original __
solo con relacion a la instruccion donde verificas si hubo error en la evaluacion de los rangos...
...
-> falla si la numeracion NO inicia desde 1
...
-> falla si la ultima celda esta vacia
...
-> falla si el salto ocurre precisamente en la ultima celda



y a volverme casi loco a base de darle vueltas a tu ultimo codigo para entenderlo y para intentar evitar los posibles fallos que comentas [reconozco que por puro vicio y por seguir 'rizando el rizo', pues realmente ne mi caso concreto serian evitables de antemano pasando el rango adecuado] =>

al final solo he conseguido evitarlos [creo] adaptando mi codigo, pero el tuyo sigue siendo demasiado para mi, aunque al menos he logrado empezar a entender el funcionamiento de varias funciones de hoja en vba (aparte de las utilizadas me he dado una vuelta [infructuosa en su mayoria] por unas
cuantas mas haciendo pruebas)

de todas formas te pongo ambos, probados con los siguientes rangos y series:

1.- rango empezando en fila 2 (pej: a2:a20)
1.1 -todas las filas con numeros
1.1.1.-empezando la serie en el 1
1.1.1.1.-serie completa
1.1.1.2.-faltando un nº intermedio
1.1.1.3.-faltando el penultimo nº
1.1.2. - empezando en otro nº
1.1.2.los mismos casos
1.2.- con la 1ª y/o la ultima fila vacias
1.2los mismos casos
2.-rango empezando en una fila mayor que 2
2.1...los mismos caso

3.- End Casos

bueno, creo que lo entenderas,

con la adaptacion de la mia creo que se obtienen los resultados correctos, pero con la tuya (e intentando respectar su estructura) no lo he conseguido, e incluso creo que he acabado desvariando un poco (devuelve todos bien, excepto cuando la 1ª o ult. fila estan vacias, que devuelve, para el 1er
caso el valor de la 1ª celda - 1, y para el 2º el de la ultima +1).

aqui te las pongo para ver donde me he atascado (como te digo no es que me sea imprescindible pues lo normal seria restringir el rango al adecuado y asegurarte de que es correcto, pero por ir practicando)

Function SaltoEnSerie_2(Rango As Range) As Long ' HM
Dim Hoja As String, pf As Long, Gpo1 As String, Gpo2 As String, Max As Long, Min As Long, Salto
With Rango: Hoja = .Parent.Name & "!": Max = .Rows.Count
If .Cells(1) <> "" Then pf = 0 Else pf = .Cells(1).End(xlDown).Row - .Cells(1).Row
Gpo1 = .Offset(pf, 0).Resize((Max - pf) - 1, 1).Address(0, 0): End With
Gpo2 = Range(Gpo1).Offset(1).Address(0, 0): Min = Application.Min(Rango) - 1
Salto = Evaluate("match(false," & Hoja & Gpo1 & "=" & Hoja & Gpo2 & "-1,0)+1")
Salto = IIf(IsError(Salto), 0, Salto) * -(Application.Count(Rango) = _
Max - (pf + (-1 * (Rango.Cells(Max, 1) = ""))))
SaltoEnSerie_2 = Salto + Min
End Function

Public Function Salto_Serie_4(rng As Range) As Variant
Dim uf As Long, pf As Long, ref1 As String, ref2 As String, _
Hoja As String, Salto, inicio
With rng
Hoja = .Parent.Name
uf = .Rows.Count
If .Cells(1) <> "" Then pf = 1 Else _
pf = (.Cells(1).End(xlDown).Row - .Cells(1).Row) + 1
inicio = .Cells(pf, 1).Value
ref1 = Range(.Cells(pf, 1), .Cells(uf - 1, 1)).Address(0, 0)
ref2 = Range(.Cells(pf + 1, 1), .Cells(uf, 1)).Address(0, 0)
On Error Resume Next
Salto = Evaluate("match(false," & Hoja & "!" & ref1 & "=" & _
Hoja & "!" & ref2 & "-1,0)+1") + inicio - 1
If Err.Number <> 0 Or Salto > Application.Max(rng) Then Salto = ""
End With
Salto_Serie_4 = Salto
End Function

bueno, si sigues animado a rizarzo un poco mas por aqui ando (bueno, ya mañana)

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#8 Ivan
15/09/2007 - 23:55 | Informe spam
hola Hector,

[no me lo vas a creer... pero]... *sabia que preguntarias por eso* :))







la verdad es que, en lo que respecta a excel y a este foro, de ti,
puedo creerme [casi] cualquier cosa

en cuanto al resto, aunque estoy un poco hecho polvo [del dichoso
curro] y no se si dare pie con bola, me voy a poner a probar tu
sugerencia y a probar algunas modificaciones mas, solo por practicar
un poco con las diversas partes de tu codigo

para mi, aparte de resolver mi problema inicial, el hilo esta
resultando de lo mas productivo en diversos 'frentes'

muchas gracias de nuevo y hasta pronto
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida