【问题标题】:Excel-vba: Get the selected cell in a cell formula using a user defined function (UDF)Excel-vba:使用用户定义函数 (UDF) 获取单元格公式中的选定单元格
【发布时间】:2018-04-26 13:36:05
【问题描述】:

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

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

输出始终是带有公式的单元格的值(或多或少是 ShiftRow 和 ShiftColumn),即使之后我选择其他单元格并手动重新计算整个工作表。
我做错了什么?

【问题讨论】:

  • 鉴于函数的参数没有改变,Excel 不知道它需要重新计算结果值。要强制重新计算该值,您需要使用 Application.Volatile 告诉该函数是 volatile
  • 请注意,选择一个单元格并不需要重新计算,因此即使使用Application.Volatile,您的单元格也不会更新,除非您强制重新计算或修改其他内容。
  • with Application.Volatile 只有当我按 F9 时才能成功重新计算单元格。
  • 正如我所说,选择一个单元格不会强制重新计算(从不),因此只有在另一个单元格值更改或您强制重新计算(使用 F9 或其他方式)时,该值才会更改跨度>
  • 如果需要,您可以随时在SelectionChange 事件中添加Application.Calculate

标签: vba excel user-defined-functions


【解决方案1】:

您的代码将在 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

要在工作表单元格中使用,请传回所选单元格的地址

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

【讨论】:

  • 如果他想获得与所选单元格显示的相同值,他需要返回单元格引用,而不是单元格地址。
【解决方案2】:

@Gary 的学生回答的附录,基于问题的 cmets:当您单击工作簿中的不同单元格时,此代码将在公式中找到带有 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

【讨论】:

  • 这也适用于其他工作表!伟大的!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多