Hücreden kopyalarken tırnak işaretlerini atlayın


95

Sorun :
Programın dışında Excel'den bir hücre kopyalarken, otomatik olarak çift tırnaklar ekleniyor.

Ayrıntılar :
Windows 7 makinesinde Excel 2007 kullanıyorum. Aşağıdaki formüle sahip bir hücrem varsa:

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

Hücredeki çıktı (sayı olarak biçimlendirilmiş) Excel'de şöyle görünür:

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

İyi ve güzel. Ancak hücreyi not defteri gibi başka bir programa kopyalarsam, başında ve sonunda can sıkıcı çift tırnak işaretleri alıyorum. "CHAR (9)" tarafından oluşturulan sekmelerin saklandığına dikkat edin, bu iyi.

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

Başka bir programa kopyaladığımda bu çift tırnak işaretlerinin görünmesini nasıl engelleyebilirim ? Başka bir deyişle, hücre panoya kopyalandığında bunların otomatik olarak eklenmesini engelleyebilir miyim?


Formatı sayı dışında bir şeyle değiştirmeyi denediniz mi? Sanırım bununla ilgili yollar gördüm, ancak şu anda Excel'i açamıyorum, hala bir yanıt yoksa birkaç dakika içinde geri geleceğim.
AdamMc331

@ McAdam331 kurulumumda, format metin gibi bir şeyse, hücre hesaplanan sonucu değil formülü gösterir. Sayı olarak biçimlendirme, bazı nedenlerden dolayı bunu geçersiz kılıyor gibi görünüyor.
Aaron Thomas

Neden formülü kullanmayı seçtiniz? Excel sekme karakterleri eklemenin kolay bir yolunu desteklemediği için mi? Ben de bu sorunu çözemiyorum, kullanabileceğiniz Excel dışında seçenekler olabilir ama projenin doğasının ne olduğundan emin değilim.
AdamMc331

Ayrıca, bir güçlük olabilir, ancak Excel'i açıp bir hücreye yazmaya başlarsanız (varsayılan olarak Genel olarak biçimlendirilmiştir) ve metin girerseniz, tırnak işaretleri olmadan kopyalanır. (Excel 2013 ve Notepad ++ kullanılarak test edilmiştir) Projenizde sekme yerine 4 boşluk girmeniz etkilenecek mi? Yine sorunun geri kalanını bilmeden söylemek zor.
AdamMc331

1
@ McAdam331 maalesef bunun tam olarak buraya koyduğum gibi çalışmasına ihtiyacım var, eksi önde gelen ve sondaki çift tırnak. Lütfen sekmelerin bu sorunun odak noktasından uzaklaşmasına izin vermeyin - orada olmalılar.
Aaron Thomas

Yanıtlar:


33

Word-Pad, Notepad ++ veya Word'e yapıştırmayı denerseniz, bu sorunu yaşamazsınız. Hücre değerini saf metin olarak kopyalamak için, tanımladığınız şeyi elde etmek için bir makro kullanmanız gerekir:

Bunun uygulanmasını istediğiniz çalışma kitabına (veya birkaç çalışma kitabında kullanmak istiyorsanız Personal.xls dosyanıza), aşağıdaki kodu standart bir modüle yerleştirin:

Kod:

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

Projenize (çalışma kitabı) standart bir modül eklemek için, VBE'yi Alt+ ile açın F11ve ardından sol üst Proje Penceresinde çalışma kitabınıza sağ tıklayın ve Ekle> Modül'ü seçin. Kodu, sağda açılacak olan kod modülü penceresine yapıştırın.

Excel'e geri dönün, Araçlar> Makro> Makrolar'a gidin ve "İçeriği Kopyala" adlı makroyu seçin ve ardından iletişim kutusundan Seçenekler'i seçin. Burada makroyu bir kısayol tuşuna atayabilirsiniz (örneğin , normal kopya için CTRL+ gibi C) - CTRL+ kullandım Q.

Ardından, tek bir hücreyi Not Defteri'ne / herhangi bir yere kopyalamak istediğinizde, Ctrl + q (veya ne seçerseniz seçin) yapın ve ardından seçtiğiniz hedefte bir CTRL+ Vveya Düzenle> Yapıştır yapın.

Cevabım (birkaç eklemeyle) şuradan kopyalandı: buradan

