Страницы: 1
RSS
Активировать лист по названию (Caption) кнопки, vba
 
Доброго времени суток. Есть книга с 4-мя листами. На первом листе макросом во второй колонке (B) вписываются название листов за исключением первого листа:

Код
Option Explicit

Private Sub Workbook_Open()
    Dim i           As Long
    Application.ScreenUpdating = False
    ThisWorkbook.Worksheets("Sheet1").Range("B2:B" & ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row).ClearContents

    For i = 1 To Sheets.Count

        If ThisWorkbook.Sheets(i).Name <> "Sheet1" Then
            Application.DisplayAlerts = False
            ThisWorkbook.Worksheets("Sheet1").Cells(i, 2) = Sheets(i).Name
            Application.DisplayAlerts = True
        End If

    Next

    Application.ScreenUpdating = True
End Sub


Далее, при при активации первого листа (или переходе с другого листа) создаются кнопки не ActiveX Control:

Код
Option Explicit

Private Sub Worksheet_Activate()
    Dim i As Long, iRow As Long
    Dim t           As Range
    Dim btn         As Button
    iRow = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row
    Application.ScreenUpdating = False
    ActiveSheet.Buttons.Delete

    For i = 2 To iRow
        Set t = ActiveSheet.Range(Cells(i, 3), Cells(i, 3))
        Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height)

        With btn
            .OnAction = "btnS" & i
            .Caption = ActiveSheet.Cells(i, 2).Text
            .Name = "CommandButton" & i
        End With

    Next i

    Application.ScreenUpdating = True
End Sub


Название (Caption) берётся из ячеек колонки B . OnAction макрос который должен активировать лист.
Вопрос, как при нажатие на любую из этих кнопок перейти к соответствующему листу взятого из название кнопки ?
Знаю что можно отдельно для каждой кнопки написать макрос типа: ThisWorkbook.Worksheets("Sheet2").Activate и так далее... Но планируется наличие свыше 15-ти листов в книге соответственно и кнопок будет такое же количество и писать столько кода для каждой кнопки для активации нужных листов не хочется. Файл пример прикладываю как есть.
Спасибо всем!
 
делайте не много макросов
Код
        With btn
            .OnAction = "btnS" & i

а один
Код
        With btn
            .OnAction = "btn"

а в нем
Код
Sub btn()
ThisWorkbook.Worksheets(Activesheet.Shapes(Application.Caller).Caption).Activate
End Sub
По вопросам из тем форума, личку не читаю.
 
Чуть изменил код БМВ. У меня сработало так.
Код
Sub GetControlName()
    ThisWorkbook.Worksheets(ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Text).Activate
End Sub
Изменено: asesja - 16.01.2023 00:21:22
 
БМВ, Спасибо вам! Но Ошибку выдал в 2-й строке вашего кода: Run-time error '438': Object doesh't support this property or method
Скрины ниже прикрепляю.

asesja, Ваш код отрабатывает как и хотелось мне. Спасибо вам Большое.
Оставлю здесь в теме файл пример с готовым результатом, может кому пригодиться.

Всем Спасибо!
Изменено: MikeVol - 16.01.2023 00:31:21
 
Цитата
MikeVol написал:
Но Ошибку выдал
да, пропустил то что исправил asesja.
По вопросам из тем форума, личку не читаю.
 
БМВ, Спасибо вам!
Страницы: 1
Читают тему
Наверх