它有效,但未列在此处:
https://msdn.microsoft.com/en-us/library/office/gg278535.aspx
...> Office分享> Office VBA语言参考> Visual Basic概念主题
从函数返回字符串
并在VBA编辑器中:
(查看) - 对象浏览器 - VBA - 字符串
许多论坛都讨论过这个功能,所以人们都会使用它。
答案 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_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
视为返回值的类型提示(无论如何总是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
查找,它们就不存在了。