2016-12-27 6 views
1
그것은 작동하지만, 여기에 나열되지 않은

: 함수
와 VBA 편집기에서
에서 문자열을 반환
https://msdn.microsoft.com/en-us/library/office/gg278535.aspx
...> 사무실 공유> 사무실 VBA 언어 참조> Visual Basic의 개념 항목
:
를 (보기) - 개체 브라우저 - VBA - 문자열

이 기능은 많은 포럼에서 논의되어 사람들이 사용합니다.

+0

그렇다면 작동하는지 확인한 다음 존재하는지 확인하십시오. 기존 없이는 어떻게 작동할까요? 귀하의 질문은 "왜 문서화되지 않았습니까?"라는 질문이 더 많으며 Microsoft가 대답하는 것이 더 문제가되는 것 같습니다. 그러나 왜 귀찮게합니까? 이'$'함수는 과거의 유물이며, 요즘은 달러가없는 함수를 사용하지 않는 것이 더 이상 유효하지 않습니다. – trincot

+1

@trincot - 실제로는 잘못되었습니다. *'$'의 일부 *는 Variant 대신 강력하게 형식화 된 String을 반환합니다. 반환 값을'String'에 대입하면'$'없이 변이를 사용하면 암시 적 캐스트가 생성됩니다. – Comintern

답변

4

귀하의 질문에 대한 대답은 "Access에 존재하는 [s]"의 의미에 따라 다릅니다. 우리가 액세스 'VBA 개발 환경에서 직접 실행 창을 열고

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

를 실행하면 우리는

I like bacon! 

그렇게 명확하게 Replace$ 기능은 접근 자체가 "존재"않습니다 얻을. 우리가 외부 응용 프로그램 (예를 들어, VBScript를, .NET, ...)에서 Access 데이터베이스에 대해 쿼리에서 Replace$를 사용하려고한다면, 우리는 혼란에 추가

Undefined function 'Replace$' in expression. 

를 얻을 수 있습니다 것은 사실 즉 이전 "Jet"ODBC/OLEDB 드라이버는 Replace 함수 (달러 기호 제외)를 지원하지 않지만 최신 "ACE"ODBC/OLEDB 드라이버는 지원합니다. (둘 다 맛. Replace$ 지원) 그래서 우리는 ODBC 드라이버에

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

를 사용하는 경우

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

같은 쿼리는 있지만 작동하지 우리가 VBA.Strings

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

예, SQL에서는 작동하지 않습니다.이 항목을 추가하는 것을 잊었습니다. – darekk

+0

하지만이 기능이 설명서에 나와 있지 않은 이유는 무엇입니까? 위에 언급 된 운전자의 행동이 일치하지 않습니까? – darekk

+0

올바르게 기억하면 Access 2002 (10)의 SQL에서 작동하지만 더 새로운 Access 런타임에서는 더 이상 작동하지 않습니다. – darekk

3

기능을 사용하는 경우 모듈은 VBA에서 내부적으로 처리하는 방식에서 "특별"합니다. 대부분의 경우 형식 라이브러리에는 실제로 두 버전이 있습니다. String (끝은 $으로 끝남)과 Variant을 반환하는 버전이 있습니다.

[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); 

컴파일러가 분명히 있기 때문에, 내부적으로 "타입 힌트"를 유사하게 $ 취급 : 예를 들어, Right합니다 (vbe7.dll에서 TypeLib의) - 내부적으로 이러한 기능의 쌍으로 선언 (위의 예제를 사용), 실제로 이 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의 대체 이름으로 취급되며 백그라운드에서 $를 내부적으로 바꾸는 것과 같은 기능은 없습니다. $ 바꾸기가 바꾸기와 동일한 작업을 트리거하기 때문에? 나는 이런 것을 의심했다. – darekk

+1

@darekk - 꽤 많이. VBA의 '$'구문 구현은 모든 의도와 목적을위한 해킹입니다. 필자는 이것이 VB가 Office에 포함되기 이전의 호환성 요구 사항의 유산이라고 생각합니다. 나는 1과 비슷한 것으로 생각한다.) 식별자에'$'이 있는지 확인한다. 2.) 함수가 'Variant' 리턴 구현을 가지고 있는지 확인하십시오. 삼.) 그렇다면 해당 함수로 리디렉션하고, 그렇지 않으면 함수 자체를 호출하십시오. – Comintern