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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2013, 20:53   #1
Basarga
Пользователь
 
Регистрация: 21.08.2013
Сообщений: 11
По умолчанию Почему не создаётся лист?

Идея в следующем: если листа "преобразованные данные" нет, то создаём после всех имеющихся листов лист с названием "преобразованные данные". Если же такой лист существует, то удаляем на нём все данные.

Код:
    If Sheets("преобразованные данные") Is Nothing Then Sheets.Add(, Sheets(Sheets.Count)).Name = "преобразованные данные" Else: Sheets("преобразованные данные").Cells.Delete
Когда лист есть, всё работает. Но когда листа нет, выдаёт ошибку "Run-time error 9: Subscript out of range"

Код подсмотрел на http://www.excel-vba.ru/chto-umeet-e...-list-v-knige/
Basarga вне форума Ответить с цитированием
Старый 09.09.2013, 20:56   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Потому что ошибка возникает при этой проверке:
Цитата:
Код:
If Sheets("преобразованные данные") Is Nothing Then
т.к. вы обращаетесь к несуществующему листу

напишите так:
Код:
    On Error Resume Next: Err.Clear: Sheets("преобразованные данные").Cells.Delete ' пытаемся очистить ячейки
    If Err Then Sheets.Add(, Sheets(Sheets.Count)).Name = "преобразованные данные" ' если ошибка - значит, листа не было
EducatedFool вне форума Ответить с цитированием
Старый 09.09.2013, 21:32   #3
Basarga
Пользователь
 
Регистрация: 21.08.2013
Сообщений: 11
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
напишите так:
Код:
    On Error Resume Next: Err.Clear: Sheets("преобразованные данные").Cells.Delete ' пытаемся очистить ячейки
    If Err Then Sheets.Add(, Sheets(Sheets.Count)).Name = "преобразованные данные" ' если ошибка - значит, листа не было
Спасибо. А можно добавить какой-нибудь параметр, чтобы при создании листа остаться на активном? Имя активного листа заранее не известно, поэтому сделал так
Код:
    asname = ActiveSheet.Name
    On Error Resume Next: Err.Clear: Sheets("преобразованные данные").Cells.Delete
    If Err Then Sheets.Add(, Sheets(Sheets.Count)).Name = "преобразованные данные"
    Sheets(asname).Select
Basarga вне форума Ответить с цитированием
Старый 09.09.2013, 22:38   #4
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Там, откуда Вы взяли код вовсе не так написано, поэтому у Вас ошибки лезут.
Код:
    Dim wsSh As Worksheet
    On Error Resume Next
    Set wsSh = Sheets("Новый лист")
    If wsSh Is Nothing Then Sheets.Add(, Sheets(Sheets.Count)).Name = "Новый лист"
Разница в данном случае существенна оказалась.
Кстати, там даже функция есть, которая проверяет наличие листа, с ней проще.

Активацию листа Вы сделали достаточно оптимально, других путей нет.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 10.09.2013, 05:41   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

В подобных случаях я не проверяю ни существование листа, ни какие-либо другие условия, а просто удаляю лист, игнорируя возможную при этом ошибку, и создаю его заново:
Код:
Dim ws As Worksheet: Set ws = ActiveSheet
Application.ScreenUpdating = False: Application.DisplayAlerts = False
On Error Resume Next: Sheets("преобразованные данные").Delete: On Error GoTo 0
Sheets.Add(, Sheets(Sheets.Count)).Name = "преобразованные данные"
ws.Activate
Если же, после создания нового листа требуется создавать таблицу, форматировать ячейки, вставлять формулы, формировать "шапку", изменять шрифт, цвет, ширину столбцов и т.д., то целесообразно не делать это программно, а заготовить скрытый лист-шаблон, и, по мере надобности, копировать его и изменять имя.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 10.09.2013 в 05:53.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование строк таблицы по условию одной ячейки из Лист 1 в Лист 2 Людвиг Microsoft Office Excel 5 25.10.2014 11:46
Не создаётся папка Максим139 C# (си шарп) 3 11.07.2012 00:25
Не создаётся окно в GLFW. Почему? anyx Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 28.01.2011 11:51
Не создаётся БД почему ? NecRoMat PHP 10 16.04.2010 23:51