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) = ""
4 Réponses :
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.
VBA:
=SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(A1)," ","|"),"|"&CHAR(10)," "),CHAR(10)," "))," ",CHAR(10)),"|"," ")
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.
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.
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>
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.
est-ce toujours un seul mot ou peut-il y avoir des multiples?