Buenas. Reemplazar caracteres en posiciones aleatorias a un guion.

En una columna tengo dni, es decir 12345678A, y justo en la columna de al lado necesito poner los mismos dni pero que de los números 4 de ellos(posiciones aleatorias) sean reemplazados por un guion. No se mucho de vba en excel. Aquí dejo un ejemplo para que quede más claro:

45634822H en la columna de al lado 4--34-2-H

21874455S -> -187-4--5S

13661478Z -> 13---4-8Z

Y así con toda la columna de dni.

¿Tiene solución o es imposible? ¿Habría qué hacer un botón para ejecutar macro?

3 Respuestas

Respuesta
1

Te dejo la función

Function guionesAleatorios(ByVal dni As String, cant As Integer) As String
Dim tamañoDNI As Integer, ubicacion As Integer, cuantos As Integer
Randomize
tamañoDNI = Len(dni)
ubicacion = Int(Rnd() * tamañoDNI + 1)
cuantos = 0
Do While cuantos < cant
    If ubicacion = 1 Then
        dni = "-" & Right(dni, tamañoDNI - 1)
    ElseIf ubicacion = tamañoDNI Then
        dni = Left(dni, tamañoDNI - 1) & "-"
    Else
        dni = Left(dni, ubicacion - 1) & "-" & Mid(dni, ubicacion + 1, tamañoDNI)
    End If
    cuantos = cuantos + 1
    Do While Mid(dni, ubicacion, 1) = "-" And cuantos < cant
        ubicacion = Int(Rnd() * tamañoDNI + 1)
    Loop
Loop
guionesAleatorios = dni
End Function

desde el xls la invocas como cualquier función normal...

El '4' en la fórmula es la cantidad de guiones que quieres reemplazar

Ten en cuenta que la fórmula puede ser muy lenta si tienes muchos datos, ya que el segundo bucle de la fórmula no sabés a ciencia cierta cuando terminará

Salu2

Veo que es tu primer pregunta en este foro. Si te interesa seguir recibiendo respuestas mías te pido que cambies la calificación. Lo esperado por una respuesta que está bien respondida es excelente.

Salu2

Hola Gustavo gracias por la respuesta, tengo una duda, Se podría hacer lo siguiente: que la misma celda tenga la función y a la vez le ponga en dni y que el resultado aparezca automáticamente en la celda de al lado. Me sale problema de referencia circular. ¿Pero yo quiero que el resultado no se muestre en esa misma celda sino en la celda de al lado(celda destino) es posible? nose si me he explicado bien.

No te llego a entender lo que quieres, tal vez podrías poner una imagen con el resultado esperado y los pasos necesarios...

Salu2

Respuesta
1

Si tienes muchos datos es más rápido con una macro, este es el resultado

Y es es la macro, solo cambia el a1 por la celda donde comiencen tus datos y puedes agregarle un boton para activarla

Option Base 1
Sub añadir_guiones()
Dim unicos As New Collection
Set datos = Range("a1").CurrentRegion
With datos
f = .Rows.Count
    For i = 1 To .Rows.Count
        dni = .Cells(i, 1):  largo = Len(dni): cuenta = 0
        For j = 1 To 4
otro:
            posicion = WorksheetFunction.RandBetween(1, largo)
            On Error Resume Next
            unicos.Add posicion, CStr(posicion)
            If Err.Number > 0 Then GoTo otro
            On Error GoTo 0
            hallar = Mid(dni, posicion, 1)
            cambia = Replace(dni, hallar, "-", 1, posicion)
            cuenta = UBound(Split(cambia, "-"))
            If cuenta > 4 Then GoTo otro
            dni = cambia
        Next j
            .Cells(i, 2) = dni
        Set unicos = Nothing
    Next i
    Set unicos = Nothing: Set datos = Nothing
End With
End Sub
Respuesta
1

Lo que debes hacer es detectar donde está el carácter te dejo algunos ejemplos que trabajan con cadena de caracteres, quizás aporten algo más

https://youtu.be/xrnRXULC6QE

https://youtu.be/a40NuvB3YF8

https://youtu.be/gROacIqa2n4

https://youtu.be/JBn9Txju0nU

https://youtu.be/gw69AFiineY

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas