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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2010, 13:17   #1
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию Worksheets.Add()

Создаю книгу Excel. Вставляю в неё модуль Module1 (пустой, без кода). Сохраняю книгу и закрываю Excel.

Запускаю созданную книгу и запрещаю макросы.
Запускаю на выполнение макрос из надстроек:
Код:
Sub Макрос1()
        Debug.Print 3
        Worksheets.Add().Name = "Новое Имя"
        Debug.Print 4
End Sub
Создаётся лист с именем "Лист2" и макрос прекращает работу. Команда Debug.Print 4 не отрабатывает.
При последующих запусках, при пошаговой обработке - всё работает нормально, а вот при первом запуске - нет.

в чём может быть причина?
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 24.09.2010, 05:53   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

При добавлении нового листа в книгу с одновременным присвоением имени (как в Вашем коде), возникает следующая ситуация:
Если листа с таким именем не существует, то он создается. Если же он имеется, то (естественно, при установленном запрете вывода сообщений Excel, либо игнорировании ошибок Excel) будет создан новый лист с именем "Лист...", т.е. стандартное имя следующего листа при добавлении.
Проверьте, нет ли в надстройке листа с таким именем, и какая книга активна при выполнении Вашего кода.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 24.09.2010, 10:35   #3
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Дело в том, что даже если я сделаю так:
Код:
Sub Макрос1()
        Dim WS As Worksheet
        Debug.Print 3
        On Error Resume Next
        Set WS = Worksheets.Add()
        WS.Name = "Новое Имя"
        Debug.Print 4
End Sub
Выполнение прекратится на Set WS = Worksheets.Add(), команда WS.Name = "Новое Имя" не отработает.

Опробовал эту ситуацию на 2-х машинах с разными сборками Office 2007 - эффект один и тот же.

Хочу добавить, что вызов макроса ведётся через меню, установленное надстройкой.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 24.09.2010, 10:45   #4
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Есть у меня подобный пример. Попробуй:
Цитата:
Как задать имя листу, который будет вставлен?
Q:Хочy через Excel VBA задать имя листу, который будет вставлен. Но у команды Sheets.Add нет такого параметра ! Как бороться?

A: Очень просто...
'
Код:
' Sub CreateSheet
' Вставляет активную рабочую книгу в рабочий лист с именем sSName.
' Note: Если параметр bVisible имеет значение False, этот лист становится  скрытым.
'
Рublic Sub CreateSheet(sSName As String, bVisible As Boolean)
Dim wsNewSheet As WorkSheet 

On Error GoTo errНandle 

Set wsNewSheet = ActiveWorkBook.Worksheets.Add 
  With wsNewSheet
   .Name = sSName
   .Visible = bVisible
  End With
Exit Sub
errНandle:
  MsgBox Err.Descriрtion, vbExclamation, "Error #" & Err.Number
End Sub
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 24.09.2010, 14:47   #5
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

У меня проблема не в том, чтобы задать имя листа, а в том, что макрос прекращает работать, натыкаясь на Worksheets.Add(), не выдавая при этом каких-либо сообщений!!!
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 27.09.2010, 07:37   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
макрос прекращает работать, натыкаясь на Worksheets.Add(), не выдавая при этом каких-либо сообщений!!!
Если лист с таким именем уже существует, то будет добавлен новый лист с присвоением ему очередного стандартного имени ("ЛистХ" или SheetX"). При этом ошибки Excel не будет. И еще: макрос прекращает работу? Или работает дальше? Попробуйте вставить какую либо команду после добавления листа и присвоения ему имени. Она будет выполняться?

Цитата:
Хочу добавить, что вызов макроса ведётся через меню, установленное надстройкой.
А если этот код выполнить из отдельного модуля, который находится в рабочей книге (попробуйте), то какой результат получается в этом случае?
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 27.09.2010 в 07:40.
SAS888 вне форума Ответить с цитированием
Старый 27.09.2010, 08:51   #7
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Люди, читайте внимательнее:
[QUOTE=Skif-F;619555]
Запускаю на выполнение макрос из надстроек:
Код:
Sub Макрос1()
        Debug.Print 3
        Worksheets.Add().Name = "Новое Имя"
        Debug.Print 4
End Sub
Создаётся лист с именем "Лист2" и макрос прекращает работу. Команда Debug.Print 4 не отрабатывает.
При последующих запусках, при пошаговой обработке - всё работает нормально, а вот при первом запуске - нет.
QUOTE]
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 27.09.2010, 09:29   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Что-то мне подсказывает, что проблема не в этом коде...
1. Надстройка у Вас всегда установлена? Или устанавливается/удаляется каждый раз при открытии/закрытии?
2. Когда и как создается меню надстройкой?
3. Давайте в студию Вашу надстройку. Можно (лучше) не всю, а только с проблемным кодом. Разберемся.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 27.09.2010 в 09:33.
SAS888 вне форума Ответить с цитированием
Старый 27.09.2010, 12:32   #9
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Выполняю ваше требование Книга и надстройка.zip.
Во вложении хранятся 2 файла: Надстройка.xlam (для Excel 2007) и Книга1.xls (для Excel 2003) - мой Excel отказался создавать надстройку для 2003.

Порядок действий такой:
- устанавливаем надстройку
- устанавливаем: "Отключить все макросы с уведомлением"
- выходим из Excel'я
- запускаем Книга1.xls и запрещаем макросы
- щёлкаем правой кнопкой листе и выбираем "Новое меню/Что-то сделать"
после этого должен создаться лист с именем "Новое Имя"

У меня создаётся Лист4 и макрос работать прекращает. При последующих пусках всё работает как надо
Debug.Print в код я вставил.
Макрос, обслуживающий действие "Что-то сделать", находится в модуле BaseModule.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 28.09.2010, 10:01   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

С запретом макросов я смог решить Вашу задачу только таким образом (см. вложение).
Вложения
Тип файла: rar Primer.rar (23.2 Кб, 34 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с объектами Workbook,worksheets,range savraska Microsoft Office Excel 2 27.05.2010 10:53
Excel 2003: Worksheets().Shapes().Select - выбирает не весь текст фигуры ZaeC Microsoft Office Excel 0 26.05.2010 14:15
Сложение(Add) Rymbil Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 22.01.2010 10:24
SQL.add Grom48 БД в Delphi 2 13.12.2009 16:42
add project lalilulelo Помощь студентам 3 26.05.2009 10:18