90 votes

Comment copier un texte de plusieurs lignes sans guillemets dans Excel ?

Lorsque vous créez une chaîne de plusieurs lignes dans une cellule Excel (en utilisant la touche Alt-Enter), si vous copiez cette cellule dans un éditeur de texte, Excel ajoutera automatiquement des guillemets (") autour de la chaîne complète, par exemple :

Cell1  |   Simple String 1 
Cell2  |   First line of a 
       |   Multiline string
       |   with 3 lines 
Cell3  |   Another simple line 2

Lorsque vous copiez juste la colonne avec les valeurs dans un éditeur de texte, nous obtenons :

Simple String 1
"First line of a 
Multiline string
with 3 lines"
Another simple line 2

Comment puis-je dire à Excel de ne pas ajouter les guillemets autour d'un texte de plusieurs lignes lorsque je copie depuis Excel ?


Edit : Les éditeurs de texte que j'ai essayés affichent ce comportement :

  • MS Word
  • Wordpad
  • Bloc-notes
  • Notepad++
  • Studio SQL Server

Si vous avez une suggestion sur l'utilisation d'un éditeur particulier (ou d'un des éditeurs ci-dessus), veuillez me dire lequel et comment l'utiliser...

0voto

Gabz Points 113

J'avais le même problème et aucune des solutions de ce post ne m'a aidé. Je vais donc partager la solution qui a bien fonctionné pour moi, au cas où d'autres seraient dans la même situation.

Tout d'abord, cette solution est également conforme à un bogue récemment signalé à Microsoft, qui entraînait la transformation du contenu du presse-papiers en contenu illisible, après toute modification à l'aide de VBA lorsque l'utilisateur accédait à un "dossier d'accès rapide" à l'aide de l'explorateur de fichiers.

Documentation pour la solution du bug de la copie passée, dont le code sera utilisé dans cette réponse, pour supprimer les guillemets du presse-papiers : https://docs.microsoft.com/en-us/office/vba/access/Concepts/Windows-API/send-information-to-the-clipboard

Vous devrez créer une macro comme ci-dessous, et lui attribuer le raccourci clavier "ctrl+c". (Affectation du raccourci clavier = onglet Développeur, Macros, cliquez sur la macro, options, puis mettez la lettre "c" dans le champ du raccourci clavier).

Sub ClipboardRemoveQuotes()
    Dim strClip As String
    strClip = Selection.Copy
    strClip = GetClipboard()
    On Error Resume Next - Needed in case clipboard is empty
    strClip = Replace(strClip, Chr(34), "") 
    On Error GoTo 0
    SetClipboard (strClip)
End Sub

Il vous faudra encore construire les fonctions "SetClipboard" et "GetClipboard".

Nous avons ci-dessous la définition des fonctions "SetClipboard" et "GetClipboard", avec quelques ajustements pour s'adapter aux différentes versions d'Excel. (Mettez le code ci-dessous dans un module)

    Option Explicit
#If VBA7 Then
    Private Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hWnd As LongPtr) As LongPtr
    Private Declare PtrSafe Function EmptyClipboard Lib "User32" () As LongPtr
    Private Declare PtrSafe Function CloseClipboard Lib "User32" () As LongPtr
    Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "User32" (ByVal wFormat As LongPtr) As LongPtr
    Private Declare PtrSafe Function GetClipboardData Lib "User32" (ByVal wFormat As LongPtr) As LongPtr
    Private Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As LongPtr, ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPtr
    Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As Long
    Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
#Else
    Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
    Private Declare Function CloseClipboard Lib "user32.dll" () As Long
    Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
    Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long
    Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
    Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
    Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
    Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
#End If

Public Sub SetClipboard(sUniText As String)
    #If VBA7 Then
        Dim iStrPtr As LongPtr
        Dim iLock As LongPtr
    #Else
        Dim iStrPtr As Long
        Dim iLock As Long
    #End If
    Dim iLen As Long
    Const GMEM_MOVEABLE As Long = &H2
    Const GMEM_ZEROINIT As Long = &H40
    Const CF_UNICODETEXT As Long = &HD
    OpenClipboard 0&
    EmptyClipboard
    iLen = LenB(sUniText) + 2&
    iStrPtr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, iLen)
    iLock = GlobalLock(iStrPtr)
    lstrcpy iLock, StrPtr(sUniText)
    GlobalUnlock iStrPtr
    SetClipboardData CF_UNICODETEXT, iStrPtr
    CloseClipboard
End Sub

Public Function GetClipboard() As String
#If VBA7 Then
    Dim iStrPtr As LongPtr
    Dim iLock As LongPtr
#Else
    Dim iStrPtr As Long
    Dim iLock As Long
#End If
    Dim iLen As Long
    Dim sUniText As String
    Const CF_UNICODETEXT As Long = 13&
    OpenClipboard 0&
    If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
        iStrPtr = GetClipboardData(CF_UNICODETEXT)
        If iStrPtr Then
            iLock = GlobalLock(iStrPtr)
            iLen = GlobalSize(iStrPtr)
            sUniText = String$(iLen \ 2& - 1&, vbNullChar)
            lstrcpy StrPtr(sUniText), iLock
            GlobalUnlock iStrPtr
        End If
        GetClipboard = sUniText
    End If
    CloseClipboard
End Function

J'espère que cela pourra aider d'autres personnes comme cela m'a aidé.

0voto

f-hollow Points 1

L'autre jour, je suis tombé sur le même vieux problème, presque dix ans après le début de ce sujet. Les solutions proposées ici nécessitaient des étapes supplémentaires, ajoutant une complexité que je voulais éviter. J'ai donc trouvé une autre solution qui a fonctionné pour moi.

