: 함수
와 VBA 편집기에서
에서 문자열을 반환
https://msdn.microsoft.com/en-us/library/office/gg278535.aspx
...> 사무실 공유> 사무실 VBA 언어 참조> Visual Basic의 개념 항목
:
를 (보기) - 개체 브라우저 - VBA - 문자열
이 기능은 많은 포럼에서 논의되어 사람들이 사용합니다.
답변
귀하의 질문에 대한 대답은 "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)}
기능을 사용하는 경우 모듈은 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
조회를 수행하는 경우에는 존재하지 않습니다.
그래서 Replace $는 Replace의 대체 이름으로 취급되며 백그라운드에서 $를 내부적으로 바꾸는 것과 같은 기능은 없습니다. $ 바꾸기가 바꾸기와 동일한 작업을 트리거하기 때문에? 나는 이런 것을 의심했다. – darekk
@darekk - 꽤 많이. VBA의 '$'구문 구현은 모든 의도와 목적을위한 해킹입니다. 필자는 이것이 VB가 Office에 포함되기 이전의 호환성 요구 사항의 유산이라고 생각합니다. 나는 1과 비슷한 것으로 생각한다.) 식별자에'$'이 있는지 확인한다. 2.) 함수가 'Variant' 리턴 구현을 가지고 있는지 확인하십시오. 삼.) 그렇다면 해당 함수로 리디렉션하고, 그렇지 않으면 함수 자체를 호출하십시오. – Comintern
그렇다면 작동하는지 확인한 다음 존재하는지 확인하십시오. 기존 없이는 어떻게 작동할까요? 귀하의 질문은 "왜 문서화되지 않았습니까?"라는 질문이 더 많으며 Microsoft가 대답하는 것이 더 문제가되는 것 같습니다. 그러나 왜 귀찮게합니까? 이'$'함수는 과거의 유물이며, 요즘은 달러가없는 함수를 사용하지 않는 것이 더 이상 유효하지 않습니다. – trincot
@trincot - 실제로는 잘못되었습니다. *'$'의 일부 *는 Variant 대신 강력하게 형식화 된 String을 반환합니다. 반환 값을'String'에 대입하면'$'없이 변이를 사용하면 암시 적 캐스트가 생성됩니다. – Comintern