Selon this article, vous ne pouvez pas déplacer ou copier une feuille de calcul d'une instance d'Excel vers une autre. Malheureusement, c'est la seule façon pour que mon programme fonctionne correctement.Copier une feuille de calcul entière d'une instance d'Excel vers une autre
J'ai deux instances d'Excel: l'une est gérée par notre ancien système ERP et l'autre par un appel OLE. Les macros qui s'exécutent dans la seconde doivent copier la première feuille de calcul du classeur ouvert (ThisWorkbook
) dans le classeur ouvert en première instance (Wb
). J'utilise ForEachLoop's solution pour obtenir 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
Comme vous pouvez le deviner, j'ai d'abord essayé d'utiliser la méthode Worksheet.Copy
puis méthode Range.Copy
et ils ont tous deux ne fonctionnent pas. Et l'attribution de plage directe ne copie que les valeurs et j'ai également besoin d'un formatage pour être copié. Donc, apparemment, une solution qui va copier le formatage est appropriée, mais je préférerais la copie directe s'il y a un moyen de le faire. Aussi, s'il vous plaît ne suggère pas d'utiliser le presse-papiers, car c'est toujours une mauvaise idée.
Merci pour cette brillante idée! En fait, j'ai utilisé 'Si Wb.Application.hWnd <> Application.hWnd Ensuite: Dim Fn As String: Fn = Wb.FullName: Wb.Ferme False: Définir Wb = Workbooks.Open (Fn): Fin If». Ces fichiers n'ont pas été modifiés au moment où la macro s'exécute. – Danatela
+1 pour plus de simplicité. – brettdj