Remkomplekty.ru

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

Vba excel имя листа

Excel имена листов вкладок и имена листов Visual Basic

Похоже, что Visual Basic не может ссылаться на листы в соответствии с измененными пользователем именами листов. На вкладках рабочего листа можно изменить их имена, но, похоже, Visual Basic по-прежнему считает имена рабочих листов листом 1 и т. д., несмотря на то, что вкладка книги была изменена на что-то полезное.

У меня есть это:

но я хотел бы использовать имена листов в подпрограммах Visual Basic. Лучшее, что я смог придумать так далеко, чтобы выбрать вкладку лист и Visual основные имена, которые не делают мой день. Visual Basic должен знать Sheet1, Sheet2 и т. д., имена. Как я могу связать их с именами вкладок Excel, чтобы мне не нужно было поддерживать таблицу поиска, которая меняется с каждым новым листом или переименованием вкладок листа? Заранее спасибо за ваши ответы.

9 Ответов

В объектной модели Excel лист имеет 2 различных свойства имени:

свойство Name используется для чтения / записи и содержит имя, отображаемое на вкладке лист. Это пользователь и VBA изменчиво

свойство CodeName доступно только для чтения

Вы можете ссылаться на определенный лист как Рабочие листы («Fred»).Диапазон («A1»), где Fred-свойство .Name или как Sheet1.Range(«A1»), где Sheet1-кодовое имя листа.

Это изменит имена всех объектов листа (с точки зрения редактора VBA) в соответствии с именами их листов (с точки зрения Excel):

Важно отметить, что имя объекта (кодовое имя) «(Name)» переопределяется именем свойства «Name», и поэтому на него необходимо ссылаться как на под-свойство.

На самом деле «Sheet1» объект / кодовое имя можно изменить. В VBA нажмите на Sheet1 в списке объектов Excel. В окне свойств вы можете изменить Sheet1 на say rng.

Затем вы можете ссылаться на ГСЧ как на глобальный объект, не создавая предварительно переменную. Так что debug.print rng.name работает просто отлично. Нет более листов(«rng»).имя.

В отличие от вкладки, имя объекта имеет те же ограничения, что и другие переменные (т. е. без пробелов).

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

Если это проблема, то ее следует решить с помощью ActiveWorkbook (текущая активная книга) или ThisWorkbook (книга, содержащая макрос).

Это очень простое решение (возможно, я упускаю всю суть вопроса). ActiveSheet.Name будет RETURN строкой текущего имени вкладки (и будет отражать любые будущие изменения пользователя). Я просто вызываю активный лист, устанавливаю переменную и затем использую ее в качестве объекта рабочих листов. Здесь я извлекаю данные из таблицы, чтобы создать отчет для подразделения. Этот макрос будет работать на любом листе в моей книге, который отформатирован для одного и того же фильтра (критерий и copytorange) — каждое подразделение получает свой собственный лист и может изменять критерии и обновлять с помощью этого одного макроса.

Мне пришлось прибегнуть к этому, но у этого есть проблемы с содержанием.

Существует (по крайней мере) два различных способа добраться до объекта Worksheet

  • через коллекции Sheets или Worksheets , на которые ссылается DanM
  • по неполным именам объектов

При создании новой книги с тремя листами будут существовать четыре объекта, к которым можно получить доступ с помощью неполных имен: ThisWorkbook ; Sheet1 ; Sheet2 ; Sheet3 . Это позволяет вам писать такие вещи, как это:

Хотя это может показаться полезным ярлыком, проблема возникает, когда листы переименовываются. Безусловное имя объекта остается как Sheet1 , даже если лист переименован во что-то совершенно другое.

В этом есть определенная логика, потому что:

  • имена рабочих листов не соответствуют тем же правилам, что и имена переменных
  • вы можете случайно замаскировать существующую переменную

Например (проверено в Excel 2003), создайте новый Workbook с тремя листами. Создайте два модуля. В одном модуле объявите это:

