给定来自超链接的单元格,如何突出显示(选择)整行

时间:2019-01-10 12:38:09

标签: excel vba hyperlink

我有Sheet1和Sheet2。在Sheet1中,我有一个表,其中有一列超链接,这些超链接重定向到Sheet2中定义的单元格。我想做的是自动在Sheet2中选择了我已重定向到的单元格的整行。

我已经在Sheet2代码中尝试过此操作:

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

为给定的选定单元格选择整个行。但是,这不是一个很舒适的选择,因为它是一个永久选择,也就是说,当我要选择一列时,它会选择整个工作表。有什么更好的方法?

我认为重要的是要提到我不想更改行的格式以突出显示它们,我只想选择它们。

2 个答案:

答案 0 :(得分:1)

问题是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。

答案 1 :(得分:0)

关注超链接

要点

  • FollowHyperlink事件中,TargetHyperlink对象。
  • 如果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