J'avais besoin de traiter certaines données dans Excel et de sortir quelques valeurs numériques intégrées dans un code XML.

Mon idée maîtresse

Données traitées (simplifiées)

Item 1
Item 2

Sortie souhaitée (simplifiée)

<li>Item 1</li>
<li>Item 2</li>

Au départ, j'ai essayé de générer la sortie sous forme de texte multiligne dans une seule cellule en utilisant CHAR(10). Le texte copié dans mon fichier XML ressemblait à ceci

"<li>Item 1</li>
<li>Item 2</li>"

Puis j'ai compris que je devais simplement créer chaque ligne de code dans une cellule distincte et copier les lignes.

chaque ligne de code dans une cellule séparée

Cela a résolu le problème pour moi.

Et quand on y pense, pourquoi créer un texte multiligne dans une seule cellule si vous avez l'intention de l'insérer dans un autre logiciel ? Si, pour une raison quelconque, vous avez également besoin de l'avoir dans une seule cellule dans Excel, vous pouvez simplement créer le texte dans plusieurs cellules d'une autre feuille de calcul et le concaténer dans votre feuille de calcul en utilisant CHAR(10) ou CHAR(13).

Mon problème actuel

J'ai utilisé Excel pour calculer les coordonnées de certaines structures XML, puis j'ai dû intégrer les coordonnées dans les lignes de code XML prédéfinies.

svg:x="[coor_x]cm"
svg:y="[coor_y]cm"

Comme j'avais de nombreuses paires de coordonnées, il m'a semblé naturel de générer un texte multiligne pour chaque paire de coordonnées afin de pouvoir faire glisser la formule vers le bas facilement.

chaque cellule contient deux lignes pour coor_x et coor_y

Mais la sortie insérée dans un autre logiciel était moins que souhaitable :

"svg:x=""1.43cm""
svg:y=""2.47cm"""
"svg:x=""0.53cm""
svg:y=""2.12cm"""

Une autre approche consistait à avoir une formule pour coor_x dans les rangées paires et une formule différente pour coor_y en rangs impairs. Mais je perdrais alors la possibilité de faire glisser les formules sur autant de rangs que nécessaire. Je devrais copier et coller cette paire de formules ci-dessous un grand nombre de fois et réajuster les références erronées aux cellules stockant les coordonnées.

paire de formules dans deux lignes qui doivent être copiées plusieurs fois

Enfin, lorsque j'ai découvert que ma version d'Excel prenait en charge les tableaux dynamiques, j'ai compris comment procéder correctement. (Je pense que cela devrait également fonctionner sur les anciennes versions d'Excel utilisant des plages nommées).

J'ai généré toutes les lignes pour coor_x dans une colonne, puis a généré toutes les lignes pour coor_y dans une autre colonne, puis a utilisé une version modifiée de la formule pour empiler les données des deux colonnes en une seule :

=LET(a,TRANSPOSE(A8:B9),r,ROWS(a),seq,SEQUENCE(r*COLUMNS(a),,0),arr,INDEX(a,MOD(seq,r)+1,seq/r+1),arr)

générer toutes les lignes pour coor_x dans une colonne, générer toutes les lignes pour coor_y dans une autre colonne, utiliser la formule ci-dessous pour empiler les données de plusieurs colonnes dans une seule colonne

En utilisant les tableaux dynamiques de manière créative, vous pouvez même vous passer de la nécessité d'ajuster manuellement les régions du tableau lorsque vous ajoutez des paires de coordonnées supplémentaires.

J'espère que cette solution vous sera également utile !

0voto

Goozak Points 171

Voici une approche différente qui peut fonctionner avec n'importe quel logiciel...

Mon cas d'utilisation inclut les chaînes citées construites dans Excel (des choses comme msgid "ThisLabel" ) qui sont doublés par la copie ( msgid ""ThisLabel"" ).

J'utilise Visualisateur de presse-papiers gratuit qui vous permet de visualiser les différents formats des données copiées. Avec mon texte copié d'Excel, je passe au format RTF (Rich Text Format) et je copie CELA. Tout est nettoyé et je peux simplement le coller là où j'en ai besoin.

RTF version > Copy from Excel

-1voto

user193542 Points 41

Comme vous, j'avais mes données dans une colonne. Donc pour copier les valeurs sans ces guillemets, je concatène la colonne entière avec les données. C'est pour les feuilles de calcul Google Docs mais je pense que cela pourrait fonctionner pour Excel, il faudrait peut-être changer la fonction CONCATENATE.

Pour concaténer toute la colonne G :

=CONCATENATE(G:G)

Il a ajouté les citations uniquement en premier et en dernier, ce qui est assez facile à modifier à la main par la suite.

-1voto

user34210 Points 1

En travaillant sur la réponse de solvus, nous pouvons créer une page web de publication automatique, avec juste la plage de texte que vous voulez - sans guillemets. vous pouvez ensuite copier et coller ceci à d'autres endroits. Une fois que vous l'avez mis en place, il est là pour toujours et mis à jour sans avoir à toucher à votre fichier principal.

pour faire ça,...

Sélectionnez vos cellules, puis save as .. save as file type = Single File Web Page . avec l'option Republish $ : $ (votre gamme sélectionnée.)

cliquez sur publier. sélectionnez AutoRepublish every time this workbook is saved .

  • vous obtiendrez alors une page Web publiée qui contient uniquement vos données classées, dans un format de tableau sans guillemets. copiez et collez :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X