2013-06-25 9 views
8

Я знаю, что раньше видел ссылки на этот вопрос, но я попробовал несколько предложений, и я все еще получаю ошибку. У меня есть книга, которая собирает данные из другой книги и создает отчет. Затем я хочу создать новую книгу, скопировать отчетную информацию в новую книгу, сохранить новую книгу и закрыть ее, а затем перейти к следующему отчету. Он должен делать это примерно 10 раз. В части моего кода, где я скопировать и вставить листы, я получаю сообщение об ошибкеОшибка Excel VBA Automation: вызванный объект отключился от своих клиентов

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

Я проверил другие проводки об этой ошибке, и попробовал предложенные решения без каких-либо результатов. Интересно то, что иногда он будет делать это через 5 циклов кода до разрыва, иногда только 2. Единственное постоянство в том, что она всегда ломается в том же месте

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

У меня есть вариант Explicit в верхней части модуль, и я проверил, чтобы в нем не было никаких глобалов внутри субблока. Это, как говорится, вполне возможно, я что-то упустил. Я также поставил «таймер» в какой-то момент, чтобы убедиться, что листы excel не перешагивают друг друга.

Я действительно могу воспользоваться помощью!

Вот код моего субмарины:

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

Попробуйте отключить вычисления в верхней части вашего макроса. Application.Calculation = xlCalculationManual (затем включить его снова в конце) ((у меня была аналогичная проблема, и это исправлено) – Sam

+0

Я пробовал. Он все еще разбился в том же месте. – William

ответ

6

У меня была эта проблема с несколькими проектами, конвертирующими Excel 2000 в 2010. Вот что я нашел, что, кажется, работает. Я сделал два изменения, но не уверены, что вызвало успех:

1) Я изменил, как я закрыл и сохранил файл (с близкого расстояния & сохранить = верно, чтобы сохранить под тем же именем файла и закройте файл:

... 
    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) Я вернулся и посмотрел на все .range в коде и убедились, что это был полный конструкт ..

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

или (не 100% уверен, что это правильный синтаксис, но это «усилие», которое я сделал)

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

Команда SaveAs, похоже, работает на меня. Спасибо –

+0

, где вы положили эти строки? – H20rider

0

Пара вещей, чтобы попробовать ...

  1. Закомментируйте второй "Установить NewBook" строки кода ...

  2. У вас уже есть ссылка на объект для книги.

  3. Сделайте свое спасение после копирования листов.

+0

Я сделал попытку с предложенными изменениями, и он ворвался в том же месте, с той же ошибкой, во втором раунде через код. – William

+0

Потенциальная проблема на этот раз заключается в том, что он выглядит так, как будто он циклически перемещается по коду, так что Book2 был открыт, прежде чем Book1 был сохранен и закрыт. – William

1

У меня была такая же проблема в большой электронной таблице Excel 2000 с сотнями строк кода. Мое решение состояло в том, чтобы сделать рабочий лист активным в начале Класса. И.Е. ThisWorkbook.Worksheets («WorkSheetName»). Активировать Это было наконец обнаружено, когда я заметил, что если «OperationSheetName» было активным при запуске операции (код), ошибка не возникала. Некоторое время назад меня сумасшедшим.

+0

Странно, когда я добавил это утверждение в свой макрос, он работал, но у него были некоторые побочные эффекты, поэтому я снова забрал его, а затем он все еще работал. Так что спасибо за подсказку! –

2

Возможно, вы использовали этот объект, выпустили его («отключить») и снова использовали его.Отпустите объект только после того, как вы закончите с ним, или при вызове Form_Closing.

+0

Это действительно помогает. Моя проблема в том, что я пытаюсь вызвать Sub в PERSONAL.XLSB. Но эта книга будет автоматически открыта при запуске Excel. Когда я попытаюсь открыть снова, Excel предложит окну спросить, хотите ли вы открыть «только для чтения» ... это приведет к отключению. –

3

Я сегодня столкнулся с этой проблемой: я перенес проект Excel с Office 2007 на 2010 год. В определенный момент, когда мой макрос попытался вставить новую строку (например, Range("5:5").Insert), появилось то же сообщение об ошибке. Это происходит только тогда, когда ранее был отредактирован другой лист (мой макрос переключается на другой лист).

Благодаря Google и вашему обсуждению я нашел следующее решение (основанное на ответе, заданном «красным» на ответ 30 июля 13: 0: 0): после переключения на лист ячейка должна быть отредактирована перед вставкой новой строки. Я добавил следующий код:

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

«B1» можно заменить любой ячейкой на листе.

+0

Я получал ту же ошибку, когда, по совпадению, делал то же самое (ссылаясь на «.Insert»), и ваше решение на месте! Спасибо за четкий прорыв! Возможно, вы захотите выделить следующие жирные шрифты в своем ответе :) Практический результат: «... ячейку необходимо отредактировать перед вставкой новой строки» – elektrykalAJ

0

Ошибка в следующей строке кода (как указано в запрашивающей-William) обусловлена ​​следующим причинам:

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

Адресат лист вы пытаетесь скопировать закрыт. (Здесь newbook.Sheets("Sheet1")). Добавьте инструкцию ниже перед копированием в пункт назначения.

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

Это решит проблему!