题 复制单元格时,MS Excel会添加换行符


复制单元格时MS Excel 2010或2007或任何版本(不从单元格中选择文本)并粘贴到任何编辑器会添加换行符并将光标发送到下一行。令人讨厌的是将光标向上移动到最后一行。

将光标恢复到最后一行似乎没什么用,但如果你作为一个程序员不得不继续这么做,我觉得非常糟糕。如果excel中有设置停止此操作,是否有任何建议?

我试过看在线没找到任何东西,也查找了excel的选项,没有找到任何东西。


18
2018-02-04 21:18


起源


对于程序员来说这不是一个真正的问题 - 如果你可以帮助它,你永远不会使用剪贴板传输数据...... - Tim Williams
SuperUser上的同样问题: 从没有换行符的Excel复制 - Edward Brey


答案:


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

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编辑器中,转到Tools-> References)。

您现在可以将此宏指定给另一个快捷方式(例如 按Ctrl - 转移 - C)使用默认运行宏对话框 - 甚至覆盖 按Ctrl - C 通过执行 Application.OnKey "^c", "OwnCopy"。但是,我不建议覆盖 按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

12
2018-02-04 21:35



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


我在翻译公司的Excel电子表格和我们的代码之间复制/粘贴了大量的翻译文件。不得不每次都删除换行符让我不得不上楼。

最后,我复制了整张表并将其粘贴到新的Google文档电子表格中。然后我用它来满足我的复制需求,因为它不会在Excel上复制新行。

希望有所帮助!


12
2018-04-17 08:41



OneDrive的Excel Online也不添加换行符 - jirkamat


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

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

1
2018-02-04 21:37