2011-10-23 9 views
5

Voglio copiare i dati da un'istanza di Excel già aperta a un'altra istanza di Excel in VBA. Ho provato:Come posso copiare tra due istanze di Excel aperte in VBA?

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 

ottengo Errore di run-time '1004': Metodo Copy di classe Range non è riuscito

Come posso copiare i dati da quello già aperto istanza di Excel a un'altra istanza di Excel in VBA?

Capisco come fare questo quando fanno parte della stessa istanza. In questo caso particolare, ho bisogno che le due cartelle di lavoro siano in istanze separate. Devo anche fare una copia completa (Data Validation, Formule, Valori, Formati, ecc.), Quindi r2.Value = r1.Value non è sufficiente.

+1

di "Tuttavia sto usando almeno 10 eccelste contemporaneamente" intendi che hai 10 cartelle di lavoro aperte in un'istanza di Excel o dieci istanze separate aperte? – brettdj

+0

Quando il problema è risolto, accetta alcune risposte di quanto vorremmo provare a suggerire alcuni codici – niko

+1

Nessuna delle risposte proposte risolve effettivamente il problema. La domanda riguarda la copia e incolla tra le istanze dell'applicazione. Le risposte proposte sono per la copia tra diverse cartelle di lavoro aperte nella stessa istanza dell'applicazione. –

risposta

1

Penso che sia necessario elaborare il motivo per cui è necessario istanze separate, finora nella mia carriera non ho mai avuto motivo di utilizzare un'istanza separata in Excel ed è un incubo per l'automazione.

Detto questo, si può dare qualcosa di simile a questo una prova (ammesso che abbiate solo 2 istanze aperte):

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 
1

E 'difficile da ottenere due istanze di Excel per parlare tra loro in tutte le situazioni . Puoi trovare le altre istanze in esecuzione, ma ci sono troppe cose da considerare.

In casi simili mi fare cose semplici e fare due pulsanti:

  • Export che salva a clipboard.csv o clipboard.xlsx o qualsiasi altra cosa formato Volete i dati da copiare
  • Import che ottiene i dati dal file temporaneo degli appunti

L'utente ha il compito di fare clic sul pulsante Esporta su un gruppo nce, quindi sul pulsante Importa nella seconda istanza.