Microsoft Access中是否存在Replace $()函数?

时间:2016-12-27 12:23:17

标签: vba ms-access dollar-sign

它有效,但未列在此处:
https://msdn.microsoft.com/en-us/library/office/gg278535.aspx
...> Office分享> Office VBA语言参考> Visual Basic概念主题
从函数返回字符串

并在VBA编辑器中:
(查看) - 对象浏览器 - VBA - 字符串

许多论坛都讨论过这个功能,所以人们都会使用它。

2 个答案:

答案 0 :(得分:4)

你的问题的答案取决于你所说的“......在Access中存在[s]”。如果我们在Access的VBA开发环境中打开一个立即窗口并运行

?Replace$("I like tofu!", "tofu", "bacon")

我们得到了

I like bacon!

很明显,Replace$函数在Access本身中“存在”。但是,如果我们尝试在来自外部应用程序(例如,VBScript,.NET,...)的Access数据库的查询中使用Replace$,我们将获得

Undefined function 'Replace$' in expression.

更令人困惑的是旧的“Jet”ODBC / OLEDB驱动程序不支持Replace功能(没有美元符号),但是较新的“ACE”ODBC / OLEDB驱动程序支持Replace$功能。 (两种味道都不支持SELECT Replace([Name], 'Gordon ', 'Gord ') AS newName FROM ... 。)所以像

这样的查询
Driver={Microsoft Access Driver (*.mdb, .accdb)}
如果我们使用ODBC驱动程序

将起作用

Driver={Microsoft Access Driver (*.mdb)}

但如果我们使用

则不行
{{1}}

答案 1 :(得分:3)

String模块中的函数对于VBA内部处理它们的方式是“特殊的”。对于大多数版本,类型库中实际上有两个版本 - 返回$的版本(以Variant结尾),以及返回Right的版本。在内部,这些被声明为一对函数 - 例如,[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); (来自vbe7.dll TypeLib):

$

编译器显然在内部将Left$视为“类型提示”,因为(使用上面的示例),实际上 不是 TypeLib中定义的函数VBA.Strings.Right。实际上,也没有声明为_HiddenInterface的函数。它们位于名为[ odl, uuid(1E196B20-1F3C-1069-996B-00DD010EF676) ] interface _HiddenInterface { ... [restricted, helpcontext(0x000f6d7c)] void _stdcall Right(); ... }; 的特殊受限制接口:

Right$

请注意,_HiddenInterface 不会出现在_B_str_Right中,也不会出现任何其他字符串返回函数。 VBA编译器使用“函数类型提示”将函数调用转发到_B_var_RightReplace

到目前为止,您可能想知道这与您的问题有什么关系。答案是_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视为返回值的类型提示(无论如何总是IDispatch)。就ODBC和OLE驱动程序而言,我想(TBH我真的没有仔细研究过)它们仅限于TypeLib公开的名称并且被解释由VBA运行时转发到不同的函数。如果你在vbe7.dll上进行$url = "http://example.com" $oIE = _IECreate($url) Sleep(3000) ;waiting for executing javascript. But useless. $sCode &= _IEDocReadHTML($oIE) & @CRLF 查找,它们就不存在了。