Omettez les guillemets lors de la copie à partir d'une cellule
Problème:
Lors de la copie d'une cellule à partir D'Excel en dehors du programme, des guillemets doubles 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.
Bien et bien. Mais, si je copie la cellule dans un autre programme, tel que le bloc-notes, je reçois 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 guillemets doubles d'apparaître, lorsque je copie dans un autre programme? En d'autres termes, puis-je empêcher leur ajout automatique lorsque la cellule est copiée dans le presse-papiers?
10 réponses
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, pour obtenir ce que vous décrivez, vous devez utiliser une macro:
Dans le classeur où vous voulez que cela s'applique (ou dans votre personnel.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 de votre projet (classeur), ouvrir le VBE avec Alt+F11 et ensuite, faites un clic 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.
Retour dans Excel, allez 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 la copie normale) - j'ai utilisé CTRL+Q.
Ensuite, lorsque vous voulez copier une seule cellule sur le bloc-notes / partout, faites simplement Ctrl + q (ou tout ce que vous avez choisi), puis faites un CTRL+V {[11] } ou Edition > Coller dans la destination choisie.
Ma réponse est copiée (avec quelques ajouts) 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
- Je cherche FM20.DLL à la place (merci @Peter Smallwood)
- cliquer sur Parcourir et sélectionner
C:\Windows\System32\FM20.dll
(32 bit Windows) (merci @JWhy) - cliquez sur Parcourir et sélectionnez
C:\Windows\SysWOW64\FM20.dll
(sur 64 bits)
Je viens d'avoir ce problème et l'emballage de chaque cellule avec la fonction CLEAN
l'a 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 avoir fait cela, les pâtes dans le bloc-notes ou tout autre programme n'avaient plus de guillemets en double.
Collez-le D'abord dans Word, puis vous pouvez le coller dans le bloc-notes et il apparaîtra sans les guillemets
Si vous voulez sélectionner plusieurs cellules et copier leurs valeurs dans le presse-papiers sans toutes ces citations ennuyeuses, le code suivant peut être utile. Ceci est une amélioration du code donné ci-dessus 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
Ma solution lorsque j'ai rencontré le problème des guillemets é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.
Problème Possible par rapport à 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:
Courir au-dessus du code et coller le presse-papiers dans une cellule dans Excel, je reçois 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é un certain nombre fois que 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 d'en haut, 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é à partir de "user3616725" de la réponse acceptée:
Retour dans Excel, allez Outils > Macro>Macros et sélectionnez la macro appelée "CopyCellContents" et puis choisissez Options dans la boîte de dialogue. Ici, vous peut affecter la macro à une touche de raccourci (par exemple comme Ctrl+c pour la normale copie) - j'ai utilisé Ctrl + Q.
Ensuite, lorsque vous voulez copier une seule cellule sur le bloc-notes/partout, faites simplement Ctrl + q (ou tout ce que vous avez choisi), puis faites un Ctrl + v ou Editer > coller dans la destination choisie.
modifier (21 novembre dans 2015):
@ commentaire de "dotctor":
Non, ce n'est sérieusement pas une nouvelle question! À mon avis c'est une bonne ajout de la réponse acceptée car ma réponse résout les problèmes auxquels vous pouvez faire face lors de l'utilisation du 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. Changé en: "problème Possible par rapport à la réponse de"user3616725":". Comme un commentaire, j'aurais certainement écrit beaucoup plus compact.
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)
, 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 ;-)
Il est également possible de supprimer ces guillemets doubles en plaçant votre résultat sur la fonction "Clean".
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 doubles sur D'autres programmes tels que Notepad++.
"Si vous voulez sélectionner multiples cellules et copiez leurs valeurs dans le Presse-papiers sans toutes ces citations ennuyeuses" (Sans les bogues dans 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:
- évite " Variable non défini " erreur du compilateur (pour "CR" - "clibboardFieldDelimiter" ici)
- Convertit une cellule vide en une chaîne vide vs. "0".
- ajouter Tab (ASCII 9) vs CR (ASCII 13) après chaque cellule.
- Ajouter un CR (ASCII 13) + LF (ASCII 10) (vs. 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'est-à-dire Tab ou CR lors du collage dans L'édition Fenêtre de table D'accès 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