web-dev-qa-db-fra.com

Supprimer les guillemets lors de la copie depuis une cellule

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

Détails :
J'utilise Excel 2007 sur un ordinateur 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 tant que 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, des guillemets embêtants apparaissent 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 leur ajout automatiquement lorsque la cellule est copiée dans le Presse-papiers?

68
Aaron Thomas

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 en tant que texte pur, vous devez utiliser une macro pour obtenir ce que vous décrivez:

Dans le classeur auquel vous souhaitez appliquer cette option (ou dans votre fichier Personal.xls si vous souhaitez utiliser 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 Cliquez ensuite avec le bouton droit de la souris sur votre classeur dans la fenêtre de projet en haut à gauche et sélectionnez Insertion> 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 affecter la macro à une touche de raccourci (par exemple, CTRL+C pour copie normale) - j'ai utilisé CTRL+Q.

Ensuite, lorsque vous souhaitez copier une seule cellule vers le Bloc-notes/où que vous soyez, utilisez simplement Ctrl + q (ou ce que vous avez choisi), puis effectuez une opération. CTRL+V ou Edition> Coller dans la destination choisie.

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

EDIT: (à partir de commentaires)

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

  • 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 (64 bits)
26
user3616725

Je viens d'avoir ce problème et en enveloppant chaque cellule avec la fonction CLEAN corrigé pour moi. Cela devrait être relativement facile à faire en faisant =CLEAN(, en sélectionnant votre cellule, puis en remplissant automatiquement le reste de la colonne. Après cela, colle dans Notepad ou tout autre programme n’a plus de citations en double.

62
Greg Smalter

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

20
Jonathan Wilson

Si vous souhaitez sélectionner multiple cells et copier leurs valeurs dans le presse-papiers sans toutes ces citations gênantes, le code suivant peut être utile. Ceci est une amélioration du code donné ci-dessus par 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
5
Peter Smallwood

Ma solution lorsque je me suis attaqué au problème des guillemets était de supprimer les retours à la ligne 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.

3
martiangoblin

Problème possible lié à la réponse de "user3616725":
Im sur 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 d'Excel, je reçois deux symboles composés de carrés contenant un point d'interrogation, comme ceci:. Coller dans le bloc-notes ne montre même rien.

Solution:
Après plusieurs recherches, 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, modifiez le Sub "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é dans "user3616725" dans 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 peut attribuer 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 vers le Bloc-notes/où que vous soyez, il suffit de faire Ctrl + q (ou ce que vous avez choisi) puis de faire un Ctrl + v ou Édition> Coller dans la destination choisie.


Edit (21 novembre 2015):
@ commentaire de "dotctor":
Non, ce n'est vraiment pas une nouvelle question! À mon avis, c'est un bon ajout à la réponse acceptée car ma réponse aborde les problèmes que vous pouvez rencontrer 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" utilisateur3616725 ":". Comme commentaire, j'aurais certainement écrit beaucoup plus compact.

2
SourceSeeker

"Si vous voulez sélectionnerplusieurscellules et copier leurs valeurs dans le Presse-papiers sans toutes ces citations gênantes" (sansles bogues dans la solution multi-cellules de Peter Smallwood) " le code suivant peut être utile. " Il s'agit d'une amélioration du code fourni ci-dessus par Peter Smallwood ("qui est une amélioration du code indiqué ci-dessus par l'utilisateur3616725"). Cela corrige les bogues suivants dans la solution de Peter Smallwood:

  • Evite "Erreur de variable non définie" Erreur de compilation (pour "CR" - "clibboardFieldDelimiter" ici)
  • Convertir une cellule vide en une chaîne vide contre "0".
  • Ajoutez l'onglet (ASCII 9) et le CR (ASCII 13) après chaque cellule.
  • Ajoutez un CR (ASCII 13) + LF (ASCII 10) (par opposition à CR (ASCII 13)) après chaque ligne.

REMARQUE: vous ne pourrez toujours pas copier les caractères incorporés dans une cellule qui provoqueraient une sortie du champ cible dans lequel vous collez cette cellule (c.-à-d. Une tabulation ou une CR lors du collage dans la fenêtre d'accès à la table d'édition 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
0
Tom

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 ;-)

0
Stéphane Chivet

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

Exemple: = CLEAN ("1" & CHAR (9) & "QUELQUES NOTES POUR LA LIGNE 1." & CHAR (9) & "2" & CHAR (9) & "QUELQUES NOTES POUR LA LIGNE 2.")

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

0
Yuri Antelo

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 des noms de fichiers et du contenu dans plusieurs fichiers, voici un court extrait de code qui évite les guillemets 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
0
JoshInDC

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)
0
JCP