2013-05-02 95 views
3

我試圖使我的工作UDF(在Excel 2003),和調試問題後會出現在我的函數的這個濃縮版被概括爲:VBA輸出寫入單元 - #VALUE!錯誤

Function btest(b_1 As Double) As Double  
    btest = 1  
    Worksheets("Sheet1").Range("A1").Value = b_1 
    '^this is the bit I want to work but doesn't^ 
    End Function 

這模擬我真正的功能,在沒有執行的下一個單元輸出行之前沒有問題的情況下賦值給它。我相信這與我得到的#VALUE!錯誤有關,儘管我使用MsgBox這表明函數確實有一個數值。

任何人都可以闡明這一點嗎?

另外:是什麼

Worksheets("Sheet1").Cells(1, 1) = B 

Sheets("Sheet1").Range("A1").Value = B 

其中 B是一些數值之間的差異?

感謝

+0

是否想從VBA代碼或Sheet工作表調用您的函數? – 2013-05-02 09:17:30

+0

此外,您可以從另一個工作表單元檢查[this](http://stackoverflow.com/a/15659852/2143262),也可以檢查 – 2013-05-02 09:19:11

+0

,例如, A2 – user2342380 2013-05-02 09:55:55

回答

1

正如你已經有

它看起來像這個問題是任何UDF不允許編輯張意識到,只有返回一個值...所以,如果我想編輯另一個單元作爲同一過程的一部分,我需要使用子」

一個標準 UDF不能改變表。

但在後續評論

而言這是正確的,如果是這樣,我怎麼會去說 - 子中的一個函數或函數中的子?我希望我的電子表格能夠像輸入函數一樣自動對輸入做出反應 - 無需按鈕或特殊操作。

您可以使用事件

舉個例子:

  • 你想跟蹤A1:A10在某個表的輸入
  • 如果使用了這個區域要設置Worksheets("Sheet1").Range("A1").Value這個值

問題1

  1. 右鍵單擊要跟蹤
  2. 查看代碼
  3. 複製並粘貼下面的代碼 4按以返回到Excel

代碼的工作表的標籤

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim rng1 As Range 
Set rng1 = Intersect(Target, Range("a1:10")) 
If rng1 Is Nothing Then Exit Sub 
Application.EnableEvents = False 
Worksheets("Sheet1").Range("A1").Value = rng1.Value 
Application.EnableEvents = True 
End Sub 

問題2

它們是相同的。

0

你是對的(在您的評論),一個UDF不能變化片,只返回一個值。

如果您從UDF調用SubFunction並嘗試更改工作表,那麼這將保持true事件。它也會失敗。

注:還有一個(相當醜陋的)解決:看this answer