Excel vba как узнать какой лист активный
Необходимо программное создание ссылки на лист, имя листа заранее не известно. ActiveSheet.Hyperlinks.Add не позволяет передавать имя листа в качестве переменной, т. е. требует постоянное имя листа. Буду очень признателен, с уважением, Олег!
Originally posted by DKef
Необходимо программное создание ссылки на лист, имя листа заранее не известно. ActiveSheet.Hyperlinks.Add не позволяет передавать имя листа в качестве переменной, т. е. требует постоянное имя листа. Буду очень признателен, с уважением, Олег!
По-моему, в Excel листы имеют не только имена, но и номера. Ими воспользоваться не удается?
Сам я ими никогда не пользовался и готовых решений пока нет.
По-моему, в Excel листы имеют не только имена, но и номера. Ими воспользоваться не удается?
Сам я ими никогда не пользовался и готовых решений пока нет.
Однако пробовал я с номерами листов, но просто формат ActiveSheet.Hyperlinks.Add SubAddress:="Имя_Листа!Имя_Ячейки" сам по себе предусматривает использование имя листа, а используя номер он добавлять-то ее добавляет, но при клике на нее грит: "Неверная ссылка" :((( Может можно добавить какой-нить другой командой?!
Однако пробовал я с номерами листов, но просто формат ActiveSheet.Hyperlinks.Add SubAddress:="Имя_Листа!Имя_Ячейки" сам по себе предусматривает использование имя листа, а используя номер он добавлять-то ее добавляет, но при клике на нее грит: "Неверная ссылка" :((( Может можно добавить какой-нить другой командой?!
Я так понял, что вся проблема в том, чтобы получить в программе имя листа. Как это сделать, зависит от того, как именно ты определяешь тот лист, на который ссылка. Если по номеру в книге (от левого края), то Worksheets(2).Name, например, возвращает имя второго листа. Если у тебя есть ссылка на ячейку с этого листа (объектная переменная, например, d), то имя содержащего ее листа надо получать при помощи d.Parent.Name
Если у тебя есть в книге конкретный лист, но юзер может его переименовать или переставить в другое место, то делай так: у каждого листа помимо Excel-имени (.Name) есть еще VisualBasic-имя (.CodeName)
Его можно менять только в окне VBA. Выбираешь для него какое-нибудь имя, например, "MyList", называешь соответственно в окне VBA, и потом при помощи MyList.Name получаешь то имя, которое он носит в данный момент в Excel.
Если ничего из вышесказанного тебе не подходит, объясни на какой лист ты хочешь сделать ссылку (в смысле, как определить что это за лист)
Я так понял, что вся проблема в том, чтобы получить в программе имя листа. Как это сделать, зависит от того, как именно ты определяешь тот лист, на который ссылка. Если по номеру в книге (от левого края), то Worksheets(2).Name, например, возвращает имя второго листа. Если у тебя есть ссылка на ячейку с этого листа (объектная переменная, например, d), то имя содержащего ее листа надо получать при помощи d.Parent.Name
Если у тебя есть в книге конкретный лист, но юзер может его переименовать или переставить в другое место, то делай так: у каждого листа помимо Excel-имени (.Name) есть еще VisualBasic-имя (.CodeName)
Его можно менять только в окне VBA. Выбираешь для него какое-нибудь имя, например, "MyList", называешь соответственно в окне VBA, и потом при помощи MyList.Name получаешь то имя, которое он носит в данный момент в Excel.
Если ничего из вышесказанного тебе не подходит, объясни на какой лист ты хочешь сделать ссылку (в смысле, как определить что это за лист)
В общем, задача поставлена так:
Есть книга, в которой отдельный лист - это контракт, который добавляется только по нажатию моей кнопки - шаблон будущего контракта (иначе добавить нельзя, т.к. книга защищена);
Затем в шаблон вводится наименование компании и контракта, нажимается кнопка "Переименовать лист" - имени листа присваивается имя контракта;
Имя компании и имя контракта выносится на лист "Содержание" (для удобства навигации по базе)
И САМОЕ СТРАШНОЕ (шутка конечно ;): При появлении нового контракта я ручками прописываю ссылку на лист в "Содержании".
ВЫВОД (к чему я вообще веду): ActiveSheet.Hyperlinks.Add SubAddress позволяет обращаться к листу ТОЛЬКО по константе - имени; испоьзование переменной или номера листа вызывает ошибку типа: "Неверная ссылка".
Пожалуйста, подскажи мне идею как это сделать иначе, в смысле добавление гиперссылки
Заранее благодарен!
Добрый день! Есть такой макрос.
Windows("Приложение 1_код 39.xlsx").Activate
Sheets("ПРИЛОЖЕНИЕ 1").Select
Set c = Columns(2).Find("*", searchdirection:=xlPrevious)
If c Is Nothing Then
Cells(1, 2).Select
Else
c.Offset(1, 0).Select
End If
ActiveCell.FormulaR1C1 = "=[Книга3.xlsm]Лист1!R2C79"
iRow = Columns("B").Find(What:="*", LookIn:=xlValues, searchdirection:=xlPrevious, SearchOrder:=xlByRows).Row
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Как сделать так, чтобы он обращался не к конкретному листу "Лист1" файла "Книга3.xlsm", а просто к активному листу данного файла безотносительно его наименования?
Добрый день! Есть такой макрос.
Windows("Приложение 1_код 39.xlsx").Activate
Sheets("ПРИЛОЖЕНИЕ 1").Select
Set c = Columns(2).Find("*", searchdirection:=xlPrevious)
If c Is Nothing Then
Cells(1, 2).Select
Else
c.Offset(1, 0).Select
End If
ActiveCell.FormulaR1C1 = "=[Книга3.xlsm]Лист1!R2C79"
iRow = Columns("B").Find(What:="*", LookIn:=xlValues, searchdirection:=xlPrevious, SearchOrder:=xlByRows).Row
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Как сделать так, чтобы он обращался не к конкретному листу "Лист1" файла "Книга3.xlsm", а просто к активному листу данного файла безотносительно его наименования? Влад777
Windows("Приложение 1_код 39.xlsx").Activate
Sheets("ПРИЛОЖЕНИЕ 1").Select
Set c = Columns(2).Find("*", searchdirection:=xlPrevious)
If c Is Nothing Then
Cells(1, 2).Select
Else
c.Offset(1, 0).Select
End If
ActiveCell.FormulaR1C1 = "=[Книга3.xlsm]Лист1!R2C79"
iRow = Columns("B").Find(What:="*", LookIn:=xlValues, searchdirection:=xlPrevious, SearchOrder:=xlByRows).Row
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Как сделать так, чтобы он обращался не к конкретному листу "Лист1" файла "Книга3.xlsm", а просто к активному листу данного файла безотносительно его наименования? Автор - Влад777
Дата добавления - 01.07.2015 в 15:02
Здравствуйте, с наступающим. На данном форуме нашёл тему: Узнать имя активной таблицы (Макросы/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
Можно ли с помощью такого приёма узнать имя активного листа и использовать его дальше, в ходе выполнения макроса, который будет обращаться к имени листа. Ну о-о-о-о-о-очень нужно.
Здравствуйте, с наступающим. На данном форуме нашёл тему: Узнать имя активной таблицы (Макросы/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
Или так, если нужно это имя дальше использовать:
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:35
Везде работает а у Вас нет, тогда показывайте файл где не работает. Автор - Udik
Дата добавления - 06.01.2017 в 19:07
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
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
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
Нормально имя устанавливается в sName, а ругается на то, что obj как String объявлена. Для For Each тип должен быть объект
Я конечно весь код не прогонял, но вот эта запись
ActiveWorkbook.sName. странноватая, должно быть как-то так ActiveWorkbook.worksheets(sName).
Нормально имя устанавливается в sName, а ругается на то, что obj как String объявлена. Для For Each тип должен быть объект
Я конечно весь код не прогонял, но вот эта запись
ActiveWorkbook.sName. странноватая, должно быть как-то так ActiveWorkbook.worksheets(sName). Udik
Спасибо, придётся создавать новую тему, чтобы не получить предупреждение, за второй вопрос в этой теме.
Спасибо, придётся создавать новую тему, чтобы не получить предупреждение, за второй вопрос в этой теме. lapin9126
Sub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub
Sub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub
Sub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub
S
ub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub
S
ub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub
S
ub naimlist()
Dim ИмяАктивногоЛиста$
ИмяАктивногоЛиста = ActiveSheet.Name
MsgBox ИмяАктивногоЛиста
End Sub
Макрос рабочий имя определяет. Но как его прикрутить к моему случаю? Автор - lapin9126
Дата добавления - 06.01.2017 в 19:39
Доброго дня!
Подскажите, как можно узнать имя активной таблицы?
Пример приложил, там 2 таблицы, в каждой по автофигуре. Выполняют следующий макрос:
[vba]
Sub NameTable()
Set shp = ActiveSheet.Shapes(Application.Caller)
On Error Resume Next
ad_ = shp.TopLeftCell.Address
Range(ad_).Select
MsgBox (Table.Name) ' Как узнать название ктивной таблицы?
End Sub
Доброго дня!
Подскажите, как можно узнать имя активной таблицы?
Пример приложил, там 2 таблицы, в каждой по автофигуре. Выполняют следующий макрос:
[vba]
Sub NameTable()
Set shp = ActiveSheet.Shapes(Application.Caller)
On Error Resume Next
ad_ = shp.TopLeftCell.Address
Range(ad_).Select
MsgBox (Table.Name) ' Как узнать название ктивной таблицы?
End Sub
Sub NameTable()
Set shp = ActiveSheet.Shapes(Application.Caller)
On Error Resume Next
ad_ = shp.TopLeftCell.Address
Range(ad_).Select
MsgBox (Table.Name) ' Как узнать название ктивной таблицы?
End Sub
Sub NameTable()
Set shp = ActiveSheet.Shapes(Application.Caller)
ad_ = shp.TopLeftCell.Address
Range(ad_).Select
For Each obj In ActiveSheet.ListObjects
If obj.Active Then MsgBox obj.Name: Exit Sub
Next obj
End Sub
[/vba]
или нажмите вкладку Работа с Таблицами-Конструктор - слева в разделе Свойства будет имя таблицы.
Или так, если нужно это имя дальше использовать:
[vba]
Sub NameTable()
For Each obj In ActiveSheet.ListObjects
If obj.Active Then nameTbl = obj.Name: Exit For
Next obj
Debug.Print nameTbl
End Sub
Sub NameTable()
Set shp = ActiveSheet.Shapes(Application.Caller)
ad_ = shp.TopLeftCell.Address
Range(ad_).Select
For Each obj In ActiveSheet.ListObjects
If obj.Active Then MsgBox obj.Name: Exit Sub
Next obj
End Sub
[/vba]
или нажмите вкладку Работа с Таблицами-Конструктор - слева в разделе Свойства будет имя таблицы.
Или так, если нужно это имя дальше использовать:
[vba]
Sub NameTable()
For Each obj In ActiveSheet.ListObjects
If obj.Active Then nameTbl = obj.Name: Exit For
Next obj
Debug.Print nameTbl
End Sub
ЯД: 410013299366744 WM: R193491431804
Sub NameTable()
Set shp = ActiveSheet.Shapes(Application.Caller)
ad_ = shp.TopLeftCell.Address
Range(ad_).Select
For Each obj In ActiveSheet.ListObjects
If obj.Active Then MsgBox obj.Name: Exit Sub
Next obj
End Sub
[/vba]
или нажмите вкладку Работа с Таблицами-Конструктор - слева в разделе Свойства будет имя таблицы.
Или так, если нужно это имя дальше использовать:
[vba]
Sub NameTable()
For Each obj In ActiveSheet.ListObjects
If obj.Active Then nameTbl = obj.Name: Exit For
Next obj
Debug.Print nameTbl
End Sub
Как быстро показать активные или выбранные листы только в Excel?
Показать выбранные листы только с помощью Kutools for Excel
Показать активный лист только с VBA
Вот код VBA, который может быстро скрыть все листы, кроме активного.
1. Нажмите Alt + F11 ключи для отображения Microsoft Visual Basic для приложений окно.
2. Затем нажмите Вставить > Модули и вставьте ниже VBA в новый Модули окно.
VBA: показать только активный лист
3. Нажмите Run или нажмите F5 клавиша для выполнения VBA И теперь отображаются только активные листы, остальные скрыты.
Показать выбранные листы только с помощью Kutools for Excel
Если у вас есть Kutools for Excel установлен, вы можете быстро скрыть неактивные листы или невыделенные листы одним щелчком мыши.
После бесплатная установка Kutools for Excel, сделайте следующее:
Активизируйте лист или выберите листы, которые хотите показать, затем щелкните Кутулс > Показать спрятать > Скрыть невыбранные листы. Смотрите скриншот:
Теперь невыделенные листы скрыты.
Наконечник: Если вы хотите показать все листы, вы можете нажать Кутулс > Показать спрятать > Показать все листы. Смотрите скриншот:
Читайте также: