如何在VBA中的两个打开的Excel实例之间进行复制?

Pra*_*ike 5 excel vba excel-vba

我想将已打开的Excel实例中的数据复制到VBA中的另一个Excel实例.我试过了:

Option Explicit
Sub copy_paste()

    Dim destination_sanitized As String
    Dim fs As New FileSystemObject

    destination_sanitized = fs.BuildPath("c:\temp\", "1.xlsx")

    Dim xl As New Excel.Application

    Dim wb As Workbook
    Set wb = xl.Workbooks.Open(Filename:=destination_sanitized)

    Dim r1 As Range
    Dim r2 As Range
    Set r1 = ThisWorkbook.Sheets("hidden").Range("E10:E13")
    Set r2 = wb.Sheets("Sheet1").Range("J20:J23")

    On Error GoTo Cleanup
    r1.Copy r2

Cleanup:
    wb.Close SaveChanges:=False
    Set xl = Nothing
    MsgBox Err.Number & ": " & Err.description


End Sub
Run Code Online (Sandbox Code Playgroud)

我得到运行时错误'1004':Range类的复制方法失败

如何将已打开的Excel实例中的数据复制到VBA中的另一个Excel实例?

当他们是同一个实例的一部分时,我理解如何做到这一点.在这种特殊情况下,我需要将两个工作簿放在不同的实例中.我还需要做一个完整的副本(数据验证,公式,值,格式等),所以r2.Value = r1.Value是不够的.

Sam*_*Sam 1

我认为您需要详细说明为什么需要单独的实例,到目前为止,在我的职业生涯中,我从未有任何理由在 Excel 中使用单独的实例,这对于自动化来说是一场噩梦。

话虽这么说,您可以尝试这样的操作(假设您只打开了 2 个实例):

Sub MM()

    Dim varTask As Variant
    Dim XL1 As Application, XL2 As Application
    Dim r1 As Range, r2 As Range
    Dim OtherWB As Workbook
    Dim destination_sanitized As String

    destination_sanitized = CreateObject("Scripting.FileSystemObject").BuildPath("C:\temp\", "1.xlsx")

    With CreateObject("Word.Application")
       If .Tasks.Exists("Microsoft Excel") Then
           For Each varTask In .Tasks
           Debug.Print varTask
                 If InStr(varTask.Name, "Microsoft Excel") = 1 Then
                      If XL1 Is Nothing Then
                        Set XL1 = GetObject(Replace(varTask, "Microsoft Excel - ", "")).Application
                      Else
                        Set XL2 = GetObject(Replace(varTask, "Microsoft Excel - ", "")).Application
                      End If
                 End If
           Next varTask
       End If
       .Quit
    End With

    'Then something like...

    Set r1 = ThisWorkbook.Sheets("hidden").Range("E10:E13")
    Set OtherWB = XL2.Workbooks.Open(destination_sanitized)
    Set r2 = OtherWB.Sheets("Sheet1").Range("J20:J23")
    r1.Copy r2

    'Clear down memory afterwards
    Set r1 = Nothing
    Set r2 = Nothing
    OtherWB.Close False
    Set OtherWB = Nothing
    Set XL1 = Nothing
    XL2.Quit
    Set XL2 = Nothing

End Sub
Run Code Online (Sandbox Code Playgroud)