2
votes

Réduction du nombre de sauts de ligne / chr (10) dans une cellule

J'ai une feuille Excel qui contient des cellules avec des quantités variables de sauts de ligne et je souhaite la réduire pour qu'il n'y ait qu'un seul saut de ligne entre chaque nouvelle ligne.

Par exemple

for i to len(mystring)
    if mystring(i) = chr(10) AND myString(i+1) = chr(10) Then
       myString(i + 1) = ""


1 commentaires

est-ce toujours un seul mot ou peut-il y avoir des multiples?


4 Réponses :


3
votes

Vous pouvez le faire avec une formule:

Function manytoone(str As String)
    str = Replace(Application.Trim(str), " ", "|")
    str = Replace(str, "|" & Chr(10), " ")
    str = Replace(str, Chr(10), " ")
    str = Application.Trim(str)
    str = Replace(str, " ", Chr(10))
    str = Replace(str, "|", " ")
    manytoone = str

End Function

Cela change tous les espaces en | puis le Char (10) aux espaces. La garniture supprime les espaces supplémentaires. Le nous inversons, espace pour Char (10) et | pour espaces.

 entrez la description de l'image ici p>


VBA:

=SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(A1)," ","|"),"|"&CHAR(10)," "),CHAR(10)," "))," ",CHAR(10)),"|"," ")

 entrez la description de l'image ici


7 commentaires

Hé Scott, pour votre première question, il peut y avoir plusieurs sauts de ligne. J'ai essayé votre formule et cela fonctionne mais seulement dans une certaine mesure. Il ne tient pas compte des espaces précédant les sauts de ligne. J'ai modifié ma question d'origine pour clarifier ce que je veux dire


Ma question était, est-ce que chaque ligne est un seul mot? Si c'est le cas, nous pouvons supprimer quelques étapes et le faire fonctionner.


@DannyMoncadea voir modifier, les deux vont maintenant s'occuper de cela.


@DannyMoncadea désolé, j'ai oublié d'appuyer sur Entrée lors de l'édition. Désormais, le code et la formule traiteront les espaces sur les lignes vides.


cela fonctionne très bien! Si cela ne vous dérange pas, pouvez-vous m'expliquer le but du rognage? Je ne comprends pas pourquoi le texte est coupé, puis a converti chr (10) en espaces afin de le couper à nouveau. Il semble que le rognage soit essentiel pour obtenir la sortie correcte, mais je ne comprends pas pourquoi il faut toute cette conversion pour que cela fonctionne correctement.


@DannyMoncadea TRIM supprimera les espaces supplémentaires, donc tout double, triple, ... deviendra un espace. Nous réduisons donc d'abord les espaces supplémentaires à un. Ensuite, nous remplaçons tous les char (10) et space-Char (10) par space et coupons à nouveau pour supprimer tous les caractères supplémentaires (10). Déplacez ensuite les espaces restants sur char (10). Mais nous devons également nous occuper des espaces recherchés. que nous transformons en "|" comme espaces réservés.


@DannyMoncadea veuillez considérer le marquage comme correct en cliquant sur la coche à côté de la réponse.



0
votes

Une méthode VBA remplacerait les constantes vbLf consécutives par une seule.

Faites une boucle dans la chaîne tant qu'il y a plus d'un vbLf ensemble, une fois supprimé, remplacez la chaîne.

Sub RemoveExcessLinebreaks()

    Dim s As String, rng As Range
    Set rng = ThisWorkbook.Worksheets(1).Range("B4")
    s = rng.Value

    While InStr(1, s, vbLf & vbLf) > 0
        s = Replace(s, vbLf & vbLf, vbLf)
    Wend

    rng.Value = s

End Sub

De toute évidence, vous devrez modifier l'objet rng selon vos besoins, ou le transformer en paramètre du sous lui-même.

vbLf est une constante pour un "LineFeed". Il existe plusieurs types de nouvelles lignes, comme un vbCr (retour chariot) ou un vbCrLf (combiné). Appuyer sur Alt + Entrée dans une cellule semble utiliser la variante vbLf , c'est pourquoi j'ai utilisé cette constante sur les autres.


0 commentaires

1
votes

Vous pouvez utiliser des expressions régulières.

Le modèle regex ci-dessous supprime toute ligne contenant de zéro à n'importe quel nombre d'espaces, ainsi que son crlf de fin, et supprime également le crlf à la fin du mot final. p >

Option Explicit
Sub trimXSLF()
    Dim myRng As Range, myCell As Range, WS As Worksheet
    Dim RE As Object
    Const sPat As String = "^\s*[\x0A\x0D]+|[\x0A\x0D](?!\s*\S+\s*)"
    Const sRepl As String = ""

Set WS = Worksheets("sheet4") 'or whatever
With WS
    Set myRng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .Pattern = sPat

    For Each myCell In myRng
        myCell = .Replace(myCell.Value2, sRepl)
    Next myCell

End With
End Sub

Si myRng est grand (des dizaines de milliers de lignes), la macro pourrait exécuter le processus sur un tableau VBA pour plus de vitesse.

p>


0 commentaires

0
votes

Cela a déjà été assez bien répondu, mais ne répond pas encore à l'une des exigences (avoir 1 ligne entre chaque nouvelle ligne), voici donc ma réponse à cette question. Veuillez consulter les commentaires à travers le code pour plus de détails:

Option Explicit

Sub reduceNewLines()

Dim ws As Worksheet: Set ws = ActiveWorkbook.Sheets("Sheet1")
Dim lRow As Long: lRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim lCol As Long: lCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
Dim arrData As Variant: arrData = ws.Range(ws.Cells(1, 1), ws.Cells(lRow, lCol))
Dim arrVal() As String
Dim R As Long, C As Long, X As Long

For R = LBound(arrData) To UBound(arrData) 'Iterate through each row of data
    For C = LBound(arrData, 2) To UBound(arrData, 2) 'iterate through each column of data (though might be just 1)

        arrVal = Split(arrData(R, C), Chr(10)) 'allocate each row to an array, split at new line

        arrData(R, C) = "" 'reset the data inside this field

        For X = LBound(arrVal) To UBound(arrVal)
            arrVal(X) = Trim(arrVal(X)) 'clear leading/trailing spaces
            If Left(arrVal(X), 1) <> " " And arrVal(X) <> "" Then
                arrData(R, C) = arrData(R, C) & arrVal(X) & Chr(10) & Chr(10) 'allocate new data + 2 lines
            End If
        Next X

        arrData(R, C) = Left(arrData(R, C), Len(arrData(R, C)) - 2) 'remove the last 2 extra new lines
    Next C
Next R

ws.Range(ws.Cells(1, 1), ws.Cells(lRow, lCol)) = arrData 'allocate the data back to the sheet

End Sub

Heureux de vous aider si nécessaire.


0 commentaires