Obtener caracteres de una celda delimitados

Hola!
Mi pregunta es :
En una celda "x" que tengo [alfa],[beta]
¿Como puedo crear una macro en la que:
    Me ponga alfa en una celda especifica
y beta en otra.?
Y esta celda "x" es dinámica, osea ira cambiando de longitud, puede que sea [hola],[adios],[hasta luego]
Bueno, aver si alguien puede ayudarme!
Muchas gracias!

1 Respuesta

Respuesta
1
Para la 1a parte la solución es
Para coger sólo alfa está antesdelimitador
Y para coger beta está despuesdelimitador
Si quieres coger hasta luego tendrás que anidar 2 despuesdelimitador
Function AntesDelimitador(Texto As String, Delimitador As String) As String
'Esta funcion coge un texto antes de un delmitador
'Ej En el texto 123:345 devolvería 123
    Dim i As Integer
    Dim trobat As Boolean
    trobat = False
    For i = 1 To Len(Texto)
        If (Mid(Texto, i + 1, 1) = Delimitador) Then
            AntesDelimitador = Left(Texto, i)
            trobat = True
            Exit For
        End If
    Next i
    If (AntesDelimitador = "") Then AntesDelimitador = Texto
End Function
Function DespuesDelimitador(Texto As String, Delimitador As String) As String
    Dim i As Integer
    For i = 1 To Len(Texto)
        If (Mid(Texto, i + 1, 1) = Delimitador) Then
            DespuesDelimitador = Mid(Texto, i + 2, Len(Texto) - i + 2)
            Exit For
        End If
    Next i
    If (DespuesDelimitador = "") Then DespuesDelimitador = Texto
End Function
Lo primero muchísimas gracias, ahora, para llamrla después de tenerlas las antes delimitador y después delimitador en otra macro, hago así:
mitexto = Range("B132").Select
AntesDelimitador(mitexto,"]")
Pero me dice que el carácter ] es no válido.
¿Es qué no se hace la llamada así?
weno..esque tenia que asignarlo  a un string
mitexto = Range("B132").Select
    nuevoTextoA = AntesDelimitador(Range("B132").Select, "]")
    nuevoTextob = DespuesDelimitador(Range("B132").Select, "],")
    Range("B133") = nuevoTextoA
     Range("B134") = nuevoTextob
Pero, es que me pone en la celda, en vez del valor, me pone Verdadero
Perdón, ya he sresuelto todo esto. Después de calentarme un ratillo la cabeza jejej
Range("B132").Select
    Range("B132").Activate
    mitexto = ActiveCell.Value
    nuevoTextoA = AntesDelimitador(ActiveCell.Value, ",")
    nuevoTextob = DespuesDelimitador(ActiveCell.Value, ",")
    Range("B133").Select
    ActiveCell.Value = nuevoTextoA
   ' Range("B134").Select
   ' ActiveCell.Value = nuevoTextob
   Range("E139").Select
   Range("E139").Activate
   numero = ActiveCell.Value
   For i = 1 To numero
       If (i = 1) Then
        Range("B134").Select
        Range("B134").Activate
         ActiveCell.Value = nuevoTextob
        ActiveCell.Value = AntesDelimitador(ActiveCell.Value, ",")
        End If
        If (i = 2) Then
        Range("B135").Select
        Range("B135").Activate
        ActiveCell.Value = nuevoTextob
        ActiveCell.Value = AntesDelimitador(ActiveCell.Value, ",")
        End If
         If (i = 3) Then
        Range("B136").Select
        Range("B136").Activate
        ActiveCell.Value = nuevoTextob
        ActiveCell.Value = AntesDelimitador(ActiveCell.Value, ",")
        End If
        Range("B139").Select
        Range("B139").Activate
        ActiveCell.Value = nuevoTextob
        nuevoTextob = DespuesDelimitador(ActiveCell.Value, ",")
    Next i
Ahora me surgen dos dudas, como podría hacer para no utilizar los if, osea que fueran aumentando, el numero, B132, B133...
y de esta forma es la única con la que me deja ponerlo :
Range("B139").Select
        Range("B139").Activate
        ActiveCell.Value = nuevoTextob
hay  otra forma de pasarle el valor?
Hay otra forma que no hace falta hacer ningún select, ni nada
Ahora que has dicho lo de los [] tengo una función que coge lo que hay dentro de 2 caracteres. Con esta función si tienes [alfa], si pones letra_entre("[alfa]","[","]") y ya te sale el alfa directamente.
No entiendo muy bien donde quieres colocarlo todo.
El dato está en B132, quieres poner "hola" en B133, "¿adiós" en B134 y "hasta luego" en B135? No entiendo que quieres hacer con la B139.
Function letra_entre(Texto, Caracter_inicial As Variant, Caracter_final As Variant) As String
    Dim i As Byte
    Dim car As String
    Dim ini As Byte
  Dim fin As Byte
    Dim trobat As Boolean
    i = 1
    ini = 0
    fin = 0
    trobat = False
    For Each Item In Texto
        While (trobat = False And i <= Len(Item))
            car = CStr(Mid(Item, i, 1))
    'Es un numero
            If (Asc(car) < 60) Then
                If ((car = Caracter_final) And ini <> 0) Then
                    fin = i
                    trobat = True
                End If
                If (LCase(Mid(Item, i, 1)) = LCase(Caracter_inicial) And ini = 0) Then ini = i
            End If
    'Es una letra
            If (Asc(car) > 60) Then
                If (LCase(car) = LCase(Caracter_final) And ini <> 0) Then
                    fin = i
                    trobat = True
                End If
                If (LCase(Mid(Item, i, 1)) = LCase(Caracter_inicial) And ini = 0) Then ini = i
            End If
            i = i + 1
        Wend
        If (ini = 0 And trobat = False) Then letra_entre = -2
        If (ini = 0 And trobat = True) Then letra_entre = -1
        If (ini <> 0 And trobat = False) Then letra_entre = 0
        If (ini <> 0 And trobat = True) Then letra_entre = Mid(Item, ini + 1, fin - ini - 1)
    Next Item
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas