2013-06-25 18 views
8

Wiem, że już wcześniej widziałem odniesienia do tego problemu, ale wypróbowałem kilka sugestii i nadal otrzymuję błąd. Mam skoroszyt, który zbiera dane z innej książki i generuje raport. Następnie chcę utworzyć nowy skoroszyt, skopiować informacje z raportu do nowej książki, zapisać nową książkę i zamknąć ją, a następnie przejść do następnego raportu. Powinno to zrobić około 10 razy. W ramach mojego kodu, gdzie jestem kopiowanie i wklejanie arkuszy, ja otrzymuję błądBłąd automatyzacji programu Excel VBA: Wywołany obiekt odłączył się od klientów

Error -2147417848 Automation error The object invoked has disconnected from its clients

Sprawdziłem inne komentarze na temat tego błędu i próbował sugerowanych rozwiązań bez żadnych rezultatów. Interesującą rzeczą jest to, że czasami będzie to zrobić to przez 5 cykli kodu przed załamaniem, czasami tylko 2. Jedyna konsekwencja jest to, że zawsze łamie w tym samym miejscu

fromBook.Sheets("Report").Copy Before:=newBook.Sheets("Sheet1")

mam Option Explicit na górze moduł, i sprawdziłem, aby upewnić się, że nie ma żadnych globali w subie, do którego się włamuje. To powiedziawszy, jest to całkowicie możliwe, że coś przeoczyłem. Umieściłem również "zegar" w jednym punkcie, aby upewnić się, że arkusze programu Excel nie przechodzą jedna nad drugą.

Naprawdę mógłbym skorzystać z pomocy!

Oto kod mojego okrętu podwodnego:

Sub CreateAndSave(ByRef Reg As Integer, ByVal j As Integer) 

     Dim fromBook As Workbook 
     Dim fromSheet As Worksheet 
     Dim newBook As Workbook 
     Dim fileExists As Boolean 
     Dim i As Integer 
     Dim Holder As Integer 


     Application.ScreenUpdating = False 
     Application.DisplayAlerts = False 

      Set fromBook = Application.Workbooks("Region_Audit_Report") 
      Set newBook = Workbooks.Add 

      With newBook 
      .SaveAs Filename:="G:\DataTeam\ExcelDev\Audit Report\Region Workbooks\Region" & Reg & " " & Month(Date) & "-" & Day(Date) & "-" & Year(Date) & ".xlsx" _ 
      , FileFormat:=xlOpenXMLWorkbook 
      End With 

     Set newBook = Application.Workbooks("Region" & Reg & " " & Month(Date) & "-" & Day(Date) & "-" & Year(Date) & ".xlsx") 

     fromBook.Sheets("Report").Copy Before:=newBook.Sheets("Sheet1") 
     fromBook.Sheets("MonthData").Copy After:=newBook.Sheets("Report") 

     newBook.Sheets("MonthData").Range("A1") = "Month" 
     newBook.Sheets("MonthData").Range("B1") = "Store#" 
     newBook.Sheets("MonthData").Range("C1") = "District" 
     newBook.Sheets("MonthData").Range("D1") = "Region" 
     newBook.Sheets("MonthData").Range("E1") = "Due Date" 
     newBook.Sheets("MonthData").Range("F1") = "Comp Date" 
     newBook.Sheets("MonthData").Range("G1") = "# of Errors" 
     newBook.Sheets("MonthData").Range("H1") = "Late?" 
     newBook.Sheets("MonthData").Range("I1") = "Complete?" 

     newBook.Sheets("MonthData").Range("A1:I1").Interior.ColorIndex = 43 


      newBook.Save 

      newBook.Close 


      Application.DisplayAlerts = True 

    End Sub 
+0

Spróbuj wyłączyć obliczenia u góry makra. Application.Calculation = xlCalculationManual (następnie włącz go ponownie na końcu) ((Miałem podobny problem i to naprawiło)) – Sam

+0

Próbowałem. Nadal pękła w tym samym miejscu. – William

Odpowiedz

6

Miałem ten problem w wielu projektach konwertujących Excel 2000 do 2010. Oto, co znalazłem, który wydaje się działać. Zrobiłem dwie zmiany, ale nie wiem, co spowodowało sukces:

1) Zmieniłem jak ja zamknięty i zapisany plik (z blisko & zaoszczędzić = true zapisać jako tej samej nazwie pliku i zamknij plik:

... 
    Dim oFile   As Object  ' File being processed 
... 
[Where the error happens - where aArray(i) is just the name of an Excel.xlsb file] 
    Set oFile = GetObject(aArray(i)) 
... 
'oFile.Close SaveChanges:=True - OLD CODE WHICH ERROR'D 
'New Code 
oFile.SaveAs Filename:=oFile.Name 
oFile.Close SaveChanges:=False 

2) wróciłem i spojrzał na wszystkich .Range w kodzie i upewnił się, że był pełen konstrukt ..

