2015-11-09 10 views
5

Ich habe diesen Code-Block, der eine Schaltfläche hilft, identifizieren, welche Zeile es ist. Wenn ich jedoch die obige Zeile ausblenden, verweist die Schaltfläche auf diese ausgeblendete Zeile.Button referenziert falsche Zeile in Excel

Zum Beispiel: Wenn Sie die Taste auf Zeile 20 und ich verstecke Reihe 19, die Taste kehrt Zeile klicken 19. Wenn ich beide Reihen verstecken 19 und 18, die Taste kehrt Zeile 18.

Es ist wirklich seltsam. Hier

ist der Block, die ich verwendet, um die Schaltfläche zu erstellen:

Sub AddButtons() 
    Dim button As button 
    Application.ScreenUpdating = False 

    Dim st As Range 
    Dim sauce As Integer 

    For sauce = 10 To Range("F" & Rows.Count).End(xlUp).Row Step 1 
    Set st = ActiveSheet.Range(Cells(sauce, 11), Cells(sauce, 11)) 
    Set button = ActiveSheet.Buttons.Add(st.Left, st.Top, st.Width, st.Height) 

    With button 
     .OnAction = "GoToIssue.GoToIssue" 
     .Caption = "Go To Source" 
     .Name = "Button" & sauce 
    End With 
    Next sauce 
    Application.ScreenUpdating = True 
End Sub 

Und hier ist der Block, der die Zeile ID der Schaltfläche zurück, sobald es angeklickt wird:

Sub GoToIssue() 

    Dim b As Object 
    Dim myrow As Integer 

    Dim hunt As String 

    Set b = ActiveSheet.Buttons(Application.Caller) 
    With b.TopLeftCell 
     myrow = .Row 

    End With 


    hunt = Worksheets("Dummy").Range("F" & myrow).Value 

    'MsgBox hunt 

End Sub 

Ihre Zeit und helfen sind geschätzt.

+0

haben Sie versucht, 'BottomRightCell'? Es scheint, dass alles von der Größe der Schaltfläche und ihrer Ausdehnung abhängt. Ich habe gerade eine Reihe von Tests durchgeführt und es scheint, dass 'BottomRightCell' zuverlässiger ist, wenn 'sichtbare' Zellen angezeigt werden. –

Antwort

2

können Sie diese Funktion verwenden:

Public Function FindButtonRow(btn As Object) As Long 
    Dim cell As Excel.Range 
    '------------------------------------------------- 

    Set cell = btn.TopLeftCell 

    Do While cell.EntireRow.Hidden 
     Set cell = cell.Offset(1, 0) 
    Loop 

    FindButtonRow = cell.row 

End Function 

Es prüft, ob die Zelle durch TopLeftCell Methode zurückgegeben wird, ist nicht in ausgeblendete Zeile. Wenn dies der Fall ist, versucht die Funktion die darunter liegende Zelle und so weiter, solange sie die Zelle aus der unverdeckten Zeile findet.


Sie können es GoToIssue einfach so in die Unterroutine verwenden:

Sub GoToIssue() 

    Dim b As Object 
    Dim myrow As Integer 

    Dim hunt As String 

    Set b = ActiveSheet.Buttons(Application.Caller) 
    myrow = FindButtonRow(b) 

    hunt = Worksheets("Dummy").Range("F" & myrow).Value 

    'MsgBox hunt 

End Sub 
+0

Funktioniert wie ein Charme! Vielen Dank – Amostafa

Verwandte Themen