Te agradezco tu honradez, pero lo he pasado demasiado bien como para cobrar.
EDITO ESTE MENSAJE PARA EVITAR ACUMULACION DE CÓDIGO SIMILAR Y REEMPLAZO LA FUNCION
El caso es que estaba seguro de que la solución no era tan dificil partiendo de lo que ya había hecho, y al final he acabado haciendo justo lo que pedias para que sea más práctica la función.
Resumen:
Función que devuelve un texto aleatorio a partir de un texto base que contenga una o varias partes opcionales.
Para marcar 2 o más partes como opcionales se introducen entre {} y se separan con |
Una opción puede contener otras partes opcionales y estas partes a otras casi sin límite siempre que se encapsulen correctamente.
Ejemplo:
Código :
Ver originalDim Texto As String
Dim Resultado As String
Texto = "Ven y trae a {quien {quieras|tu {elijas|desees}}|la familia|los amigos}"
Resultado = AutoTexto(Texto)
MsgBox Resultado
Código :
Ver originalFunction AutoTexto(ByVal TextoBase As String) As String
On Local Error Resume Next
AutoTexto = TextoBase
Do
Dim PosicionInicio As Long
PosicionInicio = InStr(PosicionInicio + 1, AutoTexto, "{")
If PosicionInicio <> 0 Then
Dim PosicionFin As Long
PosicionFin = InStr(PosicionInicio + 1, AutoTexto, "}")
If PosicionFin > PosicionInicio Then
Dim BuscaMas As Long
BuscaMas = PosicionInicio
Do
BuscaMas = InStr(BuscaMas + 1, AutoTexto, "{")
If BuscaMas > 0 And BuscaMas < PosicionFin Then
PosicionFin = InStr(PosicionFin + 1, AutoTexto, "}")
If PosicionFin = 0 Then Exit Do
Else
Exit Do
End If
Loop
If PosicionFin = 0 Then Exit Do
Dim Contador As Long
Contador = Contador + 1
Dim Lista() As String
ReDim Preserve Lista(Contador)
Lista(Contador) = Mid$(AutoTexto, PosicionInicio + 1, PosicionFin - PosicionInicio - 1)
AutoTexto = Left$(AutoTexto, PosicionInicio - 1) & "TextoVariable" & Format(Contador, "000000") & Mid$(AutoTexto, PosicionFin + 1)
PosicionInicio = 0
Else
Exit Do
End If
Else
Exit Do
End If
Loop
Dim F As Long
For F = 1 To Contador
If InStr(1, Lista(F), "{") <> 0 And InStr(1, Lista(F), "}") <> 0 And InStr(1, Lista(F), "}") > InStr(1, Lista(F), "{") Then
Lista(F) = AutoTexto(Lista(F))
End If
Dim Opciones() As String
Opciones = Split(Lista(F), "|")
Randomize Timer
Dim Eleccion As String
If Trim$(Replace(Lista(F), "|", "")) <> "" Then
Do
Eleccion = Opciones(Rnd * UBound(Opciones))
If Trim$(Eleccion) <> "" Then Exit Do
Loop
Else
Eleccion = Opciones(Rnd * UBound(Opciones))
End If
AutoTexto = Replace(AutoTexto, "TextoVariable" & Format(F, "000000"), Eleccion)
Next F
On Local Error GoTo 0
End Function
EDITO ESTE MENSAJE PARA EVITAR ACUMULACION DE CÓDIGO SIMILAR Y REEMPLAZO LA FUNCION
Ha sido divertido.
Como curiosidad te cuento que cuando ya había probado esta nueva versión y estaba a punto de publicarla se me ocurrió ampliar la parte final del texto de prueba y por suerte decidí probarlo en el programa antes de guardar el mensaje, y resulta que fallaba estrepitosamente.
He tardado un buen rato y estaba a punto de perder la paciencia cuando al fin he encontrado el tonto fallo.
De todas formas he pasado un rato muy entretenido, he creado una función que cualquier día me puede servir para algo y espero haber echado una mano que tambien alegra la vida.
Si aparece un nuevo fallo comentadlo.
Saludos.