В другой модуль ставим:

Выполните это, и окно сообщения должно появиться правильно.

Теперь добавьте четвертый лист в рабочую книгу, которая создаст объект Sheet4 . Попробуйте запустить main еще раз, и на этот раз вы получите ошибку «Object does not support this property or method»

Использование кодового имени листа было ответом, который мне тоже был нужен, чтобы остановить серию падающих macros — ответ ccampj выше отражает это решение (с фотографиями экрана)

Возможно, я ошибаюсь, но вы можете открыть книгу, выбрать рабочий лист и изменить его свойство (имя) на то, что вам нужно. Это переопределяет соглашение об именовании «Sheetx». Эти имена также отображаются в Редакторе VBA.

Как это сделать вручную: 1. Выберите лист в рабочей книге (я склонен создавать шаблоны). 2. Установите его имя вкладки на все, что вам нравится («foo»). 3. Нажмите на меню разработчика (которое вы ранее включили, верно?). 4. Найдите «Properties» и нажмите на него, открывая окно свойств этого листа. 5. Самый первый элемент в алфавитном списке — это (имя), а справа от (имени) — «Sheetx».
6. Нажмите на это поле и измените его (как насчет использования «MyFav»). 7. Закройте окно свойств. 8. Перейти на визуальный элемент базовый редактор. 9. Просмотрите листы в книге, которую вы только что изменили. 10. Обратите внимание, что в объектах MicroSoft Excel отображается только что измененное имя «MyFav», а справа от него в круглых скобках-имя вкладки листа («foo»).

Вы можете изменить .CodeName программно, если хотите. Я использую имена, не относящиеся к листу,чтобы облегчить работу с шаблоном. Вы не обязаны использовать универсальное значение по умолчанию «Sheetx».

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

Я пытаюсь получить имена выбранных листов в Excel. У меня есть листы 4-5 в моем файле excel. Пользователь должен выбрать два из них, а затем мое приложение сканирует определенные столбцы и.

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

я новичок в программировании JavaScript я хочу java скрипт, чтобы найти имена листов в файле excel сценарий 1) управление загрузкой файлов в HTML 2) когда пользователь выбирает файл 3) в текстовом.

Я хочу создать метод, чтобы получить имена всех листов в книге. Моя рабочая тетрадь состоит из 7 листов. Если я хочу прочитать и сохранить имена листов в переменной excelSheets, я получаю 9 имен.

Я пытаюсь получить все имена листов в том же порядке, что и в файле Excel, в массив. В настоящее время я достигаю всего листа индивидуально, как показано ниже: var pathToExcel =.

Читать еще:  Типы данных в ms excel

У меня есть следующий код, который я использую, чтобы получить имена листов файла excel(.файлы XLSX) XSSFWorkbook workBookXlsx = new XSSFWorkbook(new FileInputStream(pathToFile));.

Как узнать скрытое имя листа excel, используя ADO(OLEDB) в C#? В моей рабочей тетради Excel есть много листов. Только один лист Excel находится в скрытом режиме. Мне нужно узнать имена спрятанных.

У меня есть один файл excel из нескольких листов с именами столбцов, значениями и именами листов. У меня есть еще один файл excel из нескольких листов с именами столбцов и названиями листов. Я хочу.

Я загрузил рабочую книгу в R и читал в листах, используя xlConnect, но мне было интересно, есть ли способ извлечь имена листов, возможно, в векторе? До сих пор мой код.

У меня есть процесс экспорта, который передает данные из моих таблиц доступа в файл Excel. Пару раз у меня были проблемы, когда процесс не генерировал один или несколько листов (1 лист = 1 таблица).

Кодовое имя листа — что это и зачем нужно? Какие плюсы и минусы?

Часто при разработке различных проектов в VBA требуется где-то хранить различные служебные данные: списки, константы(вроде путей к файлам, email-ов и т.п.). Обычно это делается на отдельных листах, которые потом делают очень скрытыми. А на листах делает еще и потому, что списки удобнее хранить именно на них, да и порой необходимо дать конечному пользователю возможность самому изменять некие данные. Например, программа должна собирать информацию с различных файлов. Но файлы могут располагаться в различных папках — зависит от того, на каком компьютере программа запускается. Или лист содержит списки артикулов, на основании которых программа отбирает некоторые файлы. И эти артикулы могут изменяться со временем. В таких случаях лист не скрывают, а оставляют на виду, чтобы пользователь сам мог прописать путь к нужным папкам и файлам, вписать нужные артикулы и т.п.
В коде к этому листу можно обращаться по имени. Предположим, лист называется «SETS». Тогда код получения данных из ячейки A2 будет выглядеть так:

Dim v v = ThisWorkbook.Sheets(«SETS»).Range(«A2»).Value

Подробнее про обращение к диапазонам можно узнать из статьи: Как обратиться к диапазону из VBA
Все бы ничего, но есть одна ложка дегтя: пользователь может случайно этот лист переименовать. Тогда обращение к листу по заранее заданному имени вызовет ошибку( 9 — Subscript out of range ). Можно пойти другим путем — обратиться к листу по его порядковому номеру. Например, наш лист «SETS» расположен вторым по порядку в книге:

Тогда код получения данных из ячейки A2 будет таким:

Dim v v = ThisWorkbook.Sheets(2).Range(«A2»).Value

Но и здесь проблема: пользователь может удалить первый лист или просто переместить наш лист «SETS» в другое место. Что опять либо вызовет ошибку 9 — Subscript out of range (если количество листов в книге меньше указанного числа. В нашем примере если в книге будет только один лист) либо запишет нам в переменную v значение из совершенно другого листа и как следствие — это будет не то значение, которое нам нужно.
Как же быть? Есть такое понятие — кодовое имя листа. Т.е. у листа есть два имени: одно отображаемое — это то, которое мы видим на ярлыке(на рисунке выше это Лист1, SETS, Лист2). И есть кодовое имя, которое не видно напрямую. Чтобы увидеть кодовое имя листа необходимо перейти в редактор Visual Basic for Application( Alt + F11 ), отобразить окно проводника проекта —ViewProject explorer(или Ctrl + R ), раскрыть папку Microsoft Excel Objects. Там мы увидим все объекты проекта VBA и их имена. Само название листов в этом окне состоит из двух частей: сначала идет кодовое имя листа, а в скобках — имя, отображаемое на ярлыке:

Где искать разобрались. Что нам это дает? Т.к. это имя просто так не найти — пользователь не сможет уже изменить его имя. А обратиться к такому листу из кода VBA проще простого — как и к любому из компонентов проекта — просто по его кодовому имени(для нашего листа «SETS» это Лист2)

Dim v v = Лист2.Range(«A2»).Value

Теперь ни переименование ярлыка, ни перемещение не вызовет ошибку. Ошибку теперь может вызвать удаление этого листа. Но это другая история.
Удаление листов можно запретить, защитив структуру книги(Рецензирование (Review)Защитить книгу (Protect workbook) )
И еще важно помнить: обращение к листу по его кодовому имени приведенным выше способом возможно исключительно внутри той книги, в которой этот лист расположен. Обратиться к нему по привычке с указанием книги уже не получится: ActiveWorkbook.Лист2.Range(«A2»).Value . Т.е. по факту нельзя обратиться к листу по кодовому имени из другой книги. Хотя в большинстве случаев это и не надо. Если уж реальная необходимость возникнет — ниже приведена функция поиска листа по его кодовому имени, которую легко можно переделать под получение отображаемого имени листа, найдя его по кодовому имени.
Чтобы самостоятельно изменить имя кодового листа, необходимо выделить этот лист в проводнике проекта -отобразить окно свойств, если оно еще не отображено(ViewProperties Window или F4 ) и просто изменить свойство Name:

Для чего переименовывать? Во-первых, не на всех ПК кириллица воспринимается нормально. Поэтому лучше в кодах использовать латиницу. Во-вторых — код будет более читаемый и наглядный, если обращение будет к объектам вроде wsSets и wsData , чем к объектам вида Лист1 , Лист2 и т.п.
Но при переименовании необходимо помнить, что кодовое имя листа не должно содержать пробелов и иных знаков препинания(кроме нижнего подчеркивания), не должно начинаться с цифр. В общем такие же требования, как и к именам макросов.

Порой необходимо проверить — есть ли лист с указанным кодовым именем. Это к слову о том, как избежать ситуации обращения к несуществующему листу, если обращение идет по кодовому имени(и при этом в проектах Вы почему-то не используете Option Explicit). Можно применить такую простенькую функцию:

‘————————————————————————————— ‘ Procedure : RenameSheetCodeName ‘ Purpose : Ищет в указанной книге лист с указанным кодовым именем ‘ wb — Книга, лист в которой необходимо найти ‘ sName — Кодовое имя листа, которое надо проверить на наличие в книге ‘————————————————————————————— Function FindSheetByCodeName(wb As Workbook, sName As String) Dim ws As Worksheet ‘цикл по всем листам For Each ws In wb.Worksheets If StrComp(ws.CodeName, sName, 1) = 0 Then ‘сравнение имени без учета регистра ‘назначаем функции возвращаемое значение FindSheetByCodeName = True Exit Function End If Next End Function

Читать еще:  Excel vba combobox additem

Проверить при этом наличие листа с кодовым именем wsSets можно так:

Sub IsShhetCodeName_Exist() If FindSheetByCodeName(ActiveWorkbook, «wsSets») = False Then MsgBox «Нет такого листа», vbCritical, «www.excel-vba.ru» End If End Sub

И вдогонку код, который поможет быстро переименовать кодовое имя листа по его отображаемому имени. Т.е. все что надо — знать имя листа, отображаемое на ярлыке. И указать новое кодовое имя:

‘————————————————————————————— ‘ Procedure : RenameSheetCodeName ‘ Purpose : Ищет в указанной книге лист с указанным именем ‘ и переименовывает кодовое имя листа на указанное ‘ wb — Объект. Книга, лист в которой необходимо переименовать ‘ sOldName — Текст. Имя листа для переименования ‘ (может быть как отображаемым на ярлыке, так и кодовым) ‘ sNewName — Новое кодовое имя листа ‘ SearchByCodeName — Если True, то лист для переименования ищется ‘ по кодовому имени листа ‘ Если False — лист ищется по отображаемому на ярлыке имени ‘————————————————————————————— Function RenameSheetCodeName(wb As Workbook, sOldName As String, sNewName As String, _ Optional SearchByCodeName As Boolean = True) Dim vbc As Object, ws As Worksheet Dim sn As String ‘проверяем, нет ли уже в книге компонета с таким именем(sNewName) On Error Resume Next Set vbc = wb.VBProject.VBComponents(sNewName) If Not vbc Is Nothing Then MsgBox «The worksheet ‘» & sNewName & «‘ is already exist», vbCritical, «www.excel-vba.ru» ‘MsgBox «Компонент с именем ‘» & sNewName & «‘ уже есть в проекте», vbCritical, «www.excel-vba.ru» Exit Function End If ‘цикл по всем листам и проверка имени For Each ws In wb.Worksheets If SearchByCodeName Then ‘если ищем по кодовому имени sn = ws.CodeName Else sn = ws.Name ‘если ищем по отображаемому имени End If If StrComp(sn, sOldName, 1) = 0 Then ‘сравнение имени без учета регистра ‘переименовываем, если имя совпадает Set vbc = wb.VBProject.VBComponents(ws.CodeName) vbc.Name = sNewName ‘назначаем функции возвращаемое значение RenameSheetCodeName = True ‘выходим из функции(нет смысла продолжать — переименовали) Exit Function End If Next End Function

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

