Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2018, 11:28   #1
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию Прекращение работы Excel при выполнении макроса

Здравствуйте! Помогите, пожалуйста, разобраться, в чем проблема. Есть книга, которая формируется выгрузкой данных из MS Access. В ней на первом листе данные и кнопка, по нажатию на которую запускается макрос. Макрос копирует содержимое листа в другую книгу, которая либо открывается, если уже создана, либо заново создается. После копирования всех данных с листа во второй книге удаляется кнопка, по которой запускается макрос, т.к. там она не нужна.
Проблема в том, что макрос отрабатывает только в том случае, когда вторая книга (в которую выполняется копирование), пуста. Т.е. в ней только стандартные Лист 1, Лист 2, Лист 3. В этом случае все выполняется верно: создается новый лист с данными из первой книги и занимает позицию перед Листом1. При последующих попытках копирование больше не выполняется. На той самой строчке в коде, где выполняется копирование листа, вылетает сообщение о прекращении работы MS Excel. Не могу понять, в чем причина...
Код:
Sub Макрос1()
Dim xlAPP As Excel.Application
Dim xlWb As Excel.Workbook
Dim xlWs As Excel.Worksheet
Dim mypath As String
Dim s As String
mypath = "C:\Рапорты\Рапорт_" & Month(Date) & "_" & Year(Date) & ".xls"
    Set xlAPP = CreateObject("Excel.Application")
    xlAPP.Visible = False
    If Dir(mypath) = "" Then 'если рапорта за месяц еще нет, надо его создать
        Set xlWb = xlAPP.Workbooks.Add
        xlWb.SaveAs Filename:=mypath, FileFormat:=xlOpenXMLWorkbook, ConflictResolution:=xlLocalSessionChanges
        xlWb.Close
    End If
    
    Set xlWs = ThisWorkbook.Sheets(1)
    s = ThisWorkbook.Sheets(1).Name
    Set xlWb = Workbooks.Open(mypath)
    xlWs.Copy Before:=xlWb.Worksheets("Лист1") ' вот здесь прекращает работать
    xlWb.Worksheets(s).Shapes("Button 1").Delete
    ThisWorkbook.Close SaveChanges:=False
 

End Sub

Последний раз редактировалось Swatch; 22.05.2018 в 12:45.
Swatch вне форума Ответить с цитированием
Старый 22.05.2018, 12:00   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

чему равно S?
Код:
s = ThisWorkbook.Sheets(1).Name
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 22.05.2018, 12:40   #3
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

s равно текущей дате, преобразованной к текстовому формату... Этот параметр передается из Акцесса при формировании первой книги.
Swatch вне форума Ответить с цитированием
Старый 22.05.2018, 12:50   #4
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

Выявилось следующее: если в книгу, куда я пытаюсь скопировать лист, предварительно добавить пустой лист вручную, то тогда копирование выполняется.
Swatch вне форума Ответить с цитированием
Старый 22.05.2018, 12:50   #5
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Swatch Посмотреть сообщение
предварительно добавить пустой лист вручную
проверяйте сколько листов в новой книге, если 0 - добавляйте лист макросом. А почему вставить надо именно перед "Лист1", а если "Лист1" не будет в книге?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 22.05.2018 в 12:56.
Aleksandr H. вне форума Ответить с цитированием
Старый 22.05.2018, 12:57   #6
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

да в общем то и необязательно перед Лист1, мне просто нужно соблюдать порядок по возрастанию при каждом копировании листа. Т.к. наименования листов обозначают даты, и важно их расположить по возрастанию за месяц. Поэтому я и ориентировалась, чтобы каждый следующий лист всегда вставал перед Листом1.
Swatch вне форума Ответить с цитированием
Старый 22.05.2018, 13:02   #7
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

А как можно вставить лист, не указывая параметр Before, т.е. чтобы обойтись без указания конкретного листа?
Swatch вне форума Ответить с цитированием
Старый 22.05.2018, 13:05   #8
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

вставляйте после всех листов.
Код:
    With xlWb 
        .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = s
    End With
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 22.05.2018, 13:34   #9
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

Спасибо!
Swatch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прекращение работы при запуске макроса из другого файла Дмитрий17 Microsoft Office Excel 4 01.11.2017 20:32
повторяющаяся ошибка при выполнении макроса who Microsoft Office Excel 2 03.10.2014 13:57
Ошибка 400 при выполнении макроса shoa_izh Microsoft Office Excel 12 15.07.2011 15:08
Ошибка при выполнении макроса rlev Microsoft Office Excel 8 22.02.2010 12:41
При выполнении макроса, дергается таблица valerij Microsoft Office Excel 3 23.03.2008 00:38