Foreversoft.ru

IT Справочник
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel создать лист с именем

Создание и именование рабочего листа в Excel VBA

У меня есть очень простой код, который добавляет новый лист после текущих листов в документ Excel, а затем меняет его имя на имя, введенное в текстовое поле в форме пользователя. Хорошо работает с новой книгой, однако в книге, содержащей несколько существующих листов, он создает новый лист, но не переименовывает его.

Это происходит только при первом запуске этого кода, в следующий раз он будет работать нормально. Еще более странным является то, что если вы откроете редактор VBA, чтобы попытаться отладить его, он также будет работать нормально. Это, очевидно, делает поиск ошибки довольно трудно.

Код, который я использую, находится здесь:

Все очень просто. Мне интересно, если эта проблема заключается в том, что он пытается переименовать лист, прежде чем он будет правильно создан? Есть ли лучший способ написать этот код?

Update: я начал отлаживать это с помощью msgboxes, так как открытие отладчика останавливает проблему, и кажется, что он просто перестает обрабатывать код на полпути:

3 Ответа

Вам не нужно знать, где он находится или как его зовут, вы просто называете его WS.
Если вы все еще хотите сделать это «old fashioned» способом, попробуйте это:

Вы используете обработчик ошибок? Если вы игнорируете ошибки и пытаетесь назвать лист так же, как существующий лист или имя с недопустимыми символами, это может быть просто пропуск этой строки. Смотрите функцию CleanSheetName здесь

для списка недопустимых символов,которые вы можете проверить.

Обновление

Другие вещи, чтобы попробовать: полностью квалифицированные ссылки, бросание в Doevents, очистка кода. Этот код квалифицирует вашу ссылку на листы до ThisWorkbook (вы можете изменить ее на ActiveWorkbook, если это подходит). Он также добавляет тысячу DoEvents (глупый перебор, но если что — то займет некоторое время, чтобы сделать это, это позволит ему-Вам может понадобиться только один DoEvents, если это действительно что-то исправит).

Наконец, всякий раз, когда у меня возникает тупая проблема VBA, которая просто не имеет смысла, я использую CodeCleaner Роба Бови. Это надстройка, которая экспортирует все ваши модули в текстовые файлы, а затем повторно импортирует их. Вы можете сделать это и вручную. Этот процесс очищает любой поврежденный p-код, который висит вокруг.

Вы фиксируете ячейку перед нажатием кнопки (нажатие Enter)? Содержимое ячейки должно быть сохранено до того, как ее можно будет использовать для присвоения имени листу.

Лучший способ сделать это-открыть диалоговое окно и получить имя, которое вы хотите использовать.

Похожие вопросы:

Я пытаюсь использовать событие изменения рабочего листа в Excel VBA, но оно, похоже, не работает. Из того, что я понял, достаточно просто определить функцию обработки Worksheet_Change, как я это.

Я пытаюсь автоформировать, как отображается нижняя часть страницы Excel, чтобы автоматически просмотреть все имя листа. По умолчанию половина имени листа обрезается, так как горизонтальная полоса.

У меня есть набор пользовательских функций vba, которые находятся в модуле excel, а затем вызываются из электронной таблицы excel. на данный момент все работает нормально. Меня попросили.

У меня есть рабочий лист с несколькими событиями изменения рабочего листа. К сожалению, я получаю некоторые ошибки памяти из-за них. Мне было интересно, может ли кто-нибудь посмотреть на этот.

Я пытаюсь улучшить производительность проекта C# Winform. Ранее создание файла Excel выполнялось в течение 100000 МС (с использованием Office.Interop.Excel). Используя ClosedXml это около 5000 мс.

Встроенные функции Excel имеют стиль UPPERCASE символов. Я немного OCD и как мои пользовательские функции рабочего листа, чтобы быть UPPERCASE тоже, как и встроенные функции Excel. Однако Excel 2013.

В Microsoft Excel я написал несколько кодов для события изменения рабочего листа. Теперь я хочу создать sub и поместить его в файл personal.xlsb , чтобы всякий раз, когда пользователь запускает его.

Эй, ребята, у меня есть большой объем данных в файле excel прежде чем я начну использовать данные, мне нужно обрезать их все один раз но когда я использую vba для обрезки всего рабочего листа, это.

Обычно функция оценки Excel VBA является удобным способом получить результат формулы рабочего листа в VBA без необходимости помещать формулу в ячейку рабочего листа. Тем не менее, я нахожу, что если.

Читать еще:  Excel подсчет символов в строке

VBA в Excel Объект Excel.Worksheet и программная работа с листами Excel средствами VBA

