Está en la página 1de 23

Paso a paso: Como encontrar los faltantes o

saltos en numeros consecutivos


Me he olvidado un poco que antes de Excel para contadores, aqui manejamos
Excel para Auditores.

Los que me conocen y siguen desde la época de mi blog llamado "Excel


Máquial"(Máquial, tilde en la primera Á, se llamaba Máquial, de maquiavélico
por aquello de que el fin justifica los medios) saben que este tema ya fué
explicado hace algunos años, concretamente en el año 2008. Sin embargo, como
apenas es que estoy siendo reconocido, y una colega de nuevo lo pregunta hoy 5
de Marzo en el grupo Excel Audi de Facebook:

Paso a explicarlo nuevamente. (No hago video porque tengo mucho ruido
ambiental, y por ahi un señor se me delicó y me dijo que no editar esos baches
tales como que me suene el telefono era una falta de respeto...o sea: uno
encuentra cositeros por doquier)

Teniendo la lista de numeros tal como esta:

Puedo montar una formulita en la celda B2 que me haga esa verificación. ¿Como?

....Pensando que si los consecutivos son correctos y no hay saltos en ellos, al ser
restados siempre deberían ser igual a uno.
Esto significa que podria escribir una formula tal como A3-A2=1

Observe:

En la celda B2, monté esa formula, y como el resultado NO ES UNO, esa


afirmación arroja un falso. Si fuera = 1, habria indicado un verdadero.

Asi que basado en esto, puedo montar una formulita Si condicional, en la cual le
digo, que si esa operacion es verdadera, no diga nada, y si es falso, que me
coloque el texto "hay un salto en el consecutivo". Esa formulita, en la celda B2, se
escribe asi:
=SI(A3-A2=1;"";"hay un salto en el consecutivo")

Como en este caso, 357894 menos 357892 es igual a 2, y no 1, pues la formula


devuelve lo que le indicamos que colocara para el caso en que la prueba lógica es
falsa.

Esta formula se puede mejorar, y que en el mismo texto nos indique cual es el
numero que falta, o el numero que se está saltando en la secuencia. Pero
tenemos el caso en que falte solo un numero, y el caso en el que falten por lo
menos dos numeros. Vamos de menos a más: Hagamos el primer caso, cuando
falta solo un numero, que es el caso del ejemplo, en el que vemos que falta el
numero 357893. ¿Como hacer que nos escriba automaticamente el numero que
hace falta?
Respuesta: concatenando el numero resultado de la operacion en el texto, en el
segundo argumento de la funcion, y dado que es una segunda operacion lógica,
anidamos un segundo sí en la parte que evalua si el caso no es verdadero, asi:
Ahora la formula en B2 es asi:
=SI(A3-A2=1;"";SI(A3-A2=2;"Falta el numero "&A2+1))

Observe que al final de la formula, termina en dos parentesis de cierre )), y que
hace falta el caso para cuando el resultado de esta segunda situacion sea falso,
es decir, la diferencia de los dos numeros es diferente a 2. Ya tenemos en el
primer Si, cuando la diferencia es 1; ya tenemos cuando la diferencia es 2. Asi que
si tuvieramos un caso en el que la diferencia es mas de 2, nos arrojaría un
FALSO:

Mire que 357899 menos 357896 es 3, y este caso no está contemplado, sin
embargo es el bloque que vá en el segundo argumento del segundo si. Como no
se le ha indicado nada, ella misma nos dice que el resultado es falso. Mire;
Asi que solo bastaría con completar la lógica para cuando el segundo argumento
sea falso, y este es, para cuando la diferencia sea mayor a 2.

