Oubliez les guillemets lors de la copie depuis la cellule

90

Problème :
lors de la copie d'une cellule d'Excel en dehors du programme, des guillemets sont ajoutés automatiquement.

Détails :
J'utilise Excel 2007 sur une machine Windows 7. Si j'ai une cellule avec la formule suivante:

="1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2."

La sortie dans la cellule (formatée en nombre) ressemble à ceci dans Excel:

1SOME NOTES FOR LINE 1.2SOME NOTES FOR LINE 2.

Bel et bien. Mais, si je copie la cellule dans un autre programme, tel que le bloc-notes, j'obtiens des guillemets doubles ennuyeux au début et à la fin. Notez que les onglets créés par "CHAR (9)" sont conservés, ce qui est bien.

"1  SOME NOTES FOR LINE 1.  2     SOME NOTES FOR LINE 2."

Comment puis-je empêcher ces doubles guillemets d'apparaître lorsque je copie dans un autre programme? En d'autres termes, puis-je empêcher que ceux-ci soient ajoutés automatiquement lorsque la cellule est copiée dans le presse-papiers?

Aaron Thomas
la source
Avez-vous essayé de changer le format pour autre chose que le nombre? Je pense avoir vu des moyens de contourner cela, mais je ne peux pas ouvrir Excel à ce moment précis, je reviendrai dans quelques minutes s'il n'y a toujours pas de réponse.
AdamMc331
@ McAdam331 sur ma configuration, si le format est quelque chose comme du texte, la cellule affiche la formule, pas le résultat calculé. Le formatage en tant que nombre semble remplacer cela pour une raison quelconque.
Aaron Thomas
Pourquoi avez-vous choisi d'utiliser la formule? Est-ce parce qu'Excel ne prend pas en charge un moyen simple d'insérer des caractères de tabulation? Je n'arrive pas non plus à contourner ce problème, peut-être qu'il existe des options autres qu'Excel que vous pouvez utiliser, mais je ne suis pas sûr de la nature du projet.
AdamMc331
En outre, cela peut être un problème, mais si vous ouvrez Excel et commencez à taper dans une cellule (qui est par défaut formatée en général) et que vous entrez du texte, il copiera sans les guillemets. (Testé avec Excel 2013 et Notepad ++) Cela affectera-t-il votre projet de simplement saisir 4 espaces au lieu d'un onglet? Encore une fois, difficile à dire sans connaître le reste du problème.
AdamMc331
1
@ McAdam331 malheureusement, j'ai besoin que cela fonctionne exactement comme je l'ai mis ici, moins les guillemets doubles de début et de fin. Veuillez ne pas laisser les onglets détourner l'attention de cette question - ils doivent être là.
Aaron Thomas

Réponses:

28

Si vous essayez de coller dans Word-Pad, Notepad ++ ou Word, vous n'auriez pas ce problème. Pour copier la valeur de la cellule sous forme de texte pur, pour obtenir ce que vous décrivez, vous devez utiliser une macro:

Dans le classeur où vous souhaitez que cela s'applique (ou dans votre Personal.xls si vous souhaitez utiliser sur plusieurs classeurs), placez le code suivant dans un module standard:

Code:

Sub CopyCellContents()
'create a reference in the VBE to Microsft Forms 2.0 Lib
' do this by (in VBA editor) clicking tools - > references and then ticking "Microsoft Forms 2.0 Library"
Dim objData As New DataObject
Dim strTemp As String
strTemp = ActiveCell.Value
objData.SetText (strTemp)
objData.PutInClipboard
End Sub

Pour ajouter un module standard à votre projet (classeur), ouvrez le VBE avec Alt+ F11, puis cliquez avec le bouton droit sur votre classeur dans la fenêtre de projet en haut à gauche et sélectionnez Insérer> Module. Collez le code dans la fenêtre du module de code qui s'ouvrira à droite.

De retour dans Excel, allez dans Outils> Macro> Macros et sélectionnez la macro appelée "CopyCellContents", puis choisissez Options dans la boîte de dialogue. Ici, vous pouvez attribuer la macro à une touche de raccourci (par exemple, comme CTRL+ Cpour une copie normale) - J'ai utilisé CTRL+ Q.

Ensuite, lorsque vous souhaitez copier une seule cellule dans le Bloc-notes / où que vous soyez, faites simplement Ctrl + q (ou ce que vous avez choisi), puis faites un CTRL+ Vou Édition> Coller dans la destination choisie.

Ma réponse est copiée (avec quelques ajouts) à partir de: ici

