Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/189: Рейтинг темы: голосов - 189, средняя оценка - 4.55
1018 / 122 / 2
Регистрация: 26.08.2011
Сообщений: 1,177
Записей в блоге: 2
1

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

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

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

что-то типа

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

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

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

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

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

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

23
Заблокирован
09.07.2012, 13:50 2
Можно с Index`ом попробовать (если я задачу понял правильно)?
Visual Basic
1
2
3
4
dim id_sheet as integer
id_sheet=ActiveSheet.Index
'а далее
Worksheets(id_sheet).Activate
2
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
09.07.2012, 13:55 3
у листа есть неизменяемое (read-only) свойство CodeName.
но обращаться к листу, зная его CodeName - довольно хлопотно.
1
1018 / 122 / 2
Регистрация: 26.08.2011
Сообщений: 1,177
Записей в блоге: 2
09.07.2012, 14:58  [ТС] 4
а index не меняется, если лист относительно других листов поменяет свое положение?
у меня листы тасуются в ходе работы пользователем (мной, лентяем), как колода карт блин....

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

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

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

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

Решение

попробую...

у листа рабочей книги (объекты 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
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
10.07.2012, 00:03 13
Такое великолепное описание, почти мини-статья.
Даже сохраню ссылку для других, чтобы не объяснять.

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

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

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

Решение

Цитата Сообщение от 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
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
10.07.2012, 08:35 17
спасибо за поправку.
хотя странно выглядит - sheets являются объектами книги, а их свойство codename меняется только через vbcomponents()...

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

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

Цитата Сообщение от kuklp Посмотреть сообщение
А какой бы смысл был в такой безопасности?
никакого. но это ничего не доказывает
ээээ.... а вот как-нибудь... программно вызвать это диалоговое окошко и потом через SendKeys послать нужный набор Tab'ов и Enter'ов?.. нельзя?
(я вдруг обнаружил в себе желание стать хакером )
0
1702 / 189 / 19
Регистрация: 20.11.2011
Сообщений: 281
10.07.2012, 09:01 20
Дерзай, авось получится:-)
0
10.07.2012, 09:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2012, 09:01
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru