Обращение к рабочим листам Excel из кода VBA. Переименование листов, скрытие и отображение с помощью кода VBA Excel. Свойства Worksheets.Name и Worksheets.Visible.
Обращение к рабочим листам
Рабочий лист (Worksheet) принадлежит коллекции всех рабочих листов (Worksheets) книги Excel. Обратиться к листу можно как к элементу коллекции и, напрямую, по его уникальному имени.
Откройте редактор VBA и обратите внимание на вашу книгу в проводнике, где уникальные имена листов указаны без скобок, а в скобках — имена листов, отображаемые на ярлычках в открытой книге Excel. Уникальные имена листов отсортированы по алфавиту и их расположение по порядку не будет соответствовать их индексам (номерам), если листы перемещались по отношению друг к другу. Индексы листов смотрите по порядку расположения ярлычков в открытой книге. Переместили листы — изменились их индексы.
Обращение к рабочему листу в коде VBA Excel:
‘По уникальному имени УникИмяЛиста ‘По индексу Worksheets(N) ‘По имени листа на ярлычке Worksheets(«Имя листа») |
- УникИмяЛиста — уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить его невозможно.
- N — индекс листа от 1 до количества всех листов в книге, соответствует порядковому номеру ярлычка этого листа в открытой книге Excel.
- Имя листа — имя листа, отображаемое в проводнике редактора VBA в скобках, с помощью кода VBA изменить его можно.
Количество листов в рабочей книге Excel определяется так:
‘В активной книге Worksheets.Count ‘В любой открытой книге, ‘например, в «Книга1.xlsm» Workbooks(«Книга1.xlsm»).Worksheets.Count |
Переименование листов
В VBA Excel есть некоторые особенности в наименовании листов, так как у рабочего листа есть два свойства, связанных с именем: (Name) и Name. Откройте окно «Properties» в редакторе VBA, нажав клавишу «F4», и выделите любой лист в проводнике. Вы увидите, что в окне «Properties» свойству (Name) в скобках соответствует в проводнике уникальное имя листа без скобок, а свойству Name без скобок соответствует изменяемое имя листа в скобках. Оба имени в окне «Properties» можно редактировать.
С помощью кода VBA Excel можно редактировать только имя листа Name, отображаемое на ярлычке листа и в проводнике без скобок. Для этого используется свойство рабочего листа Worksheets.Name со следующим синтаксисом:
expression.Name
где expression — переменная, представляющая собой объект Worksheet. Смена имени осуществляется путем присвоения нового значения свойству Worksheets.Name.
Допустим, у нас есть лист с уникальным именем (Name) — Лист1, индексом — 1 и именем Name — МойЛист, которое необходимо заменить на имя — Реестр.
Лист1.Name = «Реестр» Worksheets(1).Name = «Реестр» Worksheets(«МойЛист»).Name = «Реестр» |
Скрытие и отображение листов
Для скрытия и отображения рабочих листов в VBA Excel используется свойство Worksheet.Visible со следующим синтаксисом:
expression.Visible
где expression — переменная, представляющая собой объект Worksheet. Свойству Worksheet.Visible могут присваиваться следующие значения:
- False — лист становится невидимым, но он будет присутствовать в списке скрытых листов, и пользователь сможет его отобразить с помощью инструментов рабочей книги Excel.
- xlVeryHidden — лист становится супер невидимым и его не будет в списке скрытых листов, пользователь не сможет его отобразить. Актуально для Excel 2003-2016.
- True — лист становится видимым.
Аналоги присваиваемых значений:
- False = xlHidden = xlSheetHidden = 1
- xlVeryHidden = xlSheetVeryHidden = 2
- True = xlSheetVisible = -1 (константа xlVisible вызывает ошибку)
Примеры:
Лист1.Visible = xlSheetHidden Лист2.Visible = —1 Worksheets(Worksheets.Count).Visible = xlVeryHidden Worksheets(«МойЛист»).Visible = True |
Как создать, скопировать, переместить или удалить рабочий лист с помощью кода VBA Excel, смотрите в этой статье.
I would like to create an user-defined
function in Excel
that can return the current worksheet. I could use the
sheetname = ActiveSheet.Name
But the problem with this is, it works and suddenly it starts to get different sheet name. For example, instead of SHEET I LOVE YOU
it returns SHEET I HATE YOU
.
Is there anyway to fix this — or it might possible because I think it can not be static but varies?
asked Oct 11, 2013 at 16:47
user2103670user2103670
1,59110 gold badges22 silver badges24 bronze badges
0
Function MySheet()
' uncomment the below line to make it Volatile
'Application.Volatile
MySheet = Application.Caller.Worksheet.Name
End Function
This should be the function you are looking for
sapbucket
6,64514 gold badges55 silver badges94 bronze badges
answered Oct 11, 2013 at 17:03
0
This works for me.
worksheetName = ActiveSheet.Name
answered Oct 17, 2017 at 19:20
mobermemoberme
6597 silver badges13 bronze badges
2
Sub FnGetSheetsName()
Dim mainworkBook As Workbook
Set mainworkBook = ActiveWorkbook
For i = 1 To mainworkBook.Sheets.Count
'Either we can put all names in an array , here we are printing all the names in Sheet 2
mainworkBook.Sheets("Sheet2").Range("A" & i) = mainworkBook.Sheets(i).Name
Next i
End Sub
TylerH
20.6k64 gold badges76 silver badges97 bronze badges
answered Nov 14, 2015 at 8:22
josefjosef
8449 silver badges8 bronze badges
Extend Code for Show Selected Sheet(s) [ one or more sheets].
Sub Show_SelectSheet()
For Each xSheet In ThisWorkbook.Worksheets
For Each xSelectSheet In ActiveWindow.SelectedSheets
If xSheet.Name = xSelectSheet.Name Then
'=== Show Selected Sheet ===
GoTo xNext_SelectSheet
End If
Next xSelectSheet
xSheet.Visible = False
xNext_SelectSheet:
Next xSheet
MsgBox "Show Selected Sheet(s) Completed !!!"
end sub
answered Jun 12, 2019 at 8:36
You can use below code to get the Active Sheet name and change it to yours preferred name.
Sub ChangeSheetName()
Dim shName As String
Dim currentName As String
currentName = ActiveSheet.Name
shName = InputBox("What name you want to give for your sheet")
ThisWorkbook.Sheets(currentName).Name = shName
End Sub
answered Oct 24, 2015 at 10:04
i need to change the sheet name by the name of the file was opened
Sub Get_Data_From_File5()
Dim FileToOpen As Variant
Dim OpenBook As Workbook
Dim currentName As String
currentName = ActiveSheet.Name
Application.ScreenUpdating = False
FileToOpen = Application.GetOpenFilename(Title:="Browse for your File & Import Range", FileFilter:="Excel Files (*.csv*),*csv*")
If FileToOpen <> False Then
Set OpenBook = Application.Workbooks.Open(FileToOpen)
OpenBook.Sheets(1).Range("A1:g5000").Copy
ThisWorkbook.Worksheets(currentName).Range("Aw1:bc5000").PasteSpecial xlPasteValues
OpenBook.Close False
End If
Application.ScreenUpdating = True
End Sub
Ian Campbell
23k14 gold badges35 silver badges57 bronze badges
answered Dec 27, 2020 at 20:37
Узнать имя активного листа |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
39 / 14 / 1 Регистрация: 11.05.2010 Сообщений: 139 |
|
1 |
|
18.04.2011, 22:45. Показов 63098. Ответов 5
Нужно получить имя первого листа в книге (всего в книге предполагается 2 листа) и записать его в строковую переменную.
0 |
Vlanib Частенько бываю 749 / 330 / 42 Регистрация: 20.06.2007 Сообщений: 854 |
||||
19.04.2011, 05:31 |
2 |
|||
Ну так а в чем трудность то?
1 |
39 / 14 / 1 Регистрация: 11.05.2010 Сообщений: 139 |
|
19.04.2011, 13:29 [ТС] |
3 |
ну вообщем-то имя листа должно быть произвольным. попробую так.
0 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
19.04.2011, 18:43 |
4 |
ну вообщем-то имя листа должно быть произвольным. попробую так. Вы про это: sName = , ну так меняйте, на
0 |
39 / 14 / 1 Регистрация: 11.05.2010 Сообщений: 139 |
|
19.04.2011, 22:58 [ТС] |
5 |
Вы про это: sName = , ну так меняйте, на тут другое я подразумевал, а именно лист, имя которого нужно получить, может оказаться вовсе не №1, а хоть 99, в результате разных долгих манипуляций с последними.
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
20.04.2011, 01:52 |
6 |
(всего в книге предполагается 2 листа) в результате разных долгих манипуляций с последними. В книге всё-равно будет
0 |
Werty Пользователь Сообщений: 227 |
Здравствуйте! Ура! Новое оформление! Начинка надеюсь осталась лучше Задача. С уважением, Спокойствие — величайшее проявление силы. |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
ActiveSheet.Name? P.S. Файл не смотрел Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Werty Пользователь Сообщений: 227 |
Здравствуйте, The_Prist! Этот метод не подходит, поскольку пользователь может выбрать любой лист. Спокойствие — величайшее проявление силы. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Прикольно: |
Kuzmich Пользователь Сообщений: 7998 |
Если вы выбрали лист, то он и будет активным |
Werty Пользователь Сообщений: 227 |
Здравствуйте, Юрий М! Дело в том, что пользователь, находясь на листе «Лист1», может выделить диапазон на листе с именем «Лист100». Я приложил файл поскольку не могу по другому объяснить ситуацию. С уважением, Спокойствие — величайшее проявление силы. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#7 21.01.2013 20:29:27
Не может — для этого нужно сначала выделить Лист100. |
||
Werty Пользователь Сообщений: 227 |
Может … сотрите файл. Буду рад более простому варианту реализации. Спокойствие — величайшее проявление силы. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Отбой! Выделить с помощью InputBox? |
Werty Пользователь Сообщений: 227 |
#10 21.01.2013 20:32:45 не понял …
Изменено: Werty — 22.01.2013 01:35:49 Спокойствие — величайшее проявление силы. |
||
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
MsgBox «Вы указали диапазон ячеек на литсе с именем » & Name.Worksheet.Name, 64, «Сообщение» |
Werty Пользователь Сообщений: 227 |
Да, классно Работает. А как? Спокойствие — величайшее проявление силы. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Что как? Нормально работает )) Только там нужно подправить сообщение: литсе=листе |
Werty Пользователь Сообщений: 227 |
Это да, подправлю. Спокойствие — величайшее проявление силы. |
Werty Пользователь Сообщений: 227 |
Да, получается есть … Range(«A1»).Worksheet.Name Благодарю Вас, Юрий М! С уважением, Спокойствие — величайшее проявление силы. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
В общих чертах верно, только пару замечаний: |
Werty Пользователь Сообщений: 227 |
Согласен с Вами. В рабочем фале переменные сделаны по Вашим рекомендациям Спасибо Вам Юрий М за то что Вы есть! С уважением, Спокойствие — величайшее проявление силы. |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Вообще есть еще более явный способ получить имя листа для диапазона, полученного данным образом: P.S. Посоветовал бы сразу задавать вопрос нормально и понятно не только Вам, но и другим участникам форума. Имя листа выделенного и листа для диапазона, полученного через Inputbox это разные вещи. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#19 21.01.2013 21:56:11 А я и забыл про родителя )) |