2009-07-07 59 views
2

我有一個公共職能在Access形式MS-訪問VBA eval函數的行爲

Public Function PopupProcess() as long 
    MsgBox Me.ActiveControl 
    PopupProcess = 1 
End Function 

當我打電話

eval("forms('MyForm').popupprocess") 

它顯示一個消息框2倍。有人知道它爲什麼這樣做嗎?

我有Access 2003與SP3。

編輯:主要想法是從自定義命令欄控件OnAction的該窗體調用函數。 也許你有更好的方法來從命令行控件的窗體調用函數。

+1

是否還有一些其他功能的形式,也可能是調用該功能? 例如,如果你爲表單添加一個空函數(比如說「Public Function DoesNothing」)並且調用eval(「forms('MyForm')。DoesNothing」),你會得到一個消息框嗎? – anschauung 2009-07-08 02:35:05

回答

8

這是一個非常長期的bug,它的存在了,因爲訪問97天, (大約4-5版本的訪問)。

這裏的解決方案是永遠不要使用表格預選賽中,只需將您的行動事件之後,你會好起來的

=PopUpProcess() 

請注意,您必須先=它,和後綴必須有括號()

請記住,您實際上可以使用行爲來獲得優勢。運行的功能將來自當前焦點在屏幕上的窗體。這意味着您可以使用具有相同名稱的函數的不同形式,並且無論哪種形式具有焦點,具有該名稱的函數將從該表單代碼模塊運行。

更好的是,如果其中一種形式在表單代碼模塊中沒有該函數作爲public,那麼將使用標準代碼模塊中的函數。所以你可能有九種形式,都使用主標準代碼模塊中的標準函數。但是,第十種形式可能需要運行特殊代碼,因此只需將該代碼模塊中的該功能代碼作爲公共代碼運行,並且它將在標準代碼模塊中代替公共代碼運行。

此方法允許您構建適用於多種不同形式的單個自定義菜單欄,但那些許多表單將從該自定義菜單欄上運行不同的代碼。這也鼓勵你把菜單代碼放在它所屬的窗體中。

因此,要解決您的問題,只需不使用表單的限定符,並使用上述格式。

注意,您可以從這些功能也傳遞參數,例如

=PopUpProcess(‘hello’) 

然後聲明函數爲:

Public Function PopUpProcess(strParm as string) 

請記住,在功能和語法和所有的東西我上面陳述也適用於當您使用功能區中的訪問2007訪問行動。

1

不知道。如果你這樣稱呼會發生什麼?

Call Forms("MyForm").PopupProcess 

嘗試使用CallByName函數而不是eval來調用您的函數。它應該只觸發你的函數一次,它仍然會允許你參數化形式的名稱和功能或子名稱:

CallByName Forms("MyForm"), "PopupProcess", VbMethod 
+0

上述不能在這種情況下工作。海報正在談論自定義菜單欄,而不是表單上的按鈕。在自定義菜單欄中,您只能使用onAction設置,爲了調用您的代碼,您必須使用表達式,而不是「調用子名稱」。 – 2009-07-12 11:47:09

+0

您可以調用一個調用窗體上的函數的公共函數。 – 2009-08-08 00:26:20