从Excel复制到Word文档时问题剪贴板

时间:2018-10-31 14:45:00

标签: excel vba ms-word clipboard

我是VBA的新手,但我过去做了一些事情。

我正在尝试将excel单元格(单元格A1至A66)中的文本复制到Word文档中。此操作的目的是允许用户复制它并将其作为TEXT粘贴到其他位置。如果用户直接从excel复制它,它将粘贴为表格。

这是我的代码:

Private Sub Bouton1_Click()

    Dim objWord As New Word.Application
    With objWord
        .Documents.Add
        Application.Wait (Now + TimeValue("0:00:01") / 2)
        Worksheets("Description2").Cells(1, 1).Copy
        Application.Wait (Now + TimeValue("0:00:01") / 2)
        .Selection.PasteSpecial xlPasteValues
        .Visible = True
    End With

    Dim i As Integer
    For i = 2 To 66
    If Worksheets("Description2").Cells(i, 1) = Worksheets("Description2").Cells(i + 1, 1) Then Exit For
        With objWord
            Application.Wait (Now + TimeValue("0:00:01") / 2)
            Worksheets("Description2").Cells(i, 1).Copy
            Application.Wait (Now + TimeValue("0:00:01") / 2)
            .Selection.PasteSpecial xlPasteValues
            .Visible = True
        End With
    Next i

    objWord.Application.Activate
    objWord.Application.WindowState = wdWindowStateMaximize

End Sub

此代码大约有70%的时间有效。当它不起作用时,我会收到此错误(或一个变化,但始终与剪贴板有关):

  

运行时错误“ 4605”:此方法或属性不可用   因为剪贴板为空或无效。

此外,有时会打开一个随机的OneDrive窗口。

我已经添加了application.wait行以尝试减慢复制/粘贴的速度,但是并没有做太多。

您有什么秘诀可以使我的代码更可靠?

非常感谢, 路易斯

1 个答案:

答案 0 :(得分:0)

如果要粘贴为文本,也许:

Sub CopyAsTextToWord()
    Dim wordApp As New Word.Application

    With wordApp
        .Visible = True
        .Documents.Add

        Worksheets("Description2").Range("A1:A66").Copy
        .Selection.PasteSpecial DataType:=wdPasteText
    End With
End Sub

另一方面,如果您想一次一次粘贴每个单元格(不确定原始代码中的样子),也许是略有不同的方法,避免使用剪贴板。将范围读入数组,进行遍历,然后使用Selection.TypeText依次“粘贴”每个元素。可能可以变得更强大。

Sub TransferAsText()
    Dim wordApp As New Word.Application

    With wordApp
        .Visible = True
        .Documents.Add

        Dim arr()
        arr = Worksheets("Description2").Range("A1:A66").Value

        Dim i As Long
        For i = LBound(arr, 1) To UBound(arr, 1)
            .Selection.TypeText Text:=CStr(arr(i, 1))
        Next i
    End With
End Sub