2016-12-27 44 views
1

它的工作原理,但這裏沒有列出:
https://msdn.microsoft.com/en-us/library/office/gg278535.aspx
...> Office共享>辦公VBA語言參考> Visual Basic中的概念性主題
從功能

和VBA編輯器返回字符串:
(查看) - 對象瀏覽器 - VBA - 字符串

此功能在許多論壇中討論過,因此人們使用它。

+0

所以你說它的工作原理,然後問它是否存在?它如何在沒有現有的情況下運作看起來你的問題更多的是「爲什麼沒有記錄」,然後這是微軟回答的問題。但爲什麼要麻煩?這些'$'函數是過去的遺留問題,現在沒有可行的論證,不再使用現在的無錢函數。 – trincot

+1

@trincot - 這實際上是不正確的 - * $'中的某些*返回一個強類型的'String'而不是'Variant'。如果你將返回值賦給一個'String',那麼使用不帶'$'的變體會創建一個隱式轉換。 – Comintern

回答

4

您的問題的答案取決於您的意思是「......存在於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)} 
+0

是的,它不能在SQL中工作,我忘了添加這個。 – darekk

+0

但是什麼原因,這個函數沒有在文檔中列出。在上面提到的驅動程序中行爲不一致? – darekk

+0

如果我沒有記錯的話,它在Access 2002(10)中的SQL中工作,但在一些較新的Access運行時不再工作。 – darekk

3

的功能,在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查找,它們根本就不存在。

+0

所以替換$被視爲替換的替代名稱,並沒有像後臺替換$這樣的功能,在內部?因爲Replace $觸發與Replace相同的操作?我懷疑這樣的事情。 – darekk

+1

@darekk - 非常漂亮。 VBA中的'''語法實現是爲了所有的意圖和目的。我懷疑這是一些非常舊的兼容性需求的遺留問題,它將VB包含到Office中。我想它會像1)。檢查標識符是否有'$'。 2)檢查函數是否有'Variant'返回實現。 3。)如果是這樣,重定向到適當的函數,如果沒有,則調用函數本身。 – Comintern