Saltar al contenido

Separar Palabras - Con Varios Separadores y Conservar Dichos Separadores


alhxavdpw

Recommended Posts

publicado

Tengo la siguiente macro para separar texto (en este caso el separador es ","), me gustaría agregarle una serie más amplia de separadores y por otra parte conservarlos, es decir que si en este caso la ejecuto tal cual está, las comas logran separan el texto, pero son eliminadas del mismo y yo las quiero conservar.

Gracias, dejo la macro a continuación.

Sub separarPalabras2()
Dim celda As Range       'celda que contiene el texto
Dim i As Integer
Dim n As Integer         'número de palabras encontradas
Dim palabras() As String 'arreglo que almacenará las palabras separadas
Dim separador As String  'separador de cada palabra
Dim texto As String      'almacena el texto a separar
 
    'definir el separador de palabras
    separador = "," 'coma
    
    'Ciclo para recorrer los renglones
    For Each celda In Selection
        texto = celda.Value
        
        'Separación del texto en palabras:
        palabras = Split(texto, separador)
        
        'La función UBound devuelve índice final/mayor del arreglo
        'El índice en el arreglo se inicia con cero
        n = UBound(palabras)
        
        'Ciclo para colocar cada palabra en un renglón diferente
        For i = 0 To n
            celda.Offset(i, 1) = palabras(i)
        Next i
 
    Next celda
End Sub
publicado
Hace 30 minutos , alhxavdpw dijo:

y yo las quiero conservar.

¿Pero dónde las quieres conservar? ¿En cada celda con su palabra :huh:? En el texto inicial no te deben desaparecer

publicado
  'Ciclo para colocar cada palabra en un renglón diferente
        For i = 0 To n
            celda.Offset(i, 1) = palabras(i) & Separador '<------------
        Next i

 

publicado
En 15/10/2017 at 5:24 , Antoni dijo:

¿Pero dónde las quieres conservar? ¿En cada celda con su palabra :huh:? En el texto inicial no te deben desaparecer

Gracias Haplox, Antony.

Si, en cada celda con su palabra o caracteres "separadores", es decir, si lo ejecuto en una celda con ésta respuesta quedaría distribuido en una columna:

Considerando que el separador es la palabra " en "

Si,

cadacelda con su palabra o caracteres "separadores", es decir, si lo ejecuto

una celda con ésta respuesta quedaría distribuido en una columna:

Y yo quisiera que quede así:

Si,

en cada celda con su palabra o caracteres "separadores", es decir, si lo ejecuto

en una celda con ésta respuesta quedaría distribuido en una columna:

 

Por otra parte quiero tener la posibilidad de poner varias palabras "separador"

Nuevamente gracias.

publicado
Hace 6 horas, alhxavdpw dijo:

Por otra parte quiero tener la posibilidad de poner varias palabras "separador"

Para lo primero el código de @Antoni es el que tienes que usar.

Para lo segundo, no podrás hacerlo directamente. La función Split solo admite un separador, así que lo tendrías que implementar varias veces (tantas como separadores quieras) en tu código.

Pero ten en cuenta que no puedes poner distintos separadores en un mismo texto y aplicarles Split, obtendrás cosas extrañas. Como ejemplo:

hola,hola1;hola2;hola3-hola4

¿Cómo lo separarías? ¿Con qué separador? :wacko:. Si usas el ";" obtendrías:

  1. hola,hola1
  2. hola2
  3. hola3-hola4

¿Ves por dónde voy...? ;)

publicado

Hola, viendo el tema puedo dejar una opción que aplica con varios separadores:

Sub separar()
Dim separador As Variant
Dim strArray() As String
 
separador = Array(",", ";", "-")
 
texto = "hola,hola1;hola2;hola3-hola4"
 
 For i = LBound(separador) To UBound(separador)
 
 texto = Replace(texto, separador(i), Chr(10))
 
 Next

strArray = Split(texto, Chr(10))

Range("A1").Resize(UBound(strArray) + 1) = Application.Transpose(strArray)
  
End Sub

Este código coloca las palabras ya separadas horizontalmente desde la celda A1 hasta la cantidad de palabras que separe.

Saludos

publicado
Hace 5 horas, Riddle dijo:

Hola, viendo el tema puedo dejar una opción que aplica con varios separadores:

muy bueno @Riddle :lol:. Nunca digas jamás con VBA...

publicado
Hace 28 minutos , Riddle dijo:

@alhxavdpw te sirvió la ayuda brindada ?

Gracias Riddle, en el caso del aporte con que me apoyas, el resultado es excelente por que ya reconoce nuevos separadores, la cuestión aquí es que quiero separar conservando el separador en la celda, es decír que al usarlo en un texto no omita los signos de puntuación.

Que el resultado al aplicarla quedara así:

hola,
hola1;
hola2;
hola3-
hola4

Por otra parte,  ¿como podría ejecutarlo directo de la celda o celdas?

Nuevamente, gracias.

publicado

Aprovechándome de parte del trabajo de Riddle:

Sub separar()
Dim separador As Variant
Dim strArray() As String
'..
separador = Array(",", ";", "-")
texto = "hola,hola1;hola2;hola3-hola4 "
Range("A1").Select
'--
Bucle:
   For t = 1 To Len(texto)
      For i = LBound(separador) To UBound(separador)
         If Mid(texto, t, 1) = separador(i) Then
            ActiveCell = Left(texto, t)
            texto = Mid(texto, t + 1)
            ActiveCell.Offset(1, 0).Select
            GoTo Bucle
         End If
      Next
   Next
ActiveCell = texto
End Sub

Saludos a todos

 

En cuanto a tu otro requerimiento, sube un archivo y señala que celdas son y donde quieres el resultado.

 

 

.

publicado

Hola, con una pequeña modificación mantendrá los separadores:

Sub separar()
Dim separador As Variant
Dim strArray() As String
 
separador = Array(",", ";", "-")
texto = "hola,hola1;hola2;hola3-hola4"
 
 For i = LBound(separador) To UBound(separador)
 
 texto = Replace(texto, separador(i), separador(i) & Chr(10)) '<<<<<<< 
 
 Next

strArray = Split(texto, Chr(10))

Range("A1").Resize(UBound(strArray) + 1) = Application.Transpose(strArray)
  
End Sub

Y para ejecutarlo desde las celdas solo debes modificar la linea texto = "hola,hola1;hola2;hola3-hola4" y hacer referencia a una celda texto = Range("B1").

Saludos.

publicado
Hace 44 minutos , Riddle dijo:

@alhxavdpw, por favor no abandones tus temas e indica si podemos dar el mismo como solucionado.

Saludos.

Otro mas a la lista negra.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
    • Podrías compartir tu solucion
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.