10.5 Коллекция Sheets и объект Worksheet, их свойства и методы

Объект Excel.Worksheet, программное создание, обнаружение, удаление листа Excel средствами VBA, свойства, методы и события объекта Excel.Worksheet

В Word ниже объекта Application и Document начинались уже объекты непосредственно для работы с текстом — Selection, Range и т.п. В Excel между объектом рабочей книги и ячейками есть еще один промежуточный объект — объект Worksheet (лист). Объекты Worksheet в книге объединены в коллекцию Sheets.

Чаще всего для ввода данных в Excel (напрямую или из базы данных) нам потребуется в первую очередь определиться с листом, на который пойдет ввод данных — либо просто выбрать его, либо вначале создать, а потом выбрать.

Процесс создания выглядит очень просто:

Dim oExcel As New Excel.Application ‘Запускаем Excel

oExcel.Visible = True ‘Делаем его видимым

Dim oWbk As Excel.Workbook

Set oWbk = oExcel.Workbooks.Add () ‘Создаем новую книгу

Dim oSheet As Excel.Worksheet

Set oSheet = oWbk.Worksheets.Add() ‘ Создаем новый лист

oSheet.Name = «Новый лист» ‘Присваиваем ему имя «Новый лист»

Метод Add() для коллекции Worksheets принимает несколько необязательных параметров, главная задача которых — определить, между какими существующими листами будет вставлен новый лист. Если ничего не указывать, то новый лист будет помещен самым первым.

Часто встречается и другая задача — просто найти нужный лист среди листов книги, например, если мы открыли существующую книгу. Сделать это очень просто, поскольку коллекция Worksheets умеет работать с именами листов. Ниже приведен пример, в котором мы так же запускаем Excel и создаем новую книгу, но при этом находим лист с именем «Лист1» и переименовываем его в «Новый лист»:

Dim oExcel As New Excel.Application ‘Запускаем Excel

oExcel.Visible = True ‘Делаем его видимым

Dim oWbk As Excel.Workbook

Set oWbk = oExcel.Workbooks.Add() ‘Создаем новую книгу

Dim oSheet As Excel.Worksheet

Set oSheet = oWbk.Worksheets.Item(«Лист 1») ‘ Находим Лист1

oSheet.Name = «Новый лист» ‘Присваиваем ему имя «Новый лист»

Обратите внимание, что в английской версии Excel этот код, скорее всего, не пройдет, поскольку листы там по умолчанию называются «Sheet1», «Sheet2» и т.п. Если вы в вашем коде используете имена листов по умолчанию и при этом вашей программе придется работать на компьютерах с разноязычными версиями Excel, обязательно предусмотрите дополнительные проверки или просто используйте номера листов вместо их имен.

У коллекции Sheets, помимо привычных нам свойств и методов ( Count, Item, Add(), Delete()) и свойств и методов, которые удобнее применять для объекта Worksheet ( Visible(), Copy(), Move(), PrintOut(), PrintPreview(), Select()) — поскольку все равно указывать конкретный лист — есть и один специфический метод FillAcrossSheets() — скопировать объект диапазона Range (варианты: полностью, только содержимое, только оформление) во все листы данной книги.

У объекта Worksheet — множество важных свойств и методов:

  • Cells — одно из наиболее часто используемых свойств объекта Worksheet. Работает точно так же, как и рассмотренное выше одноименное свойство объекта Application — за исключением того, что вам больше не нужно ограничиваться только активным листом. Аналогично работают свойства Columns и Rows.
  • EnableCalculation — возможность отключить автоматический пересчет значений ячеек в книге.
  • EnableSelection — возможность запретить выделять на листе: все, ничего не запрещать, или разрешить выделять только незаблокированные ячейки.
  • Next — возможность получить ссылку на следующий лист в книге. Previous — то же самое для предыдущего листа.
  • PageSetup — как и в Word, возможность получить объект PageSetup, при помощи которого можно настроить те же параметры, что и через меню Файл ->Параметры страницы.
  • свойство Protection позволяет получить объект Protection, при помощи которого можно запретить пользователю вносить изменения в лист Excel. Настройке параметров защиты также служат и другие свойства, названия которых начинаются на Protection.
  • QueryTables — исключительно важное свойство. Оно возвращает коллекцию QueryTables — набор объектов QueryTable, которые, в свою очередь, представляют данные, полученные из внешних источников (как правило, из баз данных).
  • Range — самое важное свойство объекта Worksheet. Возвращает объект Range (диапазон ячеек), который в объектной модели Excel занимает примерно такое же место, что и одноименный объект в объектной модели Word. Этот объект будет рассматриваться ниже.
  • Type — возможность определить тип данного листа. Обычно используются два типа: xlWorksheet (обычный лист) и xlChart (диаграмма).
  • UsedRange — возвращает объект Range, представляющий собой прямоугольную область, включающую все непустые ячейки. Удобно для целей копирования или форматирования.
  • Visible — возможность спрятать лист с глаз пользователя (например, если он используется для служебных целей).
