Вы не говорите, какая у вас кнопка, поэтому я привожу пару примеров.
Один фрагмент кода, который является общим во всех примерах, - WorkSheetExists
, который проверяет, соответствует ли имя листа рабочей таблице.
Public Function WorkSheetExists(SheetName As String) As Boolean
Dim wrkSht As Worksheet
On Error Resume Next
Set wrkSht = Worksheets(SheetName)
WorkSheetExists = (Err.Number = 0)
Set wrkSht = Nothing
On Error GoTo 0
End Function
Далее следуют три способа вызова процедуры OfficeSht
.
Если ваши кнопки - кнопка ActiveX и находятся в столбце B, вы можете использовать:
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
OfficeSht Me.Shapes("CommandButton1").TopLeftCell
End Sub
Этот код возвращает ссылку на верхнюю левую ячейку, в которой находится ваша кнопка - при условии, что ваше имя листаодна клетка слева от этого.
Второй способ - использование кнопки «Форма».
Public Sub Button_Click()
OfficeSht Me.Shapes(Application.Caller).TopLeftCell
End Sub
Опять же, он возвращает ссылку на верхнюю левую ячейку, в которой находится кнопка. Когда вы добавляете кнопку, просто назначьте ее для процедуры Button_Click
.
Третий способ предполагает, что ваша кнопка на самом деле представляет собой ячейку, отформатированную в виде кнопки, или если вы просто хотите дважды щелкнуть имя листа в столбце A и покончить с наличием кнопки в столбцеB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
OfficeSht Target
End Sub
Наконец, ваш код для выбора ячейки D5 (строка 5, столбец 4 - R5C4).
Если вы щелкаете, или указанная ячейка находится в столбце B:
Public Sub OfficeSht(ByVal Target As Range)
Dim rLastCell As Range
Dim rDataRange As Range
Set rLastCell = Cells(Rows.Count, 1).End(xlUp)
Set rDataRange = Range("A1", rLastCell)
If Not Intersect(Target, rDataRange.Offset(, 1)) Is Nothing Then
If WorkSheetExists(Target.Offset(, -1).Value) Then
Application.Goto "'" & Target.Offset(, -1).Value & "'!R5C4"
End If
End If
End Sub
Если вы щелкаете, или указанная ячейка находится в столбце A:
Public Sub OfficeSht(ByVal Target As Range)
Dim rLastCell As Range
Dim rDataRange As Range
Set rLastCell = Cells(Rows.Count, 1).End(xlUp)
Set rDataRange = Range("A1", rLastCell)
If Not Intersect(Target, rDataRange) Is Nothing Then
If WorkSheetExists(Target.Value) Then
Application.Goto "'" & Target.Value & "'!R5C4"
End If
End If
End Sub
Возможно, там немного вафлялся ....:)