Excel vba:使用用户定义函数(UDF)获取单元格公式中的选定单元格

Excel vba:使用用户定义函数(UDF)获取单元格公式中的选定单元格,vba,excel,user-defined-functions,Vba,Excel,User Defined Functions,我尝试了一个明显的代码,但它不起作用 Function SelectedRange(Optional ShiftRow As Long = 0, Optional ShiftColumn As Long = 0) As Range Set SelectedRange = Selection.Offset(ShiftRow, ShiftColumn) End Function 输出始终是单元格的值,带有或多或少的ShiftRow和ShiftColumn公式,即使在我选择其他单元格并手动重

我尝试了一个明显的代码,但它不起作用

Function SelectedRange(Optional ShiftRow As Long = 0, Optional ShiftColumn As Long = 0) As Range
    Set SelectedRange = Selection.Offset(ShiftRow, ShiftColumn)
End Function
输出始终是单元格的值,带有或多或少的ShiftRow和ShiftColumn公式,即使在我选择其他单元格并手动重新计算整个工作表之后也是如此。
我做错了什么?

您的代码将在子单元中工作,而不是在工作表单元格中工作:

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
要在工作表单元格内使用,请传回选定单元格的地址:

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以强制计算:


@Gary学生答案的附录,基于对问题的评论:当您单击工作簿中的其他单元格时,此代码将在公式中找到任何具有选定范围的单元格,并计算这些单元格:

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

假设函数的参数不变,Excel不知道需要重新计算结果值。要强制重新计算值,您需要使用Application.VolatileNote告诉函数为volatile,选择单元格不需要重新计算,因此,即使使用Application.Volatile,您的单元格也不会更新,除非您强制重新计算或修改其他内容。使用Application.Volatile,只有当我按F9键时,单元格才会成功重新计算。正如我所说,选择单元格不会强制重新计算,因此只有当另一个单元格值更改时,该值才会更改,或者,您可以使用F9或其他方式强制重新计算始终可以添加应用程序。如果需要,请在SelectionChange事件中进行计算。如果他希望获得与所选单元格相同的显示值,他需要返回单元格引用,而不是单元格地址。这也适用于其他工作表!伟大的再次感谢!