2013-09-16 123 views
12

我正在製作我的第一個VBA程序並嘗試運行以下功能。該功能檢查的第一行特定的命名範圍內不具有一個值大於它的主要價值,但小於1#NAME? Excel for Excel中的錯誤功能

Public Function findPurchase() 

Dim CRT As Range 
Set CRT = Range("CostRateTable") 

Dim existsBetter As Boolean 
existsBetter = True 

Dim r As Integer 
r = 2 
Dim c As Integer 
c = 4 

While existsBetter 

    Dim Found As Boolean 
    FoundBetter = False 

    While Not FoundBetter And c <= CRT.Columns.Count 
     If CRT(r, c) > CRT(r, 2) And CRT(r, c) < 1 Then 
      FoundBetter = True 
     Else 
      c = c + 1 
     End If 
    Wend 


    existsBetter = FoundBetter 
    If existsBetter Then 
     r = r + 1 
    End If 
Wend 

findPurchase = CRT(r, 3) 
'MsgBox(findPurchase) 
End Function 

我知道函數做什麼是應該,因爲我有兩個手動檢查了值的表格,從MsgBox中刪除了註釋',並使用調試工具在它通過表格時逐步進入和退出每個功能步驟。但是,當我使用=findPurchase()在Excel中引用函數時,我得到一個#NAME?錯誤。當我開始鍵入它的名字時,該函數甚至出現在函數自動完成框中。當我寫等功能,既沒有參數,我可以引用他們就好了,例如:

Function addtwo() 
    addtwo = 1 + 2 
End Function 

我在做什麼毛病我的功能,使其無法正常工作?

+0

'Dim Found As Boolean'是否僅僅是因爲這條線不正確dim'd? –

+0

啊,我的壞。我解決了這個問題,但仍然遇到同樣的錯誤。這實際上不會產生問題,但只是創建一個我不使用的額外變量。 – Teofrostus

+0

你在哪裏宣佈'FoundBetter'?你有沒有嘗試單步執行代碼?你嘗試過從VBA運行功能嗎?它會給出任何錯誤嗎? –

回答

24

您正在收到該錯誤,因爲您有一個與該函數具有相同名稱的模塊。

enter image description here

更改這個名字說find_Purchase,一切都會好起來的:)見下圖...

enter image description here

3

確保您已將該功能置於標準模塊中。錯誤消息意味着Excel無法找到該功能。

+1

它是在我創建的模塊中,通過右鍵單擊並轉到插入>>模塊。可以找到來自同一模塊的其他功能(例如我的示例中的addtwo)。 – Teofrostus

+0

然後絕對確定函數名稱的拼寫與工作表中的用法相匹配。 –

+0

我很確定。該名稱甚至顯示在自動完成,我雙擊它。我輸入完全是'= findPurchase()'我仍然遇到'#NAME?'錯誤。 – Teofrostus

0

我也有類似的持續性問題,在我的職務,當一個一切似乎都很好。 打開工作表&轉到開發人員選項卡。打開VBA,回到開發人員功能區選擇「查看代碼」。看看它是否打開任何特定於該工作表的類似代碼(例如Sheet2(代碼))。我發現除了模塊之外,我還在工作表上覆制了代碼。刪除「工作表」代碼。您可能需要保存在此階段重新打開工作簿&)當我刪除工作表代碼,模塊功能然後工作

6

我自己也有同樣的問題。事實證明,我「保存爲.. 」另一個文件和宏沒有該文件啓用。在頂部沒有橫幅出現,但產生了#NAME?錯誤。 我重新打開該文件,啓用宏,問題就解決了。

+0

與我同樣的問題。我複製了一個文件,重命名並打開了它。 Excel要求啓用宏並執行auto_open過程。儘管如此,它的行爲卻很奇怪,因爲該功能仍未自動評估。我必須編輯包含公式的單元格(F2和Enter)。然後該功能被正確評估。 然後,在不保存的情況下打開工作簿並重新打開後,一切都很好。 – DrMarbuse

1

當Excel打開的包含VBA代碼的未知工作簿,它通常要求宏由用戶啓用(取決於應用程序設置)。

如果用戶啓用宏,則將啓動所有事件驅動的過程,例如auto_open或其他。

但是,自定義VBA函數需要完整重新計算工作簿。否則函數返回值仍然是#NAME,因爲計算僅在打開工作簿後直接完成。

爲了直接在第一時間開放工作,一個具有以下行添加到workbook_open事件

' 
' Workbook open event 
Private Sub Workbook_Open() 
    Application.CalculateFullRebuild 
End Sub 
+0

這將被添加到哪裏?我如何參加Workbook Open Event? – Dan

0

除了檢查一些上面提到的項目,你可能需要指定自定義函數實際定義的文件名,例如單元格內容 = XLstart.xlsm!myCustomFunc(Arg1,Arg2) 其中myCustomFunc在啓動文件XLstart.xlsm中定義。

繼Excel的幫助「糾正錯誤#NAME?」:

在編輯欄中,選擇[嫌疑人]函數名。 在名稱框(位於編輯欄左側)中,單擊箭頭,然後從Excel建議的列表中選擇一個[用戶定義]函數。

這將按照上述格式添加文件名。

MS 2010,視窗10

0

檢查「信任對VBA項目對象模型」從宏安全設置宏

0

真, 我(在Excel 2010中),當同樣的我遷移到Excel 2016,顯示函數原型,但是當我完成該函數時,#NAME錯誤顯示爲彈出式窗口...所以代碼從未觸發。

原來我有一個與Sub或UDF函數同名的宏! 我改名爲宏,然後它的工作

乾杯

0

另一個原因,我發現了#NAME?錯誤在於具有自定義函數的宏工作簿具有與函數名稱相同的範圍名稱。我改變了功能名稱並解決了問題。