它的工作原理,但這裏沒有列出:
https://msdn.microsoft.com/en-us/library/office/gg278535.aspx
...> Office共享>辦公VBA語言參考> Visual Basic中的概念性主題
從功能
和VBA編輯器返回字符串:
(查看) - 對象瀏覽器 - VBA - 字符串
此功能在許多論壇中討論過,因此人們使用它。
回答
您的問題的答案取決於您的意思是「......存在於Access中」。如果我們在訪問VBA開發環境中打開一個立即窗口和運行
?Replace$("I like tofu!", "tofu", "bacon")
我們得到
I like bacon!
如此明確的Replace$
功能確實‘存在’的訪問本身。然而,如果我們試圖在查詢中使用Replace$
對Access數據庫從外部應用程序(例如,VBScript中,.NET等),我們會得到
Undefined function 'Replace$' in expression.
增加到混亂是事實,舊的「Jet」ODBC/OLEDB驅動程序不支持Replace
函數(沒有美元符號),但是新的「ACE」ODBC/OLEDB驅動程序卻支持。 (無論是風味支持Replace$
。)因此,像
SELECT Replace([Name], 'Gordon ', 'Gord ') AS newName FROM ...
查詢將工作,如果我們使用ODBC驅動程序
Driver={Microsoft Access Driver (*.mdb, .accdb)}
但如果我們用
Driver={Microsoft Access Driver (*.mdb)}
的功能,在VBA.Strings
模塊在VBA內部如何處理它們時是「特殊」的。對於其中的大多數版本,類型庫中實際有2個版本 - 返回String
(以$
結尾)的版本,以及返回Variant
的版本。這些內部被聲明爲雙功能 - 例如,Right
(從vbe7.dll類型庫):
[entry(618), helpcontext(0x000f6ea5)] BSTR _stdcall _B_str_Right( [in] BSTR String, [in] long Length); [entry(619), helpcontext(0x000f656e)] VARIANT _stdcall _B_var_Right( [in] VARIANT* String, [in] long Length);
編譯器顯然對待$
類似於「類型暗示」內部,因爲(使用上面的例子),實際上不是函數Left$
在TypeLib中定義。實際上,也沒有聲明爲VBA.Strings.Right
的函數。這些生活在一個名爲_HiddenInterface
專門的限制性接口:
[ odl, uuid(1E196B20-1F3C-1069-996B-00DD010EF676) ] interface _HiddenInterface { ... [restricted, helpcontext(0x000f6d7c)] void _stdcall Right(); ... };
注意Right$
不出現在在_HiddenInterface
,也不做任何的其他字符串返回功能。VBA編譯器使用「函數類型提示」將函數調用轉發到_B_str_Right
或_B_var_Right
。
現在,你可能不知道這與你的問題做。答案是Replace
實際上不有兩個不同的內部表示。它總是返回一個字符串,在_HiddenInterface
不存在,並直接在VBA.Strings
模塊中的生活:
[entry(712), helpstring("Find and replace a substring within a string"), helpcontext(0x000f6522)] BSTR _stdcall Replace( [in] BSTR Expression, [in] BSTR Find, [in] BSTR Replace, [in, optional, defaultvalue(1)] long Start, [in, optional, defaultvalue(-1)] long Count, [in, optional, defaultvalue(0), custom(270D72B0-FFB8-11CF-A4BD-00A0C90F26EE, 1) ] VbCompareMethod Compare);
基本上沒有Replace$
功能可言。 VBA正在將$
作爲返回值的一個類型提示(無論如何總是爲String
)。至於ODBC和OLE驅動程序而言,我會想象(TBH我真的沒有看進去了),他們被限制到由該類型庫暴露,並不由VBA運行時所解釋的名稱轉發到不同的功能。如果你正在對vbe7.dll進行IDispatch
查找,它們根本就不存在。
- 1. Microsoft Access - 此記錄是否存在值?
- 2. 使用VBA函數替換Microsoft Access中的文本
- 3. 是否可以在ms-access中替換列中的數據?
- 4. wso2esb中是否有替換函數?
- 5. java中是否存在宏替換?
- 6. 使用Microsoft Access的VBA - 檢查對象是否存在
- 7. 替代Microsoft Access的數據捕獲
- 8. 替換在Microsoft FrontPage
- 9. 如何判斷在Javascript替換函數中是否發生了替換?
- 10. 當替換已存在的緩存鍵時,函數「apc_store」是否重置TTL值?
- 11. Microsoft Access是否允許此功能?
- 12. 是否可以在Excel函數中「大量替換」值?
- 13. 在postgres中的替換函數是否有例外情況
- 14. 強制Microsoft Access確認存在Microsoft Access ADE文件
- 15. 是否存在與SQL Server NewId()函數相同的Access?
- 16. Matlab中是否存在函數緩存?
- 17. 記錄是在Microsoft Access VBA
- 18. 在Python中替換Microsoft Word換行符
- 19. 在C++中替換函數
- 20. 在VBA中替換函數
- 21. 是否存在Access中的TRUNCATE?
- 22. 是否可以將數據從Python存儲在Access文件中?
- 23. 在Microsoft Access
- 24. 在Microsoft Access
- 25. Microsoft Access庫存報告
- 26. 在Bash Shell中是否存在像Bash中的進程替換?
- 27. Microsoft Azure IoT Hub是否存儲數據?
- 28. Microsoft Access /計數字
- 29. Microsoft Access元數據?
- 30. JQuery UI是否替換Jquery中的任何函數?
所以你說它的工作原理,然後問它是否存在?它如何在沒有現有的情況下運作看起來你的問題更多的是「爲什麼沒有記錄」,然後這是微軟回答的問題。但爲什麼要麻煩?這些'$'函數是過去的遺留問題,現在沒有可行的論證,不再使用現在的無錢函數。 – trincot
@trincot - 這實際上是不正確的 - * $'中的某些*返回一個強類型的'String'而不是'Variant'。如果你將返回值賦給一個'String',那麼使用不帶'$'的變體會創建一個隱式轉換。 – Comintern