簡體   English   中英

從Excel VBA UDF調用時,Range.Precedents返回范圍,而不是其先例。 有解決方法嗎?

[英]When called from an Excel VBA UDF, Range.Precedents returns the range and not its precedents. Is there a workaround?

我有這個VBA功能:

Public Function testPrec(target As Range) As String
    testPrec = target.Precedents.Address(External:=False)
End Function

在單元格C11中,我有以下公式:

=C6+C8

如果我從立即窗口中調用testPrec ,它就可以正常工作:

?testPrec([c11])
$C$6,$C$8

編輯:如果從非UDF宏Sub調用它也可以正常工作。 異常是UDF情況。

如果我以UDF從工作表中調用它:

=testPrec(C11)

我剛拿回“ $ C $ 11”。

有誰知道發生了什么,或者甚至更好地如何從UDF調用中獲得實際的先例? (我正在使用Excel2007。)

似乎限制在於,對包含UDF的調用堆棧中的.Precedents任何調用都.Precedents方式處理。 因此,找到一種在UDF觸發的調用堆棧之外進行調用的方法:一種想法是使用事件。 這是一個過於簡單的示例來演示

在模塊中定義

Public strPrecedent As String
Public rngPrecedent As Range

Public Function testPrec(target As Range) As String
    Set rngPrecedent = target
    testPrec = strPrecedent
End Function

在工作表中定義

Private Sub Worksheet_Calculate()
    If Not Module1.rngPrecedent Is Nothing Then
        Module1.strPrecedent = Module1.rngPrecedent.Precedents.Address(External:=False)
    End If
End Sub

現在, testPrec返回正確的范圍地址, testPrec延遲一格。 這個想法是讓UDF構建一個地址列表以獲取Precedents,並創建一個事件來完成實際的GetPrecedent工作,將地址字符串返回到列表以供udf提取。 根據您的需要,您也許可以以此為基礎構建可行的解決方案。

我能想到的唯一解決方法是獲取target.formula並對其進行解析-不太好。

我遇到了一個類似的問題:我必須根據單元格包含公式還是常量來格式化單元格。 HasFormula使得確定單元格是否包含公式成為可能,但是,也可以將簡單的計算(例如=123+45檢測為公式(從技術角度正確,但從財務建模角度正確)。 因此,我想在UDF中使用Precedents ,以查看給定的單元格是否鏈接到其他單元格。 如上所述,在執行UDF期間,“ Precedents的值無效,但我僅需要知道是否有任何先例 ,而不是它們是哪個單元格。

因此,我比較了FormulaFormulaR1C1屬性,因為它們僅在Formula包含單元格引用的情況下才不同。

有一個例外:如果“ Formula包含“命名范圍”,則即使單元格引用了某些內容,“ FormulaFormulaR1C1也可以相等。 (這與我的情況無關,也不想重復所有名稱,並檢查它們是否包含在Formula引號之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM