2011-09-22 29 views
1

這是我兩個工作表的一個小例子。如何從另一個工作表中獲取單元格值並將其分配給UDF的返回值?

原始表

Original Sheet

正如你可以看到,這個表有兩個單元等待在以後階段重新計算。 (即細胞與紅色#Eval標記)

結果表

Result Sheet

在上述結果表,我們有兩個結果,草莓和桃分別。這兩個結果是爲兩個#Eval單元準備的,需要替換#Eval標記。

請注意,#Eval實際上是由UDF返回的,表明這個單元需要重新計算。重新計算將通過單擊按鈕或其他方式手動啓動。

另請注意,該位置映射在兩張紙上 - 如果#Eval位於單元格A3中,那麼在結果表單元格A3中也會出現結果。

因此,我的主要目標是將#Eval單元替換爲相應的結果。但我在將結果傳遞到我的UDF時遇到麻煩 - 我不知道如何以編程方式獲取當前正在重新計算的單元格的引用/地址。

下面是我目前得到的代碼,我認爲它沒有被正確執行。誰能幫忙?或者有沒有其他的方式來實現這一點?

在此先感謝。

//assign value from result sheet back to result variable 
private string getResultFromResultSheet(Excel.Worksheet originalSheet, Excel.Worksheet resultSheet) 
{ 
    string DataResult = null;    

    //Excel.Range resultSheetRange = resultSheet.UsedRange; 
    //string addresse = resultSheetRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing); 

    Excel.Range originalSheetRange = originalSheet.UsedRange; //<= I think it's incorrect here 
    string os_currentAddress = originalSheetRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing); 

    Excel.Range currentRRange = null; 

    currentRRange = resultSheet.get_Range(os_currentAddress, Type.Missing); 
    if (currentRRange != null) 
    { 
     DataResult = currentRRange.Text; 

    } 
    return DataResult; 
} 

回答

2

個人而言,我會去重新思考和寫你的UDF的Excel預計UDFS是這樣:

  • 通從單元中的所有數據到你的UDF作爲參數(如果你不這樣做Excel不會知道何時重新計算您的UDF,您將不得不使UDF易變,這是一個壞主意)
  • UDF應該將結果返回給它所佔用的單元格
  • Govert說:if您需要UDF佔用的單元格的範圍對象(通常是查找調用範圍的維度),您可以使用Application.Caller
  • 不要使用。文本(即讓你的電池的格式化的結果是依賴於任何用戶做而且可能含有###)使用.Value2代替

然後你的UDF中原始工作表= DataResult(結果表格!A1)

如果這種方法不適合您的整體任務,您可能需要創建一個C#宏,它可以通過某個事件觸發器或按鈕而不是UDF來調用。

+0

非常感謝您的幫助。但是,只有1個問題,我似乎有類型轉換問題,當我使用**。Value2 **。我認爲它如果原始數據是基於文本的值,那麼工作正常,但是當涉及到日期類型數據時,它會給我不正確的結果。'string result =(string)ResultRange.Value2;'是我目前使用的代碼。轉換.Value2到對象第一? – woodykiddy

+0

Excel日期值是雙打,而不是字符串 –

+0

由於Excel單元格可以包含任何一個雙精度,一個錯誤,一個字符串或一個布爾值它是最安全的轉換爲對象,除非你想要一個錯誤,如果單元格數據不是所需的類型 –

1

調用Application.Caller從你的UDF中會返回一個Range對象的呼叫單元。然後,您的UDF可以從另一張表中的相應位置讀取數據。

+0

非常感謝。這正是我所期待的。我仍然是Excel編程的新手。另外,MSDN上的API文檔的某些部分沒有很好的記錄,這使得學習/參考有點困難。 :(我猜你們需要一點幫助,再次感謝大家的回答。 – woodykiddy

+0

使用Application.Caller似乎有問題。出於某種原因,它返回一個負整數,而不是範圍對象。它應該,爲什麼是這樣?我怎樣才能得到範圍對象? – woodykiddy

相關問題