2
根據this article,無法將工作表從Excel的一個實例移動或複製到另一個實例。不幸的是,這是我必須使我的程序正常工作的唯一方法。將整個工作表從一個Excel實例複製到另一個
我有兩個Excel實例:一個由我們古老的ERP系統運行,另一個通過OLE調用運行。運行在第二個宏中的宏應將第一個工作表從打開的工作簿(ThisWorkbook
)複製到第一個實例中打開的工作簿(Wb
)中。我使用ForEachLoop's solution獲得Wb
:
Public Function GetExcelObjectFromHwnd(ByVal hWnd As Long) As Boolean
...
If AccessibleObjectFromWindow(hWnd, OBJID_NATIVEOM, iid, obj) = 0 Then 'S_OK
Dim objApp As Excel.Application
Set objApp = obj.Application
Dim Wb As Workbook
For Each Wb In objApp.Workbooks
ProcessWorkbook Wb
Next Wb
fOk = True
End If
...
End Function
Sub ProcessWorkbook(Wb as Worksheet)
...
'This produces error because ThisWorkBook and Wb are opened in different instances of Excel:
ThisWorkbook.Sheets(1).Copy , Wb.Sheets(1)
'What I developed so far
Wb.Sheets.Add , Wb.Sheets(1)
'this doesn't work too:
ThisWorkbook.Sheets(1).UsedRange.Copy Wb.Sheets(2).Range("A1")
'and this works but doesn't copy formatting:
With ThisWorkbook.Sheets(1).UsedRange
Wb.Sheets(2).Range("A1").Resize(.Rows.Count, .Columns.Count) = .Value
End With
' later I perform some operations with cells
...
End Sub
正如您可以猜到,我第一次嘗試使用Worksheet.Copy
方法則Range.Copy
方法,他們都不起作用。直接範圍分配只複製值,我還需要格式化才能複製。
所以,顯然,將複製格式的解決方案是適當的,但我更喜歡直接複製,如果有任何方法可以做到這一點。另外,請不要使用剪貼板,因爲它總是不好的主意。
謝謝你的出色主意!其實,我用'如果Wb.Application.hWnd <> Application.hWnd Then:Dim Fn As String:Fn = Wb.FullName:Wb.Close False:Set Wb = Workbooks.Open(Fn):End If'。這些文件在宏執行時未被更改。 – Danatela
+1爲簡單起見。 – brettdj