Sub TestRename() ‘RenameSheetCodeName(ActiveWorkbook, «Sheet1», «Лист1») ‘RenameSheetCodeName(ActiveWorkbook, «Лист1», «Sheet1») If RenameSheetCodeName(ActiveWorkbook, «Sheet1», «Лист1») Then MsgBox «Кодовое имя листа переименовано», vbCritical, «www.excel-vba.ru» End If End Sub

Для кодового имени листа программно необходимо, чтобы было проставлено доверие к объектной модели проекта VBA и изменяемый проект не должен быть защищен. Подробнее читайте в статье: Что необходимо для внесения изменений в проект VBA(макросы) программно
Без этого будет невозможно программное вмешательство в проект VBA.

Скачать файл с примером функций:

Кодовое имя листа.xls (59,0 KiB, 216 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Конференция VBStreets

Весь вкус программирования!

  • Список форумовСмежные технологииVBA
  • Изменить размер шрифта
  • FAQ
  • Вход

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

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

Аэроплан » 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 и на этом вылетает. в ошибку.

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 mid(s,i,1) = «:» then mid(s,i,1)=» «
next i

Читать еще:  Vba excel добавить лист с именем

Vba excel имя листа

Поговорим про то, как в VBA обращаться к листам книги Excel.

Вариант 1

У глобального объекта Excel Application есть 2 коллекции листов: Sheets и Worksheets . Отличаются они тем, что вторая коллекция не включает в себя специальные листы макросов, которые поддерживала Excel 4.0 (на минуточку — 1992 год) во времена, когда VBA ещё не было в природе (появился в Excel 5.0). Тяжело найти эстетов, которые всё ещё пользуются такими листами с макросами, поэтому можно считать, что эти коллекции идентичны. Лично я использую коллекцию Sheets просто потому, что 5 букв лучше, чем 9.

Sheets(1).Cells(1,1)

Sheets(1) — это не первый лист, созданный в книге, а лист, который на панели ярлыков листов занимает КРАЙНЕЕ ЛЕВОЕ положение. То есть Sheets(2) будет указывать на второй слева лист на панели ярлыков. Если вам нужен конкретный лист, то ТАК ссылаться на него, как вы понимаете, плохая идея, ибо пользователь, изменив порядок следования листов, нарушит работоспособность вашей программы.

Во всех примерах я буду обращаться к ячейки A1, так как речь не о свойствах объекта Worksheet , а о том, какие есть способы получить синтаксическую конструкцию, указывающую на нужный нам лист.

Вариант 2

Sheets(«First»).Cells(1,1)

Пожалуй, такое обращение к листу наиболее популярно в народе. В скобках и кавычках мы видим пользовательское имя листа. Плохо только то, что имя листа, что называется «hard coded» (жёстко запрограммировано), что является моветоном в программировании. Ибо, если у вас в модуле конструкция Sheets(«First») встречается 100 раз, то при смене имени листа придётся делать поиск с заменой 100 констант в коде. Поэтому обычно делают иначе.

Вариант 3

Гораздо разумней добавить ещё один уровень абстракции и объявить константу, ссылающуюся на имя листа.

Public Const wsFirst = «First»

Sheets(wsFirst).Cells(1,1)

В случае смены имени вам придётся исправить ТОЛЬКО эту константу в начале модуля. Однако, если программа написана и сдана пользователю, а тот в один прекрасный момент берёт и переименовывает лист, то наш код тут же перестаёт работать, что, согласитесь, не слишком хорошо.

Вариант 4

У листа есть свойство Name , которое мы видим на ярлыке листа и которое можем менять (если не включена защита структуры книги, но сейчас не об этом), но ещё есть свойство CodeName , которое присваивается листу в момент создания, и которое пользователь сменить не может. В русской редакции офиса эти CodeName -ы формируются по принципу: Лист1 , Лист2 , Лист3 и т.д. В англоязычной версии это: Sheet1 , Sheet2 , Sheet3 , etc.

Если вы удалите лист, то его CodeName повторно не будет использовано. Так вот — VBA разпознаёт имена совпадающие с CodeName листа, как объекты типа Worksheet .

Лист1.Cells(1,1) или [Лист1].Cells(1,1)

Это отличная защита от того, что пользователь перенесёт или переименует лист. Но подобные имена ни о чём не говорят нам в процессе программирования в плане того, что располагается на листе, поэтому вы будете частенько ошибаться, путая листы. А те, кто будут потом разбираться в вашем коде, тоже спасибо вам не скажут. Поэтому я предлагаю следующую модификацию этого способа:

Вариант 5

Public wsData As Worksheet

Set wsData = Лист1

wsData.Cells(1,1)

Строку 1 размещаем в объявлениях модуля. Строку 2 размещаем в обработчике события Workbook_Open . И после этого в любом месте книги мы можем использовать объявленные переменные ( wsData , строка 3). На мой взгляд, это самый удобный и продвинутый вариант из рассмотренных.

Вариант 6

Не забываем про свойство ActiveSheet объекта Application , указывающее на активный лист книги. Если вы работаете с текущим листом, то использовать его, я считаю, оптимально.

ActiveSheet.Cells(1,1)

Вариант 7

Ну и последнее, если вам передан в подпрограмму объект типа Range, то не забываем, что ссылку на лист возвращает его свойство Worksheet .

Это всё, что я имел сказать по поводу ссылок на листы в Excel VBA 🙂

Формула номера листа и страницы в Excel

Разберем формулы номеров листов и страниц в Excel (как стандартные, так и пользовательские функции) для создания оглавления и удобной навигации по документу.

При создании оглавления отчета, книги или статьи нам важно знать не только название глав и проставить гиперссылки на них, но и их расположение в документе для того, чтобы при чтении нам было удобнее ориентироваться в содержимом документа и проще находить нужную информацию.
Добавить номера листов в оглавление можно вручную, однако в этом случае сам процесс проставления номеров может отнять достаточно большое количество времени. К тому же при изменении номера страницы одной главы поменяются номера и для всех последующих глав, поэтому такой способ нельзя назвать удобным и эффективным.

Рассмотрим варианты, которые позволят нам узнать номера листов и страниц в автоматическом режиме.
Однако прежде всего поймем в чем именно разница между листом и страницей в Excel.
Лист Excel — это таблица, состоящая из ячеек структурированная в виде данных в строках и столбцах, а страница — это представление листа при печати. Другими словами, в зависимости от настроек печати, один лист может содержать несколько страниц, поэтому задачу поиска номеров листов и страниц будем решать по отдельности.

Формула номера листа в Excel

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

Функция ЛИСТ (начиная с Excel 2013)

Синтаксис и описание функции:

ЛИСТ(значение)
Возвращает номер указанного листа.

  • Значение(необязательный аргумент) — название листа или ссылка, для которой нужно узнать номер листа.

В случае если аргумент не указан, то функция по умолчанию возвращает номер листа, где задана функция.
Рассмотрим принципы использования функции на примерах:


При работе с функцией обратите внимание, что формулы =ЛИСТ(«Лист2») и =ЛИСТ(A1) (при этом ячейка A1, например, содержит текст «Лист2») могут вернуть разные результаты, так как в первом случае аргумент представлен в виде текста (поиск листа по текстовому названию), а во втором — в виде ссылки (поиск листа по ссылающейся ячейке).

Номер листа на VBA

Для создания пользовательской функции перейдем в редактор Visual Basic (комбинация клавиш Alt + F11), далее создаем новый модуль и добавляем в него следующий код:

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