2014-06-06 6 views
2

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.

Répondre

2

Je vous suggère SaveAs votre classeur de l'instance Excel A à un fichier temporaire, puis ouvrez ce fichier temporaire dans l'instance Excel B afin de copier la feuille dont vous avez besoin.

+0

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

+0

+1 pour plus de simplicité. – brettdj

Questions connexes