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?
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
C:\Windows\System32\FM20.dll
(Windows 32 bits) (merci @JWhy)C:\Windows\SysWOW64\FM20.dll
(64 bits)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.
Tout d'abord, collez-le dans Word, vous pouvez ensuite le coller dans le bloc-notes et il apparaîtra sans les guillemets
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
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.
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.
"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:
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
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 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 ++.
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
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)