Vba excel имя листа в книге

Обращение к рабочим листам 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?

Community's user avatar

asked Oct 11, 2013 at 16:47

user2103670's user avatar

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's user avatar

sapbucket

6,64514 gold badges55 silver badges94 bronze badges

answered Oct 11, 2013 at 17:03

mucio's user avatar

0

This works for me.

worksheetName = ActiveSheet.Name  

answered Oct 17, 2017 at 19:20

moberme's user avatar

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's user avatar

TylerH

20.6k64 gold badges76 silver badges97 bronze badges

answered Nov 14, 2015 at 8:22

josef's user avatar

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

ChaCha CJ Rune's user avatar

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

Rohit Pal's user avatar

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's user avatar

Ian Campbell

23k14 gold badges35 silver badges57 bronze badges

answered Dec 27, 2020 at 20:37

user14898005's user avatar

Узнать имя активного листа

lapin9126

Дата: Пятница, 06.01.2017, 18:35 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Здравствуйте, с наступающим. На данном форуме нашёл тему: Узнать имя активной таблицы (Макросы/Sub).
в которой предложено решение следующим макросом

Или так, если нужно это имя дальше использовать:
Sub NameTable()
For Each obj In ActiveSheet.ListObjects
If obj.Active Then nameTbl = obj.Name: Exit For
Next obj
Debug.Print nameTbl
End Sub

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

Сообщение отредактировал lapin9126Пятница, 06.01.2017, 18:36

 

Ответить

Pelena

Дата: Пятница, 06.01.2017, 18:43 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
[vba][/vba]
не вариант?


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

lapin9126

Дата: Пятница, 06.01.2017, 18:48 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Пробовал, в моём случае не подходит.

 

Ответить

Udik

Дата: Пятница, 06.01.2017, 19:07 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 1588


Репутация:

192

±

Замечаний:
0% ±


Excel 2016 х 64

в моём случае не подходит

Везде работает а у Вас нет, тогда показывайте файл где не работает.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com

 

Ответить

lapin9126

Дата: Пятница, 06.01.2017, 19:10 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

[vba]

Код

Sub Сортировка_2()
ActiveWorkbook.CheckCompatibility = False ‘ отменяем проверку совместимости
‘—————————————————————————-
    Dim sName, obj As String
    sName = ActiveWorkbook.ActiveSheet.Name ‘ имя активного листа
‘—————————————————————————-
    For Each obj In sName.ListObjects ‘ получение имя активной таблицы
        If obj.Active Then nameTbl = obj.Name: Exit For
    Next obj
    Debug.Print nameTbl
‘—————————————————————————-
ActiveWorkbook.sName.ListObjects(obj).Sort. _
        SortFields.Clear
    ActiveWorkbook.sName.ListObjects(obj).Sort. _
        SortFields.Add Key:=Range(«obj[Group]»), SortOn:= _
        xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        «КУПЛЮ :,ПРОДАМ :,АРЕНДА :,НЕДВИЖИМОСТЬ :,ТРАНСПОРТ :,УСЛУГИ :,РАБОТА :,РАЗНОЕ :» _
        , DataOption:=xlSortNormal
    With ActiveWorkbook.sName.ListObjects.obj.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

[/vba]

 

Ответить

Udik

Дата: Пятница, 06.01.2017, 19:25 |
Сообщение № 6

Группа: Друзья

Ранг: Старожил

Сообщений: 1588


Репутация:

192

±

Замечаний:
0% ±


Excel 2016 х 64

Нормально имя устанавливается в sName, а ругается на то, что obj как String объявлена. Для For Each тип должен быть объект
Я конечно весь код не прогонял, но вот эта запись
ActiveWorkbook.sName. странноватая, должно быть как-то так ActiveWorkbook.worksheets(sName).


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com

Сообщение отредактировал UdikПятница, 06.01.2017, 19:31

 

Ответить

lapin9126

Дата: Пятница, 06.01.2017, 19:33 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Спасибо, придётся создавать новую тему, чтобы не получить предупреждение, за второй вопрос в этой теме. :(

 

Ответить

Wasilich

Дата: Пятница, 06.01.2017, 19:36 |
Сообщение № 8

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

Новогодние странности. :) Если по теме, проверьте код:
[vba]

Код

Sub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub

[/vba]

Сообщение отредактировал WasilichПятница, 06.01.2017, 19:40

 

Ответить

lapin9126

Дата: Пятница, 06.01.2017, 19:39 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

S
ub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub

Макрос рабочий имя определяет. Но как его прикрутить к моему случаю?

 

Ответить

Wasilich

Дата: Пятница, 06.01.2017, 19:52 |
Сообщение № 10

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

Так ведь определяет же!
[vba]

Код

Sub naimlist()
  Dim sName$
  sName = ActiveWorkbook.ActiveSheet.Name ‘ имя активного листа
  MsgBox sName
End Sub

[/vba] А дальше, Ваш код не по теме.

Сообщение отредактировал WasilichПятница, 06.01.2017, 20:14

 

Ответить

nilem

Дата: Пятница, 06.01.2017, 19:56 |
Сообщение № 11

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

а вот так не подойдет?:
[vba]

Код

Sub Сортировка_2()
With ActiveSheet.ListObjects(1)
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=.Range.Columns(9), SortOn:= _
                         xlSortOnValues, Order:=xlAscending, CustomOrder:= _
                         «КУПЛЮ :,ПРОДАМ :,АРЕНДА :,НЕДВИЖИМОСТЬ :,ТРАНСПОРТ :,УСЛУГИ :,РАБОТА :,РАЗНОЕ :» _
                         , DataOption:=xlSortNormal
    With .Sort
        .Header = xlYes
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End With
End Sub

