Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/189: Рейтинг темы: голосов - 189, средняя оценка - 4.55
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2

Как узнать Item листа в книге Excel

09.07.2012, 13:35. Показов 39085. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть большая книга (листов больше 1000)
Не ругайте - так удобнее мне для своих целей
Name листов меняются программно, а item - величина постоянная
Мне нужно оперировать доступом к конкретному листу по Item, для чего его сначала нужно узнать

что-то типа

Visual Basic
1
id_sheet = Activesheet.Item
но эта красота не работает

и правильно ли я дальше действую:
Visual Basic
1
Sheets.Item(id_sheet).Activate
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2012, 13:35
Ответы с готовыми решениями:

При создании нового листа произвести проверку на существование вводимого имени листа в текущей книге EXCEL
При создании нового листа, произвести проверку на существование вводимого имени листа в текущей книге EXCEL и если такой лист существует то...

Как узнать размер листа в Excel?
есть таблица на листе.. как узнать сколько столбцов до первого пустого столбца.. и соответственно строк - до первой пустой строки ...

Создание листа в рабочей книге Excel
Мне надо экспортировать данные из запроса в один экселевский файл, причём каждую запись на новый лист. Как это сделать? В начале...

23
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
09.07.2012, 13:50
Можно с Index`ом попробовать (если я задачу понял правильно)?
Visual Basic
1
2
3
4
dim id_sheet as integer
id_sheet=ActiveSheet.Index
'а далее
Worksheets(id_sheet).Activate
2
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
09.07.2012, 13:55
у листа есть неизменяемое (read-only) свойство CodeName.
но обращаться к листу, зная его CodeName - довольно хлопотно.
1
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
09.07.2012, 14:58  [ТС]
а index не меняется, если лист относительно других листов поменяет свое положение?
у меня листы тасуются в ходе работы пользователем (мной, лентяем), как колода карт блин....

и чем CodeName отличатеся от Item?

вроде именно Item предназначен для таких целей... вот только криво как-то он реализован для листов... или я криво к нему обращаюсь...
0
1703 / 190 / 19
Регистрация: 20.11.2011
Сообщений: 281
09.07.2012, 15:14
Обращаться по item, index - самый ненадежный способ. Используйте свойства name, или как советовал Александр(ikki) - codename. А Ваш вариант как раз:
id_sheet = ActiveSheet.Index - индекс листов меняется из-за удаления-добавления-перемещения.

Саш, ток я не понял, почему хлопотно codename? Чаще даже удобней, чем name:-)
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
09.07.2012, 15:24
Цитата Сообщение от kuklp Посмотреть сообщение
Саш, ток я не понял, почему хлопотно?
а как?
(work)sheets() требуют либо номер, либо имя.
по CodeName - через цикл перебора листов (именно это я и называю "хлопотно").
конечно, можно использовать CodeName непосредственно в тексте макроса, но это если оно известно (лист существует) на этапе разработки.

Добавлено через 2 минуты
AndreA SN, у листа нет свойства Item.
это "умолчальное" свойство коллекции листов.
Sheets.Item("Лист1") и Sheets("Лист1") - одно и то же.
1
1703 / 190 / 19
Регистрация: 20.11.2011
Сообщений: 281
09.07.2012, 15:27
Сравни:
Set rng = Worksheets("Лист1").[a2:a20]
Set rng = Лист1.[a2:a20]
Или просто листов:
Set sh = Worksheets("Лист1")
Set sh = Лист1
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
09.07.2012, 15:32
Цитата Сообщение от ikki Посмотреть сообщение
Sheets.("Лист1")
Точка лишняя
А чем классика не устраивает? Назначил переменныю и спи спокойно
Visual Basic
1
2
3
4
dim id_sheet as worksheet
set id_sheet=ActiveSheet '.Index
'а далее
id_sheet.Activate
1
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
09.07.2012, 15:34
kuklp, ну я ж писал:
Цитата Сообщение от ikki Посмотреть сообщение
конечно, можно использовать CodeName непосредственно в тексте макроса, но это если оно известно (лист существует) на этапе разработки.
Добавлено через 1 минуту
Цитата Сообщение от Апострофф Посмотреть сообщение
Точка лишняя
где?
спасибо, успел поправить.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
09.07.2012, 20:35
Просветите по поводу получения Codename листа и обращения к нему.
0
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
09.07.2012, 22:16
Цитата Сообщение от Diskretor Посмотреть сообщение
Просветите по поводу получения Codename листа и обращения к нему.
Тоже интересно очень!
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
09.07.2012, 22:40
Лучший ответ Сообщение было отмечено как решение

Решение

попробую...

у листа рабочей книги (объекты worksheet, chart) есть свойства index, name, codename
index - текущий номер листа по порядку (включая скрытые), может меняться пользователем при изменении порядка и количества листов;
name - то, что отбражается на ярлычке, может меняться пользователем (конечно. если книга не защищена);
codename - "внутреннее" имя листа, "обычному" пользователю невидимое и недоступное, поэтому не может меняться пользователем.
кроме того, codename является свойством read-only и через VBA также не может быть изменено. *)
в VBE в окне проекта в списке объектов сначала указаны кодовые имена листов, а затем, в скобках, "обычные" имена.

"обычные" и "необычные" ("кодовые") имена могут совпадать, могут - нет.
но в пределах каждого из множеств имён имя должно быть уникальным (без учета регистра символов)

изменить codename можно через интерфейс VBE - ЛКМ по имени листа в списке объектов - F4 - свойство (Name) - именно которое со скобками.

доступ к отдельному листу возможен:
- по индексу
- по "обычному" имени
и для того, и для другого, используется свойство item коллекций sheets, worksheets, charts объекта workbook:
sheets.item(2)
charts.item("диаграмма 5")

и т.п.

т.к. свойство item является "умолчальным", то допустимы и конструкции
sheets(2)
charts("диаграмма 5")


прямого доступа по "кодовому" имени листа через коллекцию - нет.
но, зная codename листа на этапе разработки проекта (макроса). можно прямо это имя написать в качестве идентификатора листа:
лист1.[a1] - обращение к ячейке A1 листа с кодовым именем "лист1" ("Лист1" и т.п.)

если же нужно получить лист по кодовому имени, но на этапе разработки оно было неизвестно, то примерно так:

Visual Basic
1
2
3
4
5
6
7
function getSheetByCodename(sCodeName as string, optional wb as workbook=nothing) as sheet
  if wb is nothing then set wb=activeworkbook
  for each sh in wb.sheets
    if sh.codename=sCodeName then set getSheetByCodename=sh: exit function
  next
  set getSheetByCodename=nothing
end function
зачем оно всё надо - надеюсь, понятно?

_________________________
*) однако, может: Как узнать Item листа в книге Excel
8
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.07.2012, 00:03
Такое великолепное описание, почти мини-статья.
Даже сохраню ссылку для других, чтобы не объяснять.

P.S. всегда раньше считал, что лист1.[a1] обращается к обычному имени листа, а это не так.
А все потому, что по-умолчанию кодовое имя листа = обычному его имени.
0
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
10.07.2012, 01:12
Цитата Сообщение от ikki Посмотреть сообщение
свойство (Name) - именно которое со скобками
Всегда подозревал что здесь какая то собака зарыта...
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
10.07.2012, 03:48
забыл написать: изменение CodeName в отличие от Name разрешается в пределах, обычных для идентификаторов VBA - оно должно начинаться с буквы, содержать буквы, цифры, знак подчеркивания, т.е. следующие имена для свойства CodeName недопустимы:
"123"
123
1лист
лист 1
лист.1
sheet%%

кроме того, оно не должно совпадать с ключевыми словами VBA - такими как for, to, sub

указать же любую из этих строк в качестве "обычного" имени листа (Name) вполне можно.
правда, там свои ограничения - например, обычному имени в русской локали нельзя задать "журнал", а свойству codename - можно.
2
1703 / 190 / 19
Регистрация: 20.11.2011
Сообщений: 281
10.07.2012, 07:51
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от ikki Посмотреть сообщение
codename является свойством read-only и через VBA также не может быть изменено
Может, Саш. Создай новую книгу и выполни в ней:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Public Sub www()
    Dim Sh As Object, n&, iCodeName$
    n = 1
    For Each Sh In Sheets
        iCodeName = Sh.CodeName
        Application.VBE.ActiveVBProject.VBComponents(iCodeName).Name = "Ежик" & n
        Sh.Name = Sh.CodeName
        n = n + 1
    Next
End Sub
В параметрах должна стоять галка "Доверять доступ к Visual Basic Projekt".
3
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
10.07.2012, 08:35
спасибо за поправку.
хотя странно выглядит - sheets являются объектами книги, а их свойство codename меняется только через vbcomponents()...

а почему разрешено только так? не в курсе?

Добавлено через 11 минут
Цитата Сообщение от kuklp Посмотреть сообщение
В параметрах должна стоять галка "Доверять доступ к Visual Basic Projekt".
к своему стыду - не нашёл (2003).
а программно её можно снять/установить?
0
1703 / 190 / 19
Регистрация: 20.11.2011
Сообщений: 281
10.07.2012, 08:50
а программно её можно снять/установить?
А какой бы смысл был в такой безопасности?
Миниатюры
Как узнать Item листа в книге Excel  
1
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
10.07.2012, 08:57
умгу...
я не там искал - в свойствах проекта... а надо было в параметрах книги.
спасибо.

Цитата Сообщение от kuklp Посмотреть сообщение
А какой бы смысл был в такой безопасности?
никакого. но это ничего не доказывает
ээээ.... а вот как-нибудь... программно вызвать это диалоговое окошко и потом через SendKeys послать нужный набор Tab'ов и Enter'ов?.. нельзя?
(я вдруг обнаружил в себе желание стать хакером )
0
1703 / 190 / 19
Регистрация: 20.11.2011
Сообщений: 281
10.07.2012, 09:01
Дерзай, авось получится:-)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2012, 09:01
Помогаю со студенческими работами здесь

Как узнать имя активного листа в Excel-е?
И еще вопрос до кучи... Как узнать имя активного листа в Excel-е?

Как узнать точную высоту листа в Excel?
Суммирование всех ячеек до первого HPageBreak не подходит.

Работа с Excel. Создание листа в книге по шаблону
Доброго времени суток. Прошу помочь с вопросом: Есть некоторая книга Ecxel из 2-х листов (а и b) с определенным форматированием....

Очистить содержимое определённого листа в книге Excel
Доброго, форумчане! не как не могу средствами vbs очистить содержимое определенного листа в excel не хочется делать так intRow = 1 ...

Поиск в книге, по названию листа другой. Excel
Добрый день, столкнулся с такой проблемой, не знаю как осуществить поиск по названию листа, объясню: Есть книга "Сводный", в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru