2016-12-27 6 views
1
それは動作しますが、ここに記載されていません

:関数
とVBAエディタで
から文字列を返す
https://msdn.microsoft.com/en-us/library/office/gg278535.aspx
...>オフィスを共有>オフィスVBA言語リファレンス> Visual Basicの概念トピック

を(表示) - オブジェクトブラウザ - VBA - 文字列

この機能は多くのフォーラムで議論されているため、人々が使用しています。

+0

あなたはそれが動作し、それが存在するかどうかを尋ねる?どのようにそれは既存なしで動作することができますか?あなたの質問は「なぜそれが文書化されていないのですか」の方が多いようです。しかし、なぜ迷惑?これらの '$'関数は過去からの遺物であり、今日ドル以外の関数を使用しないという実行可能な議論はありません。 – trincot

+1

@trincot - これは実際には間違っています。* '$'の中には、Variantの代わりに強く型付けされた 'String'を返すものがあります。戻り値を 'String'に代入している場合、' $ 'なしのバリエーションを使用すると暗黙のキャストが作成されます。 – Comintern

答えて

4

あなたの質問に対する答えは、「Accessに存在する」という意味に依存します。我々はアクセスVBA開発環境でイミディエイトウィンドウを開き、

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

を実行して、我々は

I like bacon! 

を取得した場合ので、はっきりReplace$機能は、アクセス自体に 『存在する』ん。我々は外部アプリケーション(例えば、VBScriptの、.NET、...)からのA​​ccessデータベースに対するクエリでReplace$を使用しようとした場合しかし、我々は混乱に追加

Undefined function 'Replace$' in expression. 

を得るだろうという事実であります古い "Jet" ODBC/OLEDBドライバはReplace機能をサポートしていませんでした(ドル記号なし)が、新しい "ACE" ODBC/OLEDBドライバは機能します。 (どちらも味はReplace$をサポートしています。)だから、

SELECT Replace([Name], 'Gordon ', 'Gord ') AS newName FROM ... 

ようなクエリがVBA.Stringsに、我々は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によって内部的にどのように処理されるかは「特別な」ものです。ほとんどの場合、型ライブラリには実際には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); 

コンパイラは明らかにので、内部的に「型ヒント」と同様$扱わ(上記の例を使用)、実際にはであり、TypeLibには関数Left$が定義されていません。実際、VBA.Strings.Rightとして宣言された関数はありません。これらは、_HiddenInterfaceをという名前の特別な制限されたインターフェイスに住ん:はない

[ 
    odl, 
    uuid(1E196B20-1F3C-1069-996B-00DD010EF676) 
] 
interface _HiddenInterface { 
    ... 
    [restricted, helpcontext(0x000f6d7c)] 
    void _stdcall Right(); 
    ... 
}; 

Right$こと_HiddenInterface中に表示され、また他の文字列を返す関数のいずれかを実行していない。VBAコンパイラは、 "function type hint"を使用して、関数呼び出しを_B_str_Rightまたは_B_var_Rightに転送します。

これまでのところ、あなたの質問に何が関係しているのでしょうか。答えはReplace実際にはではありませんは2つの異なる内部表現を持っています。それは常に、文字列を返す_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のドライバに関する限り、私はTypeLibによって公開されている名前に限定されており、ではないことを(TBHは実際にはあまり見ていません)と考えています。はVBAランタイムとして解釈されます異なる機能に転送します。 vbe7.dllでIDispatchルックアップを実行している場合、それらは単に存在しません。

+0

Replace $はReplaceの代替名として扱われ、バックグラウンドでReplace $のような関数は内部的にはありませんか? Replace $はReplaceと同じ操作をトリガーしますか?私はこのようなものを疑った。 – darekk

+1

@darekk - かなり。 VBAでの '$ '構文の実装は、すべての意図と目的のためのものです。私はこれが、VBがOfficeに組み込まれる以前の互換性要件の遺産であると考えています。私はそれが1のようなものになることを想像します。)識別子に '$'があるかどうかを調べます。 2.)関数が 'Variant'を実装しているかどうかを調べます。 3。)そうであれば、適切な関数にリダイレクトし、そうでなければ、関数自体を呼び出します。 – Comintern

関連する問題