Читать еще:  Vba excel проверка на число

Некоторые важные методы объекта Worksheet:

  • методы Activate() , Calculate(), Copy(), Paste(), Delete(), Move(), Evaluate(), Select(), SaveAs(), PrintOut(), PrintPreview(), Protect(), Unprotect()нам уже знакомы . Отличие заключается только в том, что теперь эти методы могут применяться для выбранного вами листа.
  • метод PivotTables() возвращает коллекцию очень интересных объектов PivotTable (сводная таблица), которые будут рассматриваться ниже;
  • метод Scenarios() возвращает коллекцию Scenarios, состоящую из объектов Scenario (сценарии). Сценарии — это именованные наборы вводных данных, которые можно использовать для проверки различных сценариев (разные суммы продаж, уровни налогов, расходов и т.п.)
  • SetBackgroundPicture() — возможность назначить листу фоновое изображение (естественно, желательно, чтобы оно было полупрозрачное — «водяной знак», иначе на его фоне будет трудно читать текст в ячейках).
  • ShowAllData() — показать все скрытые и отфильтрованные данные на листе.

Самое важное событие объекта Worksheet — это, конечно, Change. Существует множество практических задач, когда изменение пользователем значения ячейки должно приводить к изменению значения в ячейке другого листа/рабочей книги Excel или даже в базе данных. Другая ситуация, в которой используется это события — сложная проверка вводимого пользователем значения (например, опять-таки через обращение к базе данных). Эта событийная процедура работает со специальным параметром Target — то есть объектом Range, представляющим изменившуюся ячейку. При помощи свойств и методов объекта Range вы можете получить информацию об изменившемся значении, столбце и строке, в котором произошло изменение и т.п.

У объекта Worksheet есть еще два очень удобных события (их сильно не хватает объекту Document в Word). Это — события BeforeRightClick() и BeforeDoubleClick(). Как понятно из названия, первое событие позволяет перехватывать щелчок правой кнопкой мыши по любому месту в листе, а второе — двойной щелчок мышью. При помощи этих событий вы можете назначить свою реакцию (открытие контекстных меню, выдачу предупреждающих сообщений, переход в другой режим работы и т.п.) на действия пользователя.

Vba excel создать лист с именем

Аэроплан » 23.10.2003 (Чт) 13:59

Макрос создает новый лист.
Неоднократно все время пока файл открыт.
Имена создаваемых файлов меняются Лист1, Лист2.
Как узнать его имя?

.
Я знаю только точное его положение. Он всегда третий слева.

Tony » 23.10.2003 (Чт) 14:29

Но ведь это совершенно не по взрослому 😉

Аэроплан » 23.10.2003 (Чт) 14:51

А как же тогда пользоваться
Код: Выделить всё Workbook_NewSheet(ByVal Sh As Object)
Ведь это, насколько я понимаю, как раз и есть инструмент для выхватывания «листовых новообразований» в файле.
Я вот только не знаю, как изменить имя листа.

Код типа Sh.Name = «имя_листа» не работает и вообще при компиляции он говорит, что Sh.Name содержит в себе имя ВСЕГО документа, т.е. Имя_файла.xls.

Вот такая петрушка.

Tony » 23.10.2003 (Чт) 14:55

Аэроплан » 23.10.2003 (Чт) 15:54

Да нет же. Не имеет значения, каким образом создается ЛИСТ.
Просто эта процедура как-то реагирует и что-то возвращает при создании нового листа.. Т.е. она точно реагирует и отрабатывается сразу при появлении нового листа. Однако она не возвращает ИМЯ нового созданного листа. Точнее я незнаю как его оттуда выдрать. Вот.
Код: Выделить всё Sub Workbook_NewSheet(ByVal Sh As Object)

‘ тут чтото я незнаю’

Sh.Name = Date
Sheets(newSheetName).Select
Sheets(newSheetName).Move After:=Sheets(3)
Sheets(«Хронология»).Select
Range(«A1:K3»).Select
Selection.Copy

Sheets(newSheetName).Select
ActiveSheet.Paste
Sheets(«Хронология»).Application.CutCopyMode = False

End Sub

