Excel-vba: получить выбранную ячейку в формуле ячейки, используя пользовательскую функцию (UDF) - PullRequest
0 голосов
/ 26 апреля 2018

Я пробовал очевидный код, но он не работает.

Function SelectedRange(Optional ShiftRow As Long = 0, Optional ShiftColumn As Long = 0) As Range
    Set SelectedRange = Selection.Offset(ShiftRow, ShiftColumn)
End Function

Выводом всегда является значение ячейки с формулой (более или менее ShiftRow и ShiftColumn), даже после этого я выбираю другие ячейки и вручную пересчитываю весь лист.
Что я не так сделал?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Приложение к ответу @ Gary's Student, основанное на комментариях к вопросу: при нажатии на другую ячейку в рабочей книге этот код найдет все ячейки с SelectedRange в формуле и вычислит эти ячейки:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rTMP As Range, sTMP As String
    Set rTMP = Me.Cells.Find("SelectedRange", Me.Cells(1, 1), xlFormulas, xlPart)
    If Not rTMP Is Nothing Then
        sTMP = rTMP.Address
        While Not rTMP Is Nothing
            rTMP.Calculate
            Set rTMP = Me.Cells.FindNext
            If rTMP.Address = sTMP Then Set rTMP = Nothing
        Wend
    End If
End Sub
0 голосов
/ 26 апреля 2018

Ваш код будет работать в пределах Sub , а не ячейки рабочего листа:

Function SelectedRange(Optional ShiftRow As Long = 0, Optional ShiftColumn As Long = 0) As Range
    Set SelectedRange = Selection.Offset(ShiftRow, ShiftColumn)
End Function

Sub MAIN()
    Dim r As Range
    Range("B9").Select
    Set r = SelectedRange(1, 1)
    MsgBox r.Address
End Sub

enter image description here

Чтобы использовать в ячейке листа, передайте обратно адрес выбранных ячеек:

Function SelectedRange2(Optional ShiftRow As Long = 0, Optional ShiftColumn As Long = 0) As String
    Application.Volatile
    SelectedRange2 = Selection.Offset(ShiftRow, ShiftColumn).Address(0, 0)
End Function

Сначала нажмите на ячейку (и) и нажмите F9 , чтобы форсировать расчет:

enter image description here

...