DÜZENLEME : (yorumlardan)

Referans listesinde Microsoft Forms 2.0 Kitaplığı bulamazsanız, deneyebilirsiniz.

  • yerine FM20.DLL arıyorum (teşekkürler @Peter Smallwood)
  • Gözat'ı tıklayıp C:\Windows\System32\FM20.dll(32 bit Windows) (teşekkürler @JWhy)
  • Gözat'ı tıklayın ve seçin C:\Windows\SysWOW64\FM20.dll (64 bit'te)

1
Görünüşe göre VBA bunun için tek çözüm - girdiler için teşekkürler.
Aaron Thomas

1
Microsoft Forms kütüphanesini referanslar listesinde göremiyorsanız, FM20.DLL
Peter Smallwood

15
Notepad ++ 'a yapıştırırsam yine de teklifleri alıyorum.
Kat

1
@monkeyintern Sanırım bir hücrede birden fazla metin satırı vardı ve bunları hücre başına bir satıra bölmek, etrafından dolaşmama izin veriyor.
Kat

2
@ user3616725 Güncellenen sürümler bu davranışı değiştirmiş olabilir, ancak mevcut Word ve Notepad ++ sürümleri (bu yorumun yayınlanma tarihi itibariyle) tek veya birden çok hücre seçiminde bu tırnak işaretlerini yapıştırır.
Tony

84