[/vba]


Яндекс.Деньги 4100159601573

 

Ответить

lapin9126

Дата: Пятница, 06.01.2017, 20:03 |
Сообщение № 12

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

nilem, Спасибо то что нужно, «Краткость сестра таланта» hands

 

Ответить

Wasilich

Дата: Пятница, 06.01.2017, 20:13 |
Сообщение № 13

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

[offtop]Короче, тема не в теме.
Хорошо что nilem экстрасенс. :D [/offtop]

 

Ответить

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

Ну так а в чем трудность то?

Visual Basic
1
sName = Activeworkbook.Sheets(1).Name



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

Цитата
Сообщение от HDR
Посмотреть сообщение

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

Вы про это: 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 листа)

в результате разных долгих манипуляций с последними.

В книге всё-равно будет
Sheets(1) это лист стоящий первым слева и ессно
Sheets(2) справа от него



0



 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Здравствуйте!

Ура! Новое оформление! Начинка надеюсь осталась лучше  :)

Задача.
Есть книга с любым кол-вом листов.
Пользователь выделяет любой нужный ему лист.
Вопрос.
Как узнать имя выделенного листа?

С уважением,
Василий.

Спокойствие — величайшее проявление силы.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

ActiveSheet.Name?

P.S. Файл не смотрел

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Здравствуйте, The_Prist!

Этот метод не подходит, поскольку пользователь может выбрать любой лист.

Спокойствие — величайшее проявление силы.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Прикольно:
1. Пользователь выделяет любой нужный ему лист.
2. не подходит, поскольку пользователь может выбрать любой лист.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Если вы выбрали лист, то он и будет активным

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Здравствуйте, Юрий М!

Дело в том, что пользователь, находясь на листе «Лист1», может выделить диапазон на листе с именем «Лист100». Я приложил файл поскольку не могу по другому объяснить ситуацию.
Прошу Вас поправить меня на примере прилагаемого файла или любым другим удобным для Вас способом.

С уважением,
Василий.

Спокойствие — величайшее проявление силы.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#7

21.01.2013 20:29:27

Цитата
Werty пишет:
Дело в том, что пользователь, находясь на листе «Лист1», может выделить диапазон на листе с именем «Лист100»

Не может — для этого нужно сначала выделить Лист100.

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Может … сотрите файл. Буду рад более простому варианту реализации.

Спокойствие — величайшее проявление силы.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Отбой! Выделить с помощью InputBox?

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

#10

21.01.2013 20:32:45

не понял …

Код
Sub Пример()
Dim Name As Range
Dim scName 'As Range

On Error Resume Next
 Set Name = Application.InputBox( _
 Prompt:="Укажите любой диапазон ячеек на любом листе!", _
 Title:="Сообщение", _
 Default:=ActiveSheet.Name, _
 Type:=  8)  
scName = ActiveSheet.Name
 On Error GoTo 0

 'если действие было отменено
 If Name Is Nothing Then
 MsgBox "Отмена действия", 64, "Сообщение": Exit Sub
 Else
 MsgBox "Вы указали диапазон ячеек на литсе с именем " & scName, 64, "Сообщение"
 End If
End Sub

Изменено: Werty22.01.2013 01:35:49

Спокойствие — величайшее проявление силы.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

MsgBox «Вы указали диапазон ячеек на литсе с именем » & Name.Worksheet.Name, 64, «Сообщение»

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Да, классно  :)  Работает. А как?

Спокойствие — величайшее проявление силы.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Что как? Нормально работает )) Только там нужно подправить сообщение: литсе=листе :)

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Это да, подправлю.
А так получается что у диапазона есть свойство Лист, у которого есть свойство Имя …. т.е. от ячейки идём к название листа к которому эта ячейка относится. Верно?

Спокойствие — величайшее проявление силы.

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Да, получается есть … Range(«A1»).Worksheet.Name

Благодарю Вас, Юрий М!

С уважением,
ПАХОМ

Спокойствие — величайшее проявление силы.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

В общих чертах верно, только пару замечаний:
1. Не присваивайте переменным подобные имена (Name, Address…). Могут случиться неприятности.
2. В Вашем случае с Type:=8 — тип переменной будет Range — диапазон. А, следовательно, есть резон дать переменной адекватное имя. Например, MyRange, Rng, и т.п.

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Согласен с Вами. В рабочем фале переменные сделаны по Вашим рекомендациям  :)  
Просто когда готовил пример спешил и забыл про них (привычка пока слабовата наверное).

Спасибо Вам Юрий М за то что Вы есть!  :)  
И всем остальным участникам  :)

С уважением,
ПАХОМ

Спокойствие — величайшее проявление силы.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Вообще есть еще более явный способ получить имя листа для диапазона, полученного данным образом:
Name.Parent.Name

P.S. Посоветовал бы сразу задавать вопрос нормально и понятно не только Вам, но и другим участникам форума. Имя листа выделенного и листа для диапазона, полученного через Inputbox это разные вещи.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#19

21.01.2013 21:56:11

А я и забыл про родителя ))

Like this post? Please share to your friends:
  • Vba excel защитить все листы
  • Vba excel именованный диапазон в массив
  • Vba excel изменить таблицу
  • Vba excel защита ячейки
  • Vba excel имена открытых книг