=SI(A6-A5=1;"";SI(A6-A5=2;"Falta el numero "&A5+1;SI(A6-A5>2;"Falta desde


el Numero "&A5+1&" Hasta el Numero "&A6-1;"")))

Y utilizo la misma técnica de concatenar el resultado para que me diga todo el


rango de numeros faltante:

Observe en esta segunda imagen como nos funciona perfecto: Aqui tenemos el
caso de 3 numeros faltantes y la formula nos arroja con texto y todo, los numeros
que faltan.

Pero las cosas se pueden complicar más en la vida real. Podríamos tener un salto
de número que en realidad es el inicio de una nueva secuencia bajo otro tipo de
comprobante, por ejemplo:
Del 357899, cambia al 57898, por la razón de que ya corresponde a Codigo de
Comprobante diferente.

En este caso, ese salto no debería ser marcado.

Se resuelve realizando una nueva anidación al principio de la formula, que primero


evalúe si la celda 0101 es igual a la inferior, realicé toda la prueba lógica, de lo
contrario, no haga nada.

Este archivo y ejemplos aqui se los dejo, esta es la imagen, y debajo está el
enlace hacia mi carpeta de dropbox.
Clic aqui para descargar el archivo: Ojo, dale DESCARGAR, no Guardar. Luego
abres Excel y activas las macros.
http://www.mediafire.com/download/e50z7edzq436e42/ExcelAudiConsecutivos.xls

Si te ha llegado por email, reenvialo a tus amigos, entra a mi


bloghttp://alejandroquiceno.blogspot.com/ y suscribete !

Este tema se puede trabajar con macros y con tablas dinámicas, otro dia les
muestro como se hace.
Saludos, y muchos éxitos.
Hace más de un mes que publique el post mas reciente del blog, así que ya es
hora de publicar uno nuevo y como estoy recien desempacadito de unas bien
merecidas vacaciones desde una paradisiaca playa vengo inspirado, espero lo
noten (jajaja).

Estaré publicando una serie de artículos sobre ( UDF’S ) que quiere decir User
Defined Formulas y que traducido a cristiano quiere decir fórmulas definidas por
el usuario.

Tal vez ustedes se han de estar preguntando para qué demonios sirven o con que
se comen estas mentadas UDF’s, tranquilos no desesperen que para allá voy….

Las UDF’s como les explique anteriormente son fórmulas, pero ojo, no son las
fórmulas estándar que conocemos de Excel entiéndase esto como (SUMA,
SUMAR.SI, BUSCARV, etc, etc, etc ), la diferencia es en que estas fórmulas son
programadas en nuestro editor de Visual Basic del Excel y nos sirven para
extender la funcionalidad de las fórmulas ya existentes o bien para crear nuevas
fórmulas o cálculos que no podríamos hacer con las formulas nativas existentes
de Excel o si se podrían hacer pero requeriría mas cerebro de nuestra parte para
anidar varias formulas estándar y llegar al mismo resultado.

Después del breviario, les presento una fórmula UDF que le he bautizado
como COMPLEMENTO,para que se vayan dando una idea de lo que estas son
capaces de hacer. Bueno si les es útil a alguno de ustedes podrán bautizarla como
quieran ya que tendrán el código y podrán modificarlo a su antojo ( bueno hasta
que registre el Copyright… después tendrán que pagarme derechos de autor, ja
jaja ).

Bueno ahora sí a lo que te truje chencha, lo que hace esta función es algo muy
simple pero a veces complicado de determinarlo cuando se tiene infinidad de
registros, por ejemplo tenemos los números 1,2,3,4,5,8,10,11,15,20,25,27, etc,
etc, etc, si son observadores ya han de haber notado que los numero no son
consecutivos, que del 5 se salta al 8 y del 8 al 10 o sea que hacen falta los
números 6, 7 y 9 . Supongamos que estos números son los folios de facturación
de alguna empresa y los folios faltantes son las facturas canceladas, esto está bien
si la información se requiere así, pero resulta que a alguien se le ocurre la
grandiosa idea de que quiere saber cuáles folios están cancelados y para acabarla
de amolar resulta que tenemos un software administrativo medio chafa que no
nos da ningún reporte de folios cancelados (estamos suponiendo OK, no creo
que esto suceda ) . Bueno creo que ya me debieron haber entendido cual es la
finalidad que busco con esta fórmula o por si no me han captado todavía, es el
que me identifique los números faltantes de folios, fácil no.

Pues aunque parezca fácil a uno que otro todavía nos complican la vida cuando
nos piden esta información, así que si estas en este supuesto esta función te va a
caer como una bendición. Bueno ya he dicho bastante así que chan chan chan,
les presento la fórmula COMPLEMENTO
Ahora probablemente se han de estar preguntando, ¡¡¡ y ahora como funciona
esto !!! , pues funciona de una forma muy sencilla, solamente tienes que pegar el
Código en un módulo estándar. ¿En dónde pego el código VBA?
?
1
2 Option Explicit
3
4 Function COMPLEMENTO(Rango)
5 Dim obj, i As Integer, c
6 Set obj = CreateObject("Scripting.Dictionary")
7
For i = Application.Min(Rango) To Application.Max(Rango)
8 If IsError(Application.Match(i, Rango, 0)) Then obj(i) = i
9 Next i
10
11 Dim b()
12 ReDim b(1 To Rango.Count)
13 i = 1
For Each c In obj.items
14 b(i) = c
15 i = i + 1
16 Next
17
18 COMPLEMENTO = Application.Transpose(b)
19
Set obj = Nothing
20
21
End Function
22
23
Y después de haber pegado el código en el módulo ve a la hoja de Excel y la
llamas como cualquier otra función, únicamente aquí la diferencia es que la
debes de llamar como una función matricial, esto es que debes de presionar
Ctrl+Shift+Enter al finalizar la fórmula, por ejemplo:
Selecciona el rango C2:C15 e ingresa la fórmula COMPLEMENTO(A2:A15)
antes de dar Enter debes de presionar las teclas Ctrl+Shift+Enter para que la
fórmula sea identificada como matricial.
Y el resultado final debe de quedar como en la siguiente imagen.

Aquí les dejo el link de descarga del archivo de Excel. Descargar Ejemplo
Cualquier duda, comentan.
BUSCARV con valores
repetidos en Excel
La función BUSCARV nos permite encontrar un valor dentro de un rango
de celdas y aunque el valor buscado se repita varias veces, la función
BUSCARV siempre nos devolverá solo la primera ocurrencia encontrada.
A veces queremos utilizar la función BUSCARV con valores repetidos
en Excel para encontrar la enésima ocurrencia de algún valor, pero eso
no sucederá automáticamente.

La verdad es que no podemos hacer este tipo de búsquedas utilizando


solamente la función BUSCARV, es necesario encontrar alternativas que
nos permitan indicar dentro de la fórmula el número de ocurrencia que
necesitamos. En esta ocasión utilizaremos como ejemplo una lista de
nombres de personas con sus respectivas edades tal como lo puedes ver
en la siguiente imagen.

En nuestros datos existen nombres repetidos, así que la fórmula que


construyamos tendrá que considerar el número de ocurrencia indicado en
la celda E3. A continuación revisaremos cada una de las opciones que
tenemos para resolver este problema.
Opción 1: Columna auxiliar numerada

La primera alternativa que tenemos es utilizar una columna auxiliar


donde podamos incluir a cada valor del rango su número de ocurrencia,
por ejemplo, la primera aparición del nombre Blanca deberá
transformarse enBlanca1 y la segunda aparición en Blanca2 y así
sucesivamente. Para poder contar las apariciones de cada valor haremos
uso de la función CONTAR.SI de la siguiente manera:

=A2 & CONTAR.SI(A$2:A2, A2)

El objetivo de la función CONTAR.SI será contar las apariciones de la


celda A2 en el rango indicado en su primer argumento, que en este caso
será solamente la celda A2 (A$2:A2), por lo que obtendremos como
resultado la cuenta de uno.

Observa que para el primer argumento de la función CONTAR.SI he


utilizado el inicio del rango como una referencia mixta (A$2) lo cual fijará
el número de fila donde se inicia el rango a considerar en la cuenta de
manera que al copiar esta fórmula hacia abajo la única parte que será
modificada será el final del rango. En la siguiente imagen puedes
observar el resultado de copiar la fórmula hacia abajo.
De esta manera la función CONTAR.SI nos ha ayudado a identificar el
número de ocurrencia de cada uno de los elementos de nuestro rango y
esta nueva columna auxiliar nos servirá para realizar la búsqueda de la
ocurrencia exacta utilizando la función BUSCARV de la siguiente
manera:

=BUSCARV(F1&F2,B2:C10,2,FALSO)

En este caso el valor buscado será la concatenación de las celdas F1 y


F2 ya que el rango de búsqueda será la columna auxiliar recién creada.
Observa cómo esta fórmula nos devuelve el valor correcto de la
calificación para la tercera ocurrencia de Carlos:
De esta manera hemos podido utilizar la función BUSCARV con
valores repetidos y obtener el resultado esperado con solo haber
insertado los números de ocurrencia en una columna auxiliar.

Opción 2: Utilizar una fórmula matricial

La segunda opción que podemos utilizar es una fórmula matricial que nos
permita identificar aquellos valores dentro del rango que contengan el
valor buscado y obtener el número de fila que ocupan dentro de la hoja.
Ya que esta es una fórmula de mayor complejidad que la anterior, la
desarrollaremos paso a paso para dejar en claro su funcionamiento.

La primera parte de la fórmula implica el uso de la función SI para


comparar los elementos del rango con el valor buscado. En caso de que
la comparación sea verdadera utilizaré la función FILA para obtener su
posición dentro de la hoja.

=SI(A2:A10=E1, FILA(A2:A10))

Como ejemplo colocaré esta fórmula matricial en el rango G2:G10 para


que puedas observar el resultado devuelto. Recuerda que al ingresar
esta fórmula será necesario pulsar la combinación de teclas Ctrl + Mayús
+ Entrar:

Solo para aquéllas celdas en el rango A2:A10 que tengan el nombre


de Carlos, se mostrará su número fila en la hoja. El siguiente paso es
encontrar dentro de los resultados anteriores la ocurrencia exacta que
estamos buscando y para eso utilizaremos la función
K.ESIMO.MENOR de la siguiente manera:

=K.ESIMO.MENOR(SI(A2:A10=E1, FILA(A2:A10)), E2)

El primer argumento de esta función es la primera fórmula anterior y su


segundo argumento es la celda que indica la ocurrencia que
necesitamos, que en nuestro ejemplo es la celda E2. Al ingresar esta
fórmula en la celda G2 y pulsar Ctrl + Mayús + Entrar obtendremos el
siguiente resultado:

Esto nos indica que es la fila 8 de nuestra hoja la que contiene la tercera
ocurrencia del nombre Carlos dentro del rango de búsqueda. Para
resolver el problema solamente debemos obtener la fila 8 de la columna
de Edades, así que puedo utilizar la función INDIRECTO para obtener el
valor de dicha celda en base al resultado de la fórmula anterior.

=INDIRECTO("B" & K.ESIMO.MENOR(SI(A2:A10=E1, FILA(A2:A10)), E2))

Lo único que he hecho en esta fórmula es concatenar la letra “B” al inicio


del resultado de la fórmula anterior de manera que obtengamos el valor
que se encuentra en la fila 8 de la columna B de nuestra hoja. Recuerda
pulsar la combinación de teclas Ctrl + Mayús + Entrar al ingresar esta
última fórmula:
Aunque esta fórmula es más compleja que la primera opción mostrada,
nos evita el agregar una columna auxiliar a nuestra hoja.

Opción 3: Crear una función UDF

Si necesitas realizar continuamente búsquedas de este tipo en Excel,


entonces te conviene crear tu propia función UDF que nos permite indicar
la ocurrencia que estamos buscando y obtener el resultado correcto.
Considera el siguiente código VBA para la creación de una nueva función
que nos permitirá buscar entre valores repetidos en Excel:
Function BUSCAROCURRENCIA(valor_buscado As Variant, matriz_buscar As Range, _
1
ocurrencia As Integer, indicador_columna As Integer)
2

3
Dim cont As Integer
4

5
BUSCAROCURRENCIA = "No existe"
6

7
For i = 1 To matriz_buscar.Rows.Count
8
If matriz_buscar.Cells(i, 1).Value = valor_buscado Then
9
cont = cont + 1
10 If cont = ocurrencia Then
11 BUSCAROCURRENCIA = matriz_buscar.Cells(i, indicador_columna).Value

12 Exit Function

End If
13
End If
14
Next
15

16
End Function
17

18

Nuestra función tiene cuatro argumentos que nos ayudarán a hacer la


búsqueda:

 Valor_buscado: Es el valor que estamos buscando


 Matriz_buscar: El rango de celdas con los datos. La búsqueda, al
igual que con la función BUSCARV, se hará en la primera columna
del rango indicado.
 Ocurrencia: El número de ocurrencia del valor_buscado que
necesitamos.
 Indicador_columna: El número de columna a ser devuelto por la
función.

La función hace un recorrido por todo el rango de búsqueda con un bucle


For-Next. En cada iteración se compara el elemento de la primera
columna del rango con el valor buscado y si coinciden, se incrementa en
uno el contador de ocurrencias. Si dicho contador es igual al número de
ocurrencia que necesitamos, entonces se devuelve el valor de la
columna correspondiente. Observa el resultado de utilizar esta función
con nuestros datos de ejemplo:
La función busca el valor indicado en la celda E1 dentro del rango
A2:B10 y recorre los valores de la primera columna en búsqueda de la
ocurrencia indicada en la celda E2. Una vez encontrado dicho valor nos
devolverá la misma fila pero de la columna 2 tal como lo indica el último
argumento de la función.

Es así como hemos evaluado tres alternativas al uso de la función


BUSCARV con valores repetidos en Excel. Ya que la función
BUSCARV no puede realizar este tipo de búsquedas por sí sola, será
necesario elegir alguno de los métodos mostrados en este artículo para
poder encontrar la ocurrencia exacta del valor que estés
buscando. Descarga el libro de trabajo y comienza a sacar provecho de
este tipo de búsquedas en Excel.
Sub proceso()

'por luismondelo

Range("a6").Select

c = 1

Do While ActiveCell.Value <> ""

If ActiveCell.Value <> c Then

lista = lista & "," & c

Else

ActiveCell.Offset(1, 0).Select

End If

c = c + 1

Loop

lista = Mid(lista, 2, Len(lista) - 1)

MsgBox "Los números disponibles son: " & lista

End Sub
Con esta macro te pone en la columna de la derecha de tu correlativo, los números que
falten.

Sigue las Instrucciones para un botón y ejecutar la macro


1. Abre tu libro de Excel
2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
3. En el menú elige Insertar / Módulo
4. En el panel del lado derecho copia la macro
5. Ahora para crear un botón, puedes hacer lo siguiente:
6. Inserta una imagen en tu libro, elige del menú Insertar / Imagen / Autoformas
7. Elige una imagen y con el Mouse, dentro de tu hoja, presiona click y arrastra el
Mouse para hacer grande la imagen.
8. Una vez que insertaste la imagen en tu hoja, dale click derecho dentro de la imagen y
selecciona Asignar macro / Selecciona: correlativos
9. Aceptar.
10. Para ejecutarla dale click a la imagen.

Sub correlativos()

'Por.DAM

c = "A"

n = 1

d = Columns("A").Column + 1

Columns(d).Clear

k = n

For i = n To Range(c & Rows.Count).End(xlUp).Row

ini = Cells(i, c) + 1

For j = ini To Cells(i + 1, c) - 1

If ini < Cells(i + 1, c) Then


Cells(k, d) = ini

k = k + 1

End If

ini = ini + 1

Next

Next

End Sub

Nota: En la macro cambia esto

C = "A" por la columna en donde tengas tus correlativos


n = 1 por el número de fila en donde empiezan tus correlativos
Detectar saltos de correlativo

Sub comprobar_correlativos()
'Ocultamos el prodecimiento
Application.ScreenUpdating = False
'Nos situamos en la primera celda
Range("A1").Select
'ahora recorreremos la columna,
'y nos pararemos cuando encuentre una fila vacía
Do While Not IsEmpty(ActiveCell)
'Miramos si el dato de esa fila, restándole
'1, nos da el valor de la fila anterior. En caso
'contrario, mostraremos un mensaje en la columna de la
'derecha (en una celda adyacente).
'¡Ojo!. Si en la columna de la derecha tienes datos, entonces
'cambia la linea donde pone: ActiveCell.Offset(0, 1) = "Factura no
correlativa"
'por esta: ActiveCell.Offset(0, 2) = "Factura no correlativa".
'Fíjate que ha cambiado el 1 por el 2. Eso quiere decir que 2
columnas
'más a la derecha escribirá ese texto. Si dos columnas a la derecha
'sigues teniendo datos, pon un número de columna que esté libre (3,
4, 10...)
If ActiveCell.Row > 1 Then
If ActiveCell - ActiveCell.Offset(-1, 0) > 1 Then
ActiveCell.Offset(0, 1) = "Factura no correlativa"
End If
End If
'Bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'Mostramos el prodecimiento
Application.ScreenUpdating = True
End Sub
Buscar en varias hojas

Function BUSCARVMultiple(Valor_buscado As Variant, Matriz_buscar_en As


Range, _

Indicador_columnas As Integer, Optional Ordenado As Boolean)

On Error Resume Next

For Each Hoja In ActiveWorkbook.Worksheets


Matriz = Hoja.Range(Matriz_buscar_en.Address)
Encontrado = WorksheetFunction.VLookup _
(Valor_buscado, Matriz, _
Indicador_columnas, Ordenado)

If Not IsEmpty(Encontrado) Then Exit For


Next Hoja

Set Matriz = Nothing


BUSCARVMultiple = Encontrado

End Function
Function BuscarEnHojas(Look_Value As Variant, Tble_Array As Range, _
Col_num As Integer, Optional Range_look As Boolean)

Dim wSheet As Worksheet


Dim vFound
On Error Resume Next
For Each wSheet In ActiveWorkbook.Worksheets
With wSheet
Set Tble_Array = .Range(Tble_Array.Address)
vFound = WorksheetFunction.VLookup _
(Look_Value, Tble_Array, _
Col_num, Range_look)
End With
If Not IsEmpty(vFound) Then Exit For
Next wSheet
Set Tble_Array = Nothing
VLOOKAllSheets = vFound
End Function
Ya la probé y funciona de maravilla. Pones por ejemplo:
=BuscarEnHojas(A1,A:D,4,0)

El valor lo pones en A1, A:D es el rango, 4 es la columna. Es parecida a BuscarV