Pasar un UDF a un procedimiento sub vba excel?

Con esta UDF encuentro los números faltantes de un rango o serie consecutivo, el problema surge cuando el número de registros aumenta considerablemente y la hoja se vuelve lenta. El otro inconveniente es que si exporto la información a un archivo nuevo de excel la función deja de funcionar en el nuevo archivo.

Que posibilidad hay de mejorarla o pasarla de UDF a una macro como tal.

He intentado trabajar con el objeto dicctionary pero no he tenido éxito.

Public Function CompletaSerie(r As Range) As String
Dim c As Range
Dim cs, rs As Integer
Dim s As String
For Each c In r
If c.Value = "" Then
s = "La serie no debe tener celdas en blanco"
GoTo fin
End If
Next c
rs = r.Rows.Count
cs = r.Columns.Count
For i = 1 To rs
For j = 1 To cs
a = r.Item(i, j)
If i + 1 <= rs Then
b = r.Item(i + 1, j)
While b <> a + 1 And a + 1 <> ""
s = s & Str(a + 1) & ","
a = a + 1
Wend
End If
Next j
Next i
fin:
CompletaSerie = s
End Function
Respuesta
2

Para crear la macro. Puedes poner una imagen con un ejemplo y me explicas cuál es el resultado esperado. Quiero entender lo que hace la udf con el ejemplo.

La función evalúa e indica el número de consecutivos faltantes de la columna C

Qué mala suerte, en tu imagen no veo cómo pusiste la función.

También veo que la función revisa las columnas. Es decir, puedes tener números en las columnas C, D, E, etc.

Puedes comentar lo siguiente y en este orden:

Ya hice un par de pruebas utilizando columnas y no funciona. ¿Realmente la utilizas para varias columnas o solamente una columna?

¿Cómo tienes la función en la celda B3 y cómo en la B4?

¿Cuántos registros tienes en la hoja?

https://drive.google.com/file/d/1m-0i3Z7qyvMJQ5NAwFe3PhZ6155SqKVO/view?usp=sharing

Adjunto el link para que vea mejor el archivo.

He usado la función con más de 2500 registros y hay empieza los atascos

No tengo acceso al archivo, ya te envié la solicitud.

Pero lo que quiero saber es si siempre utilizas la función comparando la celda anterior con la celda de la misma línea.

Según tu ejemplo, en la función de la celda B3 estás comparando C2 con C3, ¿esto siempre es así?

Según tu ejemplo, en la función de la celda B3 estás comparando C2 con C3, ¿esto siempre es así?

Si siempre se compara el consecutivo del rango inicial con el siguiente, para determinar si falta algún registro.

Ejecuta la siguiente macro.

Si tus valores inician en la celda C2 hacia abajo. Los resultados quedarán en las celdas de la B3 hacia abajo.

Una prueba con 15,000 registros se ejecuta de manera inmediata.

Sub Completar_Series()
  Dim a As Variant, b As Variant
  Dim i As Long, j As Long
  Dim s As String, r As Range
  '
  Set r = Range("C2", Range("C" & Rows.Count).End(3))
  If WorksheetFunction.CountBlank(r) > 0 Then
    MsgBox "La serie no debe tener celdas en blanco"
    Exit Sub
  End If
  '
  a = r.Value2
  ReDim b(1 To UBound(a), 1 To 1)
  For i = 1 To UBound(a, 1) - 1
    s = ""
    For j = a(i, 1) + 1 To a(i + 1, 1) - 1
      s = s & Str(j) & ","
    Next
    If s <> "" Then b(i, 1) = Left(s, Len(s) - 1)
  Next
  Range("B3").Resize(UBound(b)).Value = b
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas