Как выделить (выделить) всю строку с учетом ячейки, которая идет по гиперссылке - PullRequest
0 голосов
/ 10 января 2019

У меня есть Лист1 и Лист2. В Sheet1 у меня есть таблица со столбцом гиперссылок, которые перенаправляют на определенные ячейки в Sheet2. Что я хотел бы сделать, так это автоматически выбрать всю строку ячейки в Sheet2, на которую я был перенаправлен.

Я пробовал это в коде Sheet2:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.EntireRow.Select
End Sub

, который выбирает всю строку для данной выбранной ячейки. Однако это не очень удобно, так как это постоянный выбор, и, скажем, когда я хочу выбрать столбец, он выбирает весь лист. Как лучше это сделать?

Я думаю, что важно упомянуть, что я не хочу менять формат строк, чтобы выделить их, я только хочу выбрать их.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

FollowHyperlink

Особенности

  • В событии FollowHyperlink Target является объектом Hyperlink.
  • Если свойство Address и , свойство SubAddress объекта Hyperlink отличаются от "", оно будет указывать на местоположение в другой книге .
  • Если свойство Address объекта Hyperlink равно "", то оно будет указывать на местоположение в этой книге.
  • Если дополнительно свойство SubAddress содержит , а не содержит восклицательный знак !, оно может указывать на определенное имя .
  • Если свойство SubAddress содержит с восклицательным знаком !, оно будет содержать одинарных кавычек ', если имя листа содержит пробелы .

Код

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

    Const cSheet As Variant = "Sheet2"   ' Target Worksheet Name/Index

    Dim i As Integer        ' Names Counter
    Dim strRng As String    ' Target Range Address Builder
    Dim strSheet As String  ' Target Worksheet Name Builder

    ' Check if hyperlink points to a location outside this workbook.
    If Target.Address <> "" Then Exit Sub

    ' Assign the value of Target.SubAddress to Target Range Address Builder.
    strRng = Target.SubAddress

    With ThisWorkbook ' Me.Parent

        ' Check if hyperlink points to a named range ("!").
        If InStr(strRng, "!") = 0 Then
            ' Loop through all names.
            For i = 1 To .Names.Count
                ' Compare their NAME to Target Range Address Builder.
                If .Names(i).Name = strRng Then
                    strRng = Right(.Names(i).RefersTo, Len(.Names(i).RefersTo) _
                            - 1) ' Remove "=".
                    Exit For
                End If
            Next
            If i > .Names.Count Then Exit Sub ' Name not found.
        End If

        ' Calculate worksheet name.
        strSheet = Replace(Left(strRng, InStr(strRng, "!") - 1), "'", "")
        ' Check if calculated worksheet name is equal to Target Worksheet Name.
        If strSheet <> .Worksheets(cSheet).Name Then Exit Sub
        ' Calculate the Target Range Address.
        strRng = Right(strRng, Len(strRng) - InStr(strRng, "!"))

        ' Select the entire row of Target Range.
        .Worksheets(strSheet).Range(strRng).EntireRow.Select

    End With

End Sub

Почему следующий код не всегда работает?

Option Explicit
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    ActiveCell.EntireRow.Select
End Sub
0 голосов
/ 10 января 2019

Проблема в том, что Target.EntireRow.Select запускает другое Worksheet_SelectionChange событие. Вы должны предотвратить это с помощью Application.EnableEvents = False:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.EnableEvents = False
    Target.EntireRow.Select
    Application.EnableEvents = True
End Sub

Но, возможно, вы могли бы использовать Worksheet_FollowHyperlink, который мог бы быть лучшим выбором.


Наилучшим подходом было бы изменить гиперссылку, чтобы она указывала на всю строку, а не на одну ячейку. Поэтому вместо того, чтобы указывать на A5, укажите гиперссылку на 5: 5, тогда VBA не нужна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...