EDIT : (à partir des commentaires)

Si vous ne trouvez pas la bibliothèque Microsoft Forms 2.0 dans la liste des références, vous pouvez essayer

  • à la recherche de FM20.DLL à la place (merci @Peter Smallwood)
  • en cliquant sur Parcourir et en sélectionnant C:\Windows\System32\FM20.dll(Windows 32 bits) (merci @JWhy)
  • en cliquant sur Parcourir et en sélectionnant C:\Windows\SysWOW64\FM20.dll (sur 64 bits)
user3616725
la source
1
Il semble que VBA soit la seule solution à cela - merci pour votre contribution.
Aaron Thomas
1
Si vous ne pouvez pas voir la bibliothèque Microsoft Forms dans la liste des références, recherchez FM20.DLL
Peter Smallwood
15
J'obtiens toujours les citations si je colle dans Notepad ++.
Kat
1
@monkeyintern Je pense que j'avais plusieurs lignes de texte dans une cellule, et les diviser en une seule ligne par cellule me permettait de le contourner.
Kat
2
@ user3616725 Les versions mises à jour peuvent avoir modifié ce comportement, mais les versions actuelles de Word et Notepad ++ (à compter de la date de publication de ce commentaire) collent ces guillemets lors d'une sélection de cellule unique ou multiple.
Tony
80

