2013-08-16 5 views
6

Я несу ответственность за очень большую таблицу Excel 2010 со ссылками на все виды внешних источников данных, включая Bloomberg, 65 листов с модулями vba и ссылки на другие надстройки vba.Excel VBA Project сгенерировал несколько объектов рабочей книги

Я заметил, что проект VBA приобрел несколько объектов рабочей книги.

Существует стандартный ThisWorkbook. Тем не менее, ряд рабочих листов также был превращен в объекты рабочей книги Excel, оставив исходный лист в виде копии предыдущего, за вычетом кода.

Это, как представляется, не является результатом действий человека. Действительно, я не думал, что возможно иметь более одного объекта Workbook!

Например, у меня был один рабочий лист wksInputs, который теперь превращен в объект Workbook, а исходный wksInputs теперь называется wksInputs1.

example

Я не могу удалить объект wksInputs Workbook.

Пожалуйста, помогите объяснить, что здесь происходит, и как я могу решить проблему ...?

Большое спасибо.

+0

Вы можете загрузить скриншот из списка папок проекта VBA? Загрузите сайт, например imgur.com, и включите ссылку/URL в свой вопрос. –

+0

Дэвид, к сожалению, мне запрещено загружать на такие сайты мои стандарты безопасности в офисе. Я попытался включить изображение выше, но StackOverflow говорит, что у меня нет необходимого privelege ... Позвольте мне попробовать что-то еще, поскольку я знаю, что это действительно поможет другим увидеть проблему ... –

+0

Да, это действительно будет невозможно, не видя, что вы видите. –

ответ

0

Эта проблема возникла в моем коде, когда я проходил мимо рабочего листа к югу в качестве параметра, например:

Вызов BuildCodeStrings (Лист2 sAccount)
Sub BuildCodeStrings (wsSource как рабочий лист, с As String)

Чтобы устранить проблему, я создал новую книгу, скопировал все данные со всех законных листов в моем оригинале в одноименные листы в моей новой книге. Затем скопировал весь код из оригинала в новую книгу.

Тогда я изменил вызов подпрограмм

Вызов BuildCodeStrings ("IC счетов", sAccounts)
Sub BuildCodeStrings (sSource As String, с As String)

и добавил одну строку кода к моей подпрограмме BuildCodeString:

Set wsSource = ThisWorkbook.Sheets (sSource)

Я не знаю, что вызывает эту проблему, но это обходное решение сработало для меня.

3

Вот мое решение, оно работает последовательно, и вам не нужно вручную копировать листы и код в пустую книгу. Я тестировал этот метод на нескольких поврежденных книгах, которые при запуске давали мне ошибку «Ошибка автоматизации - катастрофический сбой».

ПРИМЕЧАНИЕ: Исходный поврежденный файл был сохранен как .XLSM

  1. Открыть пустую книгу Excel
  2. вкладка Разработчик> Безопасность макросов> Отключить все макросы без уведомления
  3. Закрыть Excel
  4. Дважды щелкните поврежденный файл, например, MyFile.xlsm
  5. Файл> Сохранить как ...> MyFile.xlsb (не. Xlsm), выбирая формат .xlsb - вот что делает трюк
  6. вкладка разработчика> Макрозащита> Включить al л макросы (или любой другой уровень безопасности, который вы предпочитаете)
  7. Закрыть Excel
  8. Дважды щелкните MyFile.xlsb

Файл теперь установлен! Вы можете повторно сохранить файл MyFile.xlsb как .xlsm, если это необходимо. По моему опыту .xlsm-файлы могут быть повреждены довольно легко, поэтому я собираюсь привыкнуть всегда использовать формат .xlsb.

Надежда кто-то считает, что это полезно :)

+1

К сожалению, это не помогло мне –

0

Я была такая же проблема в PowerPoint (2007), где «Slide1» был пуст и не может быть удален. Ответ на @Scoox указал мне на решение:

  1. Экспорт всех модулей VBA в текст (.BAS) файлы
  2. Сохраните .pptm (или .xlsm) файл в качестве .pptx (или .xlsx)
  3. Закрыть PowerPoint (или Excel)
  4. Открыть этот .pptx/.xlsx и сохранить его обратно в .pptm/.xlsm
  5. Импорт исходного текста VBA (.bas) файлы
  6. вручную повторно ассоциировать все кнопки в исходные макрофункции
  7. Добавить любой внешний Reference вы имели в исходном файле
  8. Сохранить и тест, если все хорошо

Это работает для меня, я считаю, что это будет работать с Excel, тоже.