Application.Workbooks("workbook name").Worksheets("worksheet name").Range("G19").Value 

lub (nie 100% pewien, czy to jest poprawna składnia, ale to jest "wysiłek", który zrobiłem)

ActiveSheet.Range("A1").Select 
+0

Polecenie SaveAs wydaje się działać dla mnie. Dzięki –

+0

gdzie umieściłeś te linie? – H20rider

0

kilka rzeczy do wypróbowania ...

  1. Komentarz z drugiej "Set NewBook" linii kodu ...

  2. Masz już odwołanie do obiektu do skoroszytu.

  3. Wykonaj SaveAs po skopiowaniu arkuszy.

+0

Podjęłam próbę z sugerowanymi zmianami, i w drugiej rundzie kod został zerwany w tej samej lokalizacji, ten sam błąd. – William

+0

Potencjalnym problemem jest to, że wygląda na to, że przeszedł przez ten kod, więc Book2 został otwarty, zanim Book1 został zapisany i zamknięty. – William

1

Miałem ten sam problem w dużym arkuszu kalkulacyjnym Excel 2000 z setkami linii kodu. Moim rozwiązaniem było uczynienie arkusza aktywnego aktywnym na początku klasy. TO ZNACZY. ThisWorkbook.Worksheets ("WorkSheetName") Aktywuj Zostało to ostatecznie odkryte, gdy zauważyłem, że jeśli "WorkSheetName" był aktywny podczas uruchamiania operacji (kod) błąd nie wystąpił. Doprowadziło mnie to do szału przez jakiś czas.

+0

Dziwne, kiedy dodałem to stwierdzenie do mojego makra, zadziałało, ale miało pewne skutki uboczne, więc zabrałem je ponownie, a następnie nadal działało. Dzięki za napiwek! –

2

Musisz użyć obiektu, zwolnić go ("rozłączyć") i użyć go ponownie.Zwolnij obiekt dopiero po zakończeniu lub po wywołaniu Form_Closing.

+0

To naprawdę pomaga. Mój problem polega na tym, że próbuję wywołać Sub w PERSONAL.XLSB. Ale ten skoroszyt zostanie otwarty automatycznie po uruchomieniu programu Excel. Kiedy spróbuję otworzyć ponownie, program Excel wyświetli okno z pytaniem, czy chcesz otworzyć przez "tylko do odczytu" ... to spowoduje rozłączenie. –

3

Właśnie spotkałem się z tym problemem dzisiaj: Migrowałem mój projekt Excela z Office 2007 do 2010. W pewnym momencie, kiedy moje makro próbowało wstawić nową linię (np. Range("5:5").Insert), pojawił się ten sam komunikat o błędzie. Dzieje się tak tylko wtedy, gdy poprzednio edytowano inny arkusz (moje makro przełącza się na inny arkusz).

Dzięki Google i twojemu omówieniu znalazłem następujące rozwiązanie (oparte na odpowiedzi udzielonej przez "czerwony" w odpowiedzi Jul 30 '13 o 0:27): po przejściu do arkusza należy edytować komórkę przed wstawieniem nowego wiersza. Dodałem następujący kod:

'=== Excel bugfix workaround - 2014.08.17 
Range("B1").Activate 
vCellValue = Range("B1").Value 
Range("B1").ClearContents 
Range("B1").Value = vCellValue 

"B1" może być zastąpiony przez dowolną komórkę na arkuszu.

+0

Otrzymałem ten sam błąd, podczas gdy, przypadkowo, robi dokładnie to samo (wywołanie ".Wstaw"), a twoje rozwiązanie jest na miejscu! Dzięki za wyraźne załamanie! Możesz umieścić pogrubione słowa w odpowiedzi: Dolna linia: "... Komórka musi być edytowana przed wstawieniem nowego wiersza" – elektrykalAJ

0

Błąd w poniższej linii kodu (jak wspomniano przez wnioskodawcę-William) Wynika to z następującego powodu:

fromBook.Sheets("Report").Copy Before:=newBook.Sheets("Sheet1") 

docelowy arkusz próbujesz skopiować jest zamknięta. (Tutaj newbook.Sheets("Sheet1")). Dodaj poniższą instrukcję tuż przed skopiowaniem do miejsca docelowego.

Application.Workbooks.Open ("YOUR SHEET NAME") 

To rozwiąże problem !!