J'ai juste eu ce problème et envelopper chaque cellule avec la CLEANfonction l'a corrigé pour moi. Cela devrait être relativement facile à faire en =CLEAN(sélectionnant votre cellule, puis en remplissant automatiquement le reste de la colonne. Après avoir fait cela, les collations dans le Bloc-notes ou tout autre programme n'avaient plus de guillemets en double.

Greg Smalter
la source
20
Bonne réponse pour effacer les guillemets supplémentaires, mais malheureusement, cela efface aussi les caractères de tabulation ... que, dans la question, je veux garder. Merci pour votre contribution!
Aaron Thomas
Cela a fonctionné pour moi, je ne me souciais pas des onglets - en fait, je voulais tous et les caractères de nouvelle ligne supprimés de toute façon.
Cody
19
Il supprime tous les caractères ASCII inférieurs à 32. Donc, de nouvelles lignes également.
NeplatnyUdaj
1
C'est la vraie réponse.
Tyler Murry
10
Ce n'est pas une bonne solution car elle supprime tous les caractères spéciaux.
Paul le
25

Collez-le d'abord dans Word, puis vous pouvez le coller dans le bloc-notes et il apparaîtra sans les guillemets

Jonathan Wilson
la source
Merci pour votre contribution, mais je ne peux pas marquer cela comme une bonne solution. De plus, il s'agit d'un duplicata d'une solution déjà proposée à cette question, voir stackoverflow.com/a/24913557/2658159 .
Aaron Thomas
4
Merci, j'ai aimé cette solution. Rapide et facile
Bajal
En votant pour celui-ci ... dans mon cas, mon problème était que, pour un type particulier de demande que je reçois, les données arrivent dans un fichier Excel et je dois les coller dans une zone de texte brut. Quand je fais cela, je reçois les citations. J'avais utilisé un éditeur de texte pour supprimer les guillemets supplémentaires (il citait aussi des citations .. ennuyeux!). À la recherche d'une solution simple, j'ai trouvé que le collage dans Word fonctionne d'abord car les guillemets supplémentaires ont disparu. J'aimerais pouvoir voter 10x :)
Carnix
Cela supprimera les caractères de tabulation. Au moins lors de l'utilisation de word, pas sûr de wordpad
Matthew Lueder
C'est la meilleure solution, même pour aujourd'hui.
zygimantus
6

Si vous souhaitez sélectionner plusieurs cellules et copier leurs valeurs dans le presse-papiers sans toutes ces citations ennuyeuses, le code suivant peut être utile. Il s'agit d'une amélioration du code donné ci-dessus à partir de user3616725.

Sub CopyCells()
 'Attach Microsoft Forms 2.0 Library: tools\references\Browse\FM20.DLL
 'Then set a keyboard shortcut to the CopyCells Macro (eg Crtl T)
 Dim objData As New DataObject
 Dim cell As Object
 Dim concat As String
 Dim cellValue As String
 CR = ""
  For Each cell In Selection
  If IsNumeric(cell.Value) Then
   cellValue = LTrim(Str(cell.Value))
  Else
   cellValue = cell.Value
  End If
  concat = concat + CR + cellValue
  CR = Chr(13)
 Next
 objData.SetText (concat)
 objData.PutInClipboard
End Sub
Peter Smallwood
la source
Je pense que c'est la meilleure réponse à ce jour.
posfan12
2
Voir ma réponse basée sur cette réponse qui corrige les bogues suivants avec elle: 1. Convertissez une cellule vide en une chaîne vide contre "0". 2. Ajoutez Tab (ASCII 9) vs CR (ASCII 13) après chaque cellule. 3. Ajoutez un CR (ASCII 13) + LF (ASCII 10) (par rapport à CR (ASCII 13)) après chaque ligne. REMARQUE: vous ne pourrez toujours pas copier des caractères incorporés dans une cellule qui provoqueraient une sortie du champ cible dans lequel vous collez cette cellule (c'est-à-dire Tab ou CR lors du collage dans la fenêtre d'édition de table d'Access ou SSMS).
Tom
^ Corrige également l'erreur du compilateur "Variable non définie" (pour la variable "CR").
Tom
4

Ma solution lorsque j'ai rencontré le problème des citations était de supprimer les retours chariot de la fin du texte de mes cellules. En raison de ces retours chariot (insérés par un programme externe), Excel ajoutait des guillemets à la chaîne entière.

martiangoblin
la source
4
Les guillemets peuvent également être le résultat de CR / LF à l'intérieur de la formule (pas nécessairement à la fin), ou d'un onglet comme dans la question originale de ce fil (char (9)).
Turbo
vous m'avez vraiment rendu la vie facile
dE Source
3

Problème possible en relation avec la réponse de "user3616725":
Im sous Windows 8.1 et il semble y avoir un problème avec le code VBA lié de la réponse acceptée de "user3616725":

Sub CopyCellContents()
 ' !!! IMPORTANT !!!:
 ' CREATE A REFERENCE IN THE VBE TO "Microsft Forms 2.0 Library" OR "Microsft Forms 2.0 Object Library"
 ' DO THIS BY (IN VBA EDITOR) CLICKING TOOLS -> REFERENCES & THEN TICKING "Microsoft Forms 2.0 Library" OR "Microsft Forms 2.0 Object Library"
 Dim objData As New DataObject
 Dim strTemp As String
 strTemp = ActiveCell.Value
 objData.SetText (strTemp)
 objData.PutInClipboard
End Sub

Détails:
En cours d'exécution au-dessus du code et en collant le presse-papiers dans une cellule dans Excel, j'obtiens deux symboles composés de carrés avec un point d'interrogation à l'intérieur, comme ceci: ⍰⍰. Coller dans le Bloc-notes ne montre même rien.

Solution:
Après avoir cherché pendant un certain temps, j'ai trouvé un autre script VBA de l'utilisateur "Nepumuk" qui utilise l'API Windows . Voici son code qui a finalement fonctionné pour moi:

Option Explicit

Private Declare Function OpenClipboard Lib "user32.dll" ( _
    ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () 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 GlobalFree Lib "kernel32.dll" ( _
    ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" ( _
    ByVal lpStr1 As Any, _
    ByVal lpStr2 As Any) As Long

Private Const CF_TEXT As Long = 1&

Private Const GMEM_MOVEABLE As Long = 2

Public Sub Beispiel()
    Call StringToClipboard("Hallo ...")
End Sub

Private Sub StringToClipboard(strText As String)
    Dim lngIdentifier As Long, lngPointer As Long
    lngIdentifier = GlobalAlloc(GMEM_MOVEABLE, Len(strText) + 1)
    lngPointer = GlobalLock(lngIdentifier)
    Call lstrcpy(ByVal lngPointer, strText)
    Call GlobalUnlock(lngIdentifier)
    Call OpenClipboard(0&)
    Call EmptyClipboard
    Call SetClipboardData(CF_TEXT, lngIdentifier)
    Call CloseClipboard
    Call GlobalFree(lngIdentifier)
End Sub

Pour l'utiliser de la même manière que le premier code VBA ci-dessus, changez le sous "Beispiel ()" de:

Public Sub Beispiel()
    Call StringToClipboard("Hallo ...")
End Sub

À:

Sub CopyCellContents()
    Call StringToClipboard(ActiveCell.Value)
End Sub

Et exécutez-le via le menu macro Excel comme suggéré par "user3616725" de la réponse acceptée:

De retour dans Excel, allez dans Outils> Macro> Macros et sélectionnez la macro appelée "CopyCellContents", puis choisissez Options dans la boîte de dialogue. Ici, vous pouvez affecter la macro à une touche de raccourci (par exemple, comme Ctrl + c pour une copie normale) - J'ai utilisé Ctrl + q.

Ensuite, lorsque vous souhaitez copier une seule cellule dans le Bloc-notes / où que vous soyez, faites simplement Ctrl + q (ou ce que vous avez choisi), puis faites Ctrl + v ou Édition> Coller dans la destination choisie.


Edit (21 novembre 2015):
@ commentaire de "dotctor":
Non, ce n'est sérieusement pas une nouvelle question! À mon avis, c'est un bon ajout pour la réponse acceptée car ma réponse traite des problèmes auxquels vous pouvez faire face lorsque vous utilisez le code de la réponse acceptée. Si j'avais plus de réputation, j'aurais créé un commentaire.
@ commentaire de "Teepeemm":
Oui, vous avez raison, les réponses commençant par le titre "Problème:" sont trompeuses. Remplacé par: "Problème possible en relation avec la réponse de" user3616725 ":". En guise de commentaire, j'aurais certainement écrit beaucoup plus compact.

SourceSeeker
la source
Je pense que cela fonctionne comme une réponse valide (bien que l'ouverture avec Problem ait donné l'impression que vous aviez un nouveau problème). Et les commentaires sont limités à 600 caractères, donc ce serait certainement trop long pour cela.
Teepeemm
Merveilleux! Merci! Le seul problème semble être que cela ne fonctionne que pour une seule cellule. Peut-il être amélioré d'une manière ou d'une autre pour permettre la copie de plages?
NeplatnyUdaj
3

"Si vous souhaitez sélectionner plusieurs cellules et copier leurs valeurs dans le presse-papiers sans toutes ces citations ennuyeuses" ( sans les bogues de la solution multi-cellules de Peter Smallwood) "le code suivant peut être utile." Ceci est une amélioration du code donné ci-dessus de Peter Smallwood (qui "est une amélioration du code donné ci-dessus de user3616725"). Cela corrige les bogues suivants dans la solution de Peter Smallwood:

  • Erreur de compilation "Variable non définie" évitée (pour "CR" - "clibboardFieldDelimiter" ici)
  • Convertissez une cellule vide en une chaîne vide par rapport à "0".
  • Ajouter l'onglet (ASCII 9) vs CR (ASCII 13) après chaque cellule.
  • Ajoutez un CR (ASCII 13) + LF (ASCII 10) (par rapport à CR (ASCII 13)) après chaque ligne.

REMARQUE: vous ne pourrez toujours pas copier des caractères incorporés dans une cellule qui provoqueraient une sortie du champ cible dans lequel vous collez cette cellule (c'est-à-dire Tab ou CR lors du collage dans la fenêtre d'édition de table d'Access ou SSMS).


Option Explicit

Sub CopyCellsWithoutAddingQuotes()

' -- Attach Microsoft Forms 2.0 Library: tools\references\Browse\FM20.DLL
' -- NOTE: You may have to temporarily insert a UserForm into your VBAProject for it to show up.
' -- Then set a Keyboard Shortcut to the "CopyCellsWithoutAddingQuotes" Macro (i.e. Crtl+E)

Dim clibboardFieldDelimiter As String
Dim clibboardLineDelimiter As String
Dim row As Range
Dim cell As Range
Dim cellValueText As String
Dim clipboardText As String
Dim isFirstRow As Boolean
Dim isFirstCellOfRow As Boolean
Dim dataObj As New dataObject

clibboardFieldDelimiter = Chr(9)
clibboardLineDelimiter = Chr(13) + Chr(10)
isFirstRow = True
isFirstCellOfRow = True

For Each row In Selection.Rows

    If Not isFirstRow Then
        clipboardText = clipboardText + clibboardLineDelimiter
    End If

    For Each cell In row.Cells

        If IsEmpty(cell.Value) Then

            cellValueText = ""

        ElseIf IsNumeric(cell.Value) Then

            cellValueText = LTrim(Str(cell.Value))

        Else

            cellValueText = cell.Value

        End If ' -- Else Non-empty Non-numeric

        If isFirstCellOfRow Then

            clipboardText = clipboardText + cellValueText
            isFirstCellOfRow = False

        Else ' -- Not (isFirstCellOfRow)

            clipboardText = clipboardText + clibboardFieldDelimiter + cellValueText

        End If ' -- Else Not (isFirstCellOfRow)

    Next cell

    isFirstRow = False
    isFirstCellOfRow = True

Next row

clipboardText = clipboardText + clibboardLineDelimiter

dataObj.SetText (clipboardText)
dataObj.PutInClipboard

End Sub
À M
la source
0

Pour conserver les sauts de ligne lors du collage dans le bloc-notes, remplacez cette ligne dans la macro:

strTemp = ActiveCell.Value

par:

strTemp = Replace(ActiveCell.Value, Chr(10), vbCrLf)
JCP
la source
0

Veuillez utiliser la formule ci-dessous

=Clean("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")

et vous obtiendrez ce que vous voulez ;-)

Stéphane Chivet
la source
2
Cela fait l'affaire, mais supprime ma mise en forme (Nouvelles lignes et tabulations)
Gabriel G
0

Vous pouvez le faire dans une macro Excel via VBA, en envoyant les résultats dans un fichier:

Sub SimpleVBAWriteToFileWithoutQuotes()
    Open "c:\TEMP\Excel\out.txt" For Output As #1
    Print #1, Application.ActiveSheet.Cells(2, 3)
    Close #1
End Sub

Et si vous souhaitez obtenir les noms de fichiers et le contenu dans plusieurs fichiers, voici un court extrait qui évite les guillemets doubles autour de la sortie.

Sub DumpCellDataToTextFilesWithoutDoubleQuotes()
    ' this will work for filename and content in two different columns such as:
    ' filename column       data column
    ' 101                   this is some data
    ' 102                   this is more data

    Dim rngData As Range
    Dim strData As String
    Dim strTempFile As String
    Dim strFilename As String
    Dim i As Long
    Dim intFilenameColumn As Integer
    Dim intDataColumn As Integer
    Dim intStartingRow As Integer

    intFilenameColumn = 1     ' the column number containing the filenames
    intDataColumn = 3         ' the column number containing the data
    intStartingRow = 2        ' the row number to start gathering data


    For i = intStartingRow To Range("A1", Range("A1").End(xlDown)).Rows.Count

        ' copy the data cell's value
        Set rngData = Application.ActiveSheet.Cells(i, intDataColumn)

        ' get the base filename
        strFilename = Application.ActiveSheet.Cells(i, intFilenameColumn)

        ' assemble full filename and path
        strTempFile = "w:\TEMP\Excel\" & strFilename & ".txt"

        ' write to temp file
        Open strTempFile For Output As #1
        Print #1, rngData
        Close #1

    Next i

    ' goto home cell
    Application.ActiveSheet.Cells(1, 1).Select
    Range("A1").ClearOutline
End Sub
JoshInDC
la source
0
  • si la formule a plusieurs lignes (signifie avoir un saut de ligne dans la formule), alors le copier-coller fonctionnera de cette manière
  • si peut supprimer plusieurs lignes, aucun guillemet n'apparaîtra lors du copier-coller.
  • sinon, utilisez la fonction CLEAN comme indiqué par @greg dans la réponse précédente
vignesh
la source
0

Remarque: la cause des guillemets est que lorsque les données sont déplacées d'Excel vers le Presse-papiers, elles sont entièrement conformes aux normes CSV qui incluent les valeurs de citation qui incluent des tabulations, de nouvelles lignes, etc. (et les guillemets doubles sont remplacés par deux guillemets doubles)

Donc, une autre approche, en particulier dans le cas d'OP lorsque les tabulations / nouvelles lignes sont dues à la formule, consiste à utiliser des caractères alternatifs pour les tabulations et les retours durs. J'utilise ascii Unit Separator = char (31) pour les onglets et ascii Record Separator = char (30) pour les nouvelles lignes.

Ensuite, le collage dans l'éditeur de texte n'impliquera pas les règles CSV supplémentaires et vous pouvez effectuer une recherche rapide et remplacer pour les reconvertir.

Si les onglets / nouvelles lignes sont incorporés dans les données, vous pouvez effectuer une recherche et remplacer dans Excel pour les convertir.

Qu'il s'agisse d'utiliser une formule ou de modifier les données, la clé pour choisir les délimiteurs est de ne jamais utiliser de caractères qui peuvent figurer dans les données réelles. C'est pourquoi je recommande les caractères ascii de bas niveau.

Spioter
la source
-1

Il est également possible de supprimer ces guillemets doubles en plaçant votre résultat sur la fonction "Nettoyer".

Exemple:

=CLEAN("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")

La sortie sera collée sans les guillemets sur d'autres programmes tels que Notepad ++.

Yuri Antelo
la source
C'est une réponse en double. CLEAN supprime également les nouvelles lignes, onglets, etc.
posfan12