Так примерно я наваял. А вот Sh.Name не работает.
Точнее работает, но не так. При компиляции выделенный Name возвращает имя ВСЕГО файла Имя_файла.xls и на этом вылетает. в ошибку.

Читать еще:  Форматирование набор значков в excel

RayShade » 23.10.2003 (Чт) 16:07

Что то ты мудришь по ходу.

У меня все работает на ура. И с выводом имени листа и с его изменением. Версия офиса какая? Сервиспаки?

Vitaly1 » 23.10.2003 (Чт) 16:41

Если знаешь расположение то так, для активной книги:

Извиняюсь.

Аэроплан » 23.10.2003 (Чт) 17:11

Я извиняюсь. Действительно перемудрил. Код этот работает.
блин, я его собрал, и стал жаловаться на судьбу, а проверить еще не успел.. Проблема в другом.
Совсем в другом.

Если в один день создается несколько листов, то необходимо из
Код: Выделить всё newSheetName = Date

сделать Код: Выделить всё newSheetName = Date + Time

Однако это не работает по причине запрета использования двоеточий (чч:мм:сс) в именах листов. Я тут спешу, короче, сроки поджимают, вот и получается котовасия — проблему решил, тут же перескочил на другую, а решение предыдущей еще не осознал.
Я же не программист ВБ, я программист промышленный — там все проще.

Огромное спасибо за помощь и внимание.

Буду теперь из времени выдергивать двоеточия и менять их на «_».
Снова в поиск.

RayShade » 23.10.2003 (Чт) 17:17

Советую воспользоваться таким водом:

Код: Выделить всё newSheetName = replace(cstr(date+time),»:»,»_». vbtextcompare)

Vitaly1 » 23.10.2003 (Чт) 17:29

там функция есть говорил RayShade но я ее не знаю, поэтому используй мой программный код преобразования:

S = »20:10:3»
s1 =»»
for i=1 to len(s)
if mid(s,i,1) <>«:» then
s1=s1+mid(s,i,1)
else
s1=s1+» »
end if
next i

в s1 символ : замениться на пробел

RayShade » 23.10.2003 (Чт) 18:07

. без комментариев

На самом деле код Vitaly1 можно модифицировать избавив себя от необходимости заводить лишнюю строковую переменную (только правда в случае, когда искомая подстрока и подстрока замены одинаковы в длине):

Код: Выделить всё s = »20:10:3»
for i=1 to len(s)
if m
next i

Vba excel создать лист с именем

Опции темы

Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.10.2004

Репутация: нет
Всего: нет

Хоца сделать динамически формируемые отчет, то есть создавать лист на него копировать данные по выборке из этой же книги.

проблема вот в чем

Отчетов несколько, форматирование в каждом отчете разное.
А формироваться должны на одном листе.
Посему пытался сделать

ALiron
Дата 20.10.2004, 11:38 (ссылка) | (нет голосов) Загрузка .
Код
Sheets(«Печать»).Select
Sheets(«Печать»).Activate
ActiveSheet.Unprotect
Sheets(«Печать»).Select
Worksheets(«Печать»).Cells.Select
Selection.Delete Shift:=xlToLeft

Форматирование листа сохранялось, такое как

Код
.HorizontalAlignment = xlRight

и

Код
Selection.Font.Bold = True

потом попробовал удалять лист и создавать новый

Код
Sheets(«Печать»).Select
ActiveWindow.SelectedSheets.Delete
Sheets.Add
Sheets(Sheets.Count — 1).Select
Sheets(Sheets.Count — 1).Name = «Печать»

Получается, но лист добавляется не там где надо.
Можно ли поменять его положение в книге?
а) при создании
б) после создания

Советчик

Профиль
Группа: Модератор
Сообщений: 20437
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 32
Всего: 449

a) да. У Sheets.Add есть некие параметры
б) да. У Sheets есть некие методы

RTFM одним словом.

О(б)суждение моих действий — в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция — Администрация форума.

Akina
Дата 20.10.2004, 12:17 (ссылка) | (нет голосов) Загрузка .
shilnik
Дата 21.10.2004, 13:10 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 377
Регистрация: 22.12.2003

Репутация: нет
Всего: 1

Кажется надо

Код
sheets.add before=»Лист1″

Добавит лист после листа с именем «Лист1»

Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.10.2004

Репутация: нет
Всего: нет

ALiron
Дата 21.10.2004, 16:42 (ссылка) | (нет голосов) Загрузка .

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс «транслит» (возле кнопок кодов) если у Вас нет русских шрифтов.
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

Google
Дата 4.4.2020, 06:42 (ссылка)
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »

[ Время генерации скрипта: 0.1232 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Ссылка на основную публикацию
Adblock
detector