【问题标题】:MS Excel adds line break when copying a cellMS Excel 在复制单元格时添加换行符
【发布时间】:2013-02-04 21:18:43
【问题描述】:

当您复制单元格(不从单元格中选择文本)并粘贴到任何编辑器时,MS Excel 2010 或 2007 或任何版本都会添加换行符并将光标发送到下一行。将光标向上移回最后一行很烦人。

让光标回到最后一行看起来并没有太多工作,但如果你作为一名程序员必须经常这样做,我感觉真的很糟糕。如果在 excel 中有设置来阻止这种情况,有什么建议吗?

我在网上查了一下没找到,还查了excel的选项,也没找到。

【问题讨论】:

  • 这对程序员来说不是问题——如果你能帮助它,你就永远不会使用剪贴板来传输数据......
  • 超级用户有同样的问题:Copy from Excel without Line Break

标签: excel copy-paste


【解决方案1】:

我在翻译公司的 Excel 电子表格和我们的代码之间为我们的应用程序复制/粘贴了一个大的翻译文件。每次都必须删除换行符,这让我很难受。

最后,我复制了整个工作表并将其粘贴到一个新的 Google 文档电子表格中。然后我用它来满足我的复制需求,因为它不会像 Excel 那样在副本上添加换行符。

希望有帮助!

【讨论】:

  • OneDrive 中的 Excel Online 也不会添加换行符
【解决方案2】:

您可以创建自己的复制例程,它不存储整个单元格,而只存储其在剪贴板中的值:

Sub OwnCopy()
    Dim DataObj As New MSForms.DataObject
    
    DataObj.SetText ActiveCell.Value 'depending what you want, you could also use .Formula here
    DataObj.PutInClipboard
End Sub

为了能够编译宏,您需要包含“Microsoft Forms 2.0 Object Library”作为参考(在 Visual Basic 编辑器中,转到工具->参考并浏览 %windir%\system32 以获取 FM20.dll 1).

您现在可以使用默认的运行宏对话框将此宏分配给另一个快捷方式(例如 Ctrl-Shift-C) - 或甚至通过执行Application.OnKey "^c", "OwnCopy" 覆盖Ctrl-c。但是,我不建议覆盖 Ctrl-c 因为除了粘贴之外,您很可能希望使用通常与它一起复制的所有其他信息给编辑。

要使其永久化,只需将宏存储在您的个人工作簿中即可。

如果您想要一个更复杂的复制例程,也可以处理多个单元格/选择区域,请使用以下代码:

Sub OwnCopy2()
    Dim DataObj As New MSForms.DataObject
    Dim lngRow As Long
    Dim intCol As Integer
    Dim c As Range
    Dim strClip As String
    
    Const cStrNextCol As String = vbTab
    Const cStrNextRow As String = vbCrLf
    
    With Selection
        If Not TypeOf Selection Is Range Then
            On Error Resume Next
            .Copy
            Exit Sub
        End If
            
        If .Areas.Count = 1 Then
            For lngRow = 1 To .Rows.Count
                For intCol = 1 To .Columns.Count
                    strClip = strClip & _
                        Selection(lngRow, intCol).Value & cStrNextCol
                Next intCol
                strClip = Left(strClip, Len(strClip) - Len(cStrNextCol)) _
                    & cStrNextRow
            Next lngRow
        Else
            For Each c In .Cells
                strClip = strClip & c.Value & vbCrLf
            Next c
        End If
        strClip = Left(strClip, Len(strClip) - Len(cStrNextRow))
        DataObj.SetText strClip
        DataObj.PutInClipboard
    End With
End Sub

1 实际上这个文件存在于%ProgramFiles%\Microsoft Office\root\vfs\System - Office 做了一些虚拟化技巧让它出现在它所在的位置。

【讨论】:

  • 谢谢.. 我尝试创建一个宏,但是当我尝试运行它时,它显示“编译器错误用户定义的类型未定义。”
  • 您需要包含对“Microsoft Forms 2.0 对象库”的引用 - 我更新了答案!
  • 彼得,它确实奏效了。但是如果我要复制多个单元格,我会选择所有单元格,然后执行快捷方式,它只会复制一堆中的第一个单元格。
  • 我在参考列表中找不到“Microsoft Forms 2.0 对象库”。如果您插入用户窗体,则会为您添加参考。
  • 我在引用列表中也找不到“Microsoft Forms 2.0 对象库”。所以我用谷歌搜索,发现 system32 文件夹中“FM20.dll”的“浏览...”起到了作用。
【解决方案3】:

我同意这很烦人,但不确定有什么可做的。

Excel 会自动格式化单元格...制表符分隔的列、行分隔的行(单个单元格是一行 1 列)。

验证: 在 .NET 中,Clipboard.GetText() 显示格式已在剪贴板中

这里有一些 IronPython 来说明:

# Copy some cells in Excel, then run the following
import sys, clr
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import Clipboard
Clipboard.GetText()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多