Sadece bu problemi yaşadım ve her bir hücreyi CLEANbenim için düzeltti. Bunu yapmak =CLEAN(, hücrenizi seçmek ve ardından sütunun geri kalanını otomatik olarak doldurmak nispeten kolay olmalıdır . Bunu yaptıktan sonra, Not Defteri'ne veya başka herhangi bir programa artık çift tırnak işareti kalmadı.


22
Fazladan alıntıları silmek için iyi bir cevap, ancak maalesef bu soruda saklamak istediğim sekme karakterlerini de siliyor. Yine de girdi için teşekkürler!
Aaron Thomas

Bu benim için çalıştı, sekmeleri umursamadım - aslında hepsini ve yeni satır karakterlerinin yine de kaldırılmasını istedim.
Cody

19
32'nin altındaki tüm ASCII karakterlerini kaldırır. Yani yeni satırlar da.
NeplatnyUdaj

1
Bu gerçek cevap.
Tyler Murry

11
Tüm özel karakterleri kaldırdığı için bu iyi bir çözüm değildir.
Paul

26

Önce Word'e yapıştırın, ardından not defterine yapıştırabilirsiniz ve tırnak işaretleri olmadan görünecektir.


Giriş için teşekkürler, ancak bunu iyi bir çözüm olarak işaretleyemiyorum. Ayrıca, bu soruya zaten sunulan bir çözümün kopyasıdır, bkz. Stackoverflow.com/a/24913557/2658159 .
Aaron Thomas

4
Teşekkürler, bu çözümü beğendim. Hızlı ve kolay
Bajal

Buna oy verirken ... benim durumumda, sorunum, aldığım belirli bir talep türü için verilerin bir Excel dosyasında gelmesi ve bunu bir düz metin kutusuna yapıştırmam gerektiğiydi. Bunu yaptığımda, teklifleri alırım. Fazladan alıntıları kaldırmak için bir metin editörü kullanmıştım (alıntılar da alıntı yaptı .. can sıkıcı!). Basit bir çözüm ararken, ekstra alıntılar gittikçe önce Word'e yapıştırmanın işe yaradığını gördüm. Keşke bu 10 kat daha fazla oy verebilseydim :)
Carnix

Bu, sekme karakterlerini kaldıracaktır. En azından kelimeyi kullanırken, wordpad'den emin değilim
Matthew Lueder

Bugün için bile en iyi çözüm budur.
zygimantus

6

Birden fazla hücre seçmek ve değerlerini tüm bu sinir bozucu alıntılar olmadan panoya kopyalamak istiyorsanız , aşağıdaki kod yararlı olabilir. Bu, user3616725'ten yukarıda verilen kodun bir geliştirmesidir.

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

Bence bu şimdiye kadarki en iyi cevap.
posfan12

2
Aşağıdaki hataları gideren bu Yanıta göre Cevabımı görün: 1. Boş Hücreyi "0" yerine boş bir Dizeye dönüştürün. 2. Her Hücreden sonra Sekme (ASCII 9) - CR (ASCII 13) ekleyin. 3. Her Satırdan sonra CR (ASCII 13) + LF (ASCII 10) (CR (ASCII 13) 'e karşılık) ekleyin. NOT: Bir Hücre içine gömülü karakterleri, Hücreyi Yapıştırdığınız hedef alanın çıkışına neden olacak şekilde kopyalayamazsınız (yani, Erişim Tablosunu Düzenleme Penceresine veya SSMS'ye Yapıştırırken Sekme veya CR).
Tom

^ Ayrıca "Değişken tanımlanmadı" Derleyici Hatasını ("CR" Değişkeni için) düzeltir.
Tom

4

Teklif sorununa geldiğimde çözümüm, hücrelerimin metninin sonundan taşıma iadelerini çıkarmaktı. Bu satır başları nedeniyle (harici bir program tarafından eklenen), Excel dizenin tamamına tırnak ekliyordu.


4
Alıntılar ayrıca formül içindeki CR / LF'nin bir sonucu olabilir (mutlaka sonunda olması gerekmez) veya bu konudaki orijinal sorudaki gibi bir sekme (char (9)) olabilir.
Turbo

hayatımı gerçekten kolaylaştırdın
dE Source

3

"User3616725" den gelen yanıtla ilgili olası sorun:
Windows 8.1 üzerindeyim ve "user3616725" tarafından kabul edilen yanıttan bağlantılı VBA kodunda bir sorun var gibi görünüyor:

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

Ayrıntılar:
Kodun üstünde çalıştırma ve panoyu Excel'de bir hücreye yapıştırma, içinde soru işareti olan karelerden oluşan iki sembol alıyorum, örneğin: ⍰⍰. Not Defteri'ne yapıştırmak hiçbir şey göstermiyor bile.

Çözüm:
Bir süre aradıktan sonra , "Nepumuk" kullanıcısından Windows API kullanan başka bir VBA komut dosyası buldum . İşte sonunda benim için çalışan kodu:

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

Yukarıdan ilk VBA kodu gibi aynı şekilde kullanmak için, Alt "Beispiel ()" 'i şuradan değiştirin:

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

Kime:

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

Ve kabul edilen yanıttan "user3616725" den önerildiği gibi Excel makro menüsü aracılığıyla çalıştırın:

Excel'e geri dönün, Araçlar> Makro> Makrolar'a gidin ve "İçeriği Kopyala" adlı makroyu seçin ve ardından iletişim kutusundan Seçenekler'i seçin. Burada makroyu bir kısayol tuşuna atayabilirsiniz (örneğin, normal kopyalama için Ctrl + c gibi) - Ctrl + q kullandım.

Ardından, tek bir hücreyi Not Defteri'ne / herhangi bir yere kopyalamak istediğinizde, Ctrl + q (veya ne seçerseniz seçin) yapın ve ardından Ctrl + v veya Düzenle> Yapıştır yapın.


Düzenleme (21 Kasım 2015):
@ "dotctor" dan yorum:
Hayır, bu cidden yeni bir soru değil! Benim düşünceme göre, cevabım, kabul edilen cevaptaki kodu kullanırken karşılaşabileceğiniz sorunları ele aldığından, kabul edilen cevap için iyi bir katkıdır. Daha fazla itibarım olsaydı, bir yorum yaratırdım.
"Teepeemm" den @ comment:
Evet, haklısın, "Sorun:" başlığıyla başlayan yanıtlar yanıltıcı. Şu şekilde değiştirildi: "" user3616725 "den gelen yanıtla ilgili olası sorun:". Bir yorum olarak kesinlikle çok daha kompakt yazardım.


Bunun geçerli bir cevap olduğunu düşünüyorum ( Problem ile açmak yeni bir probleminiz varmış gibi görünmesine rağmen ). Ve yorumlar 600 karakterle sınırlıdır, bu yüzden bu kesinlikle bunun için çok uzun olacaktır.
Teepeemm

Olağanüstü! Teşekkürler! Tek sorun, yalnızca tek bir hücre için işe yaraması gibi görünüyor. Kopyalama aralıklarına izin vermek için bir şekilde iyileştirilebilir mi?
NeplatnyUdaj

3

"Birden fazla Hücre Seçmek ve değerlerini tüm bu sinir bozucu alıntılar olmadan Pano'ya kopyalamak istiyorsanız " ( Peter Smallwood'un çoklu Hücreli çözümündeki hatalar olmadan ) "aşağıdaki kod yararlı olabilir." Bu, yukarıda Peter Smallwood'dan verilen kodun bir geliştirmesidir ("yukarıda user3616725'ten verilen kodun bir geliştirmesidir"). Bu, Peter Smallwood'un çözümündeki aşağıdaki hataları düzeltir:

  • "Değişken tanımlanmamış" Derleyici Hatasını Önler ("CR" için - "clibboardFieldDelimiter" burada)
  • Boş Hücreyi "0" yerine boş bir Dizeye dönüştürün.
  • Her Hücreden sonra Ek Sekme (ASCII 9) - CR (ASCII 13).
  • Her Satırdan sonra bir CR (ASCII 13) + LF (ASCII 10) (CR (ASCII 13) ile karşılaştırıldığında) ekleyin.

NOT: Bir Hücre içine gömülü karakterleri, Hücreyi Yapıştırdığınız hedef alanın çıkışına neden olacak şekilde kopyalayamazsınız (yani, Erişim Tablosunu Düzenleme Penceresine veya SSMS'ye Yapıştırırken Sekme veya CR).


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

Not defterine yapıştırırken satır sonlarını korumak için makrodaki bu satırı değiştirin:

strTemp = ActiveCell.Value

tarafından:

strTemp = Replace(ActiveCell.Value, Chr(10), vbCrLf)

0

Lütfen aşağıdaki formülü kullanın

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

ve istediğini alacaksın ;-)


2
Bu hile yapar, ancak biçimlendirmemi kaldırır (Yeni satırlar ve sekmeler)
Gabriel G

0

Bunu, sonuçları bir dosyaya göndererek VBA aracılığıyla bir Excel makrosunda yapabilirsiniz:

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

Ve dosya adlarını ve içeriği birden çok dosyaya almak istiyorsanız, burada çıktının etrafındaki çift tırnak işaretlerinden kaçınan kısa bir pasaj.

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
  • Eğer formül çok satırlıysa (formülde satır sonu olması anlamına gelir), kopyala yapıştır bu şekilde çalışacaktır
  • Çoklu satırı kaldırabilirseniz, kopyalayıp yapıştırırken hiçbir tırnak görünmeyecektir.
  • başka bir önceki yanıtta @greg tarafından söylendiği gibi TEMİZ işlevini kullanın

0

Not: Alıntıların nedeni, veriler excel'den panoya taşındığında, sekmeler, yeni satırlar vb. İçeren tırnak değerlerini içeren CSV standartlarına tam olarak uymasıdır (ve çift tırnak karakterleri iki çift tırnak karakteriyle değiştirilir)

Dolayısıyla, özellikle OP'nin formülden kaynaklandığı durumlarda olduğu gibi başka bir yaklaşım, sekmeler ve sabit dönüşler için alternatif karakterler kullanmaktır. Sekmeler için ascii Unit Separator = char (31) ve yeni satırlar için ascii Record Separator = char (30) kullanıyorum.

Daha sonra metin düzenleyiciye yapıştırmak ekstra CSV kurallarını içermez ve hızlı bir arama yapabilir ve bunları tekrar dönüştürmek için değiştirebilirsiniz.

Verilere sekmeler / yeni satırlar katıştırılmışsa, bunları dönüştürmek için excel'de arama yapabilir ve değiştirebilirsiniz.

İster formül kullanın ister verileri değiştirin, sınırlayıcıları seçmenin anahtarı asla gerçek verilerde bulunabilecek karakterleri kullanmaktır. Bu yüzden düşük seviyeli ascii karakterlerini tavsiye ediyorum.


-1

Sonuçlarınızı "Temizle" işlevine yerleştirerek bu çift tırnak işaretlerini kaldırmanız da mümkündür.

Misal:

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

Çıktı, Notepad ++ gibi diğer programlarda çift tırnak işaretleri olmadan yapıştırılacaktır.


Bu yinelenen bir cevaptır. CLEAN ayrıca yeni satırları, sekmeleri vb.
Çıkarır
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.