2013-10-11 1 views
1

난 역사적인 이유로, 인수, 다수 소요하는 기능에서 내보낼 XLL (다소 복잡한 C++ 프로젝트), 그리고 정확하게 20. 함수 마법사에 등록 할 수없는 xll 추가 기능에서 함수를 호출하려면 어떻게합니까?

마법 번호 : 대부분의보다 적은 가지고 있지만 분명히 Excel 2003에서 마이크로 소프트 오피스 엑셀 2003 (30 개) 인수 ("의 최대 개수가 어떤 기능을 수행 할 수있는 인수의 최대 수는 30입니다 이. "). 그러나 기능 마} 사에서 over 20 the function cannot be registered.

짐작할 수 있듯이 3을 더 입력해야합니다. 인수가 필요합니다. 좋습니다. 따라서 인자 카운트는 23까지 올라갑니다 (적어도이 함수는 "인간 소비"를위한 것이 아니라 항상 VBA 래퍼에 의해 호출됩니다). VC++ 디버거를 엑셀 프로세스에 연결하여

, 나는 등록시 xlretInvCount의 약자 오류 코드 4를 얻을.

내가 쉼표로 구분 된 인수 이름의 문자열이 shorter than 255 characters 있는지 만들었습니다. Btw, xlw 4 (이전 버전, 알고 있습니다)를 사용하고 있습니다. 한도가 30 인 경우

그래서,

Application.Run("function name", ..... very long list of arguments) 

를 통해 내 함수를 호출 할 수 있기를 기대하지만, 마법사를 사용하지. 문제는 VBA가 함수가 등록되어 있지 않다는 것을 알려줍니다.

그래서 20 개 이상의 인수와 30 개 미만의 인수를 사용하는 함수는 어떻게 올바르게 사용합니까?

NB : 명백한 진술을 삼가하십시오. 나는 문제의 진정한 요점이 어디 있는지 알고있다. 리팩토링은 현재 불가능합니다.

+1

볼 수 있지만, 자주 하나의 인수로 범위를 (인수를 포함하는) 전달하여 인수의 수를 줄일 수 있습니다. 악의적 인, 더러운 대안 : 인수를 문자열로 전달하고 문자열을 구문 분석합니다. 특히 VBA 래퍼를 통해 호출하기 때문에 그렇습니다. –

+0

이것은 내가 생각했던 대체품이지만, 왜 내가 "비 구속력"한도에 불과해야 하는지를 분명히 극복하지 못하는 이유가 궁금합니다. – Francesco

답변

1

당신은 VBA를 통해 함수를 호출하기 때문에 당신도 즉, XLW를 사용하지 않는, 그것을 등록하지, 직접 호출 할 수도 있습니다. VBA에서 extern “C” int __declspec(dllexport) _stdcall myfunc(double arg1, double* arg2, ...)

  • 선언 : C/C++에서

    • 선언 Function MyFunc& Lib "C:\myL.dll" Alias "[email protected]" (ByVal arg1 As Double, ByRef arg2 As Double, ...)

    에서 @ 1 .DEF 파일 함수에서의 위치를 ​​의미한다.

    이제 VBA 함수를 호출 할 수 있습니다. 당신이 리팩토링으로 이것을 고려한다면 나는 확실하지 않다 http://aandreasen.wordpress.com/2008/05/05/how-to-create-a-dll-for-ms-excel-vba-with-microsoft-visual-c-2008-command-line-tools/

  • +0

    안녕하세요. 나는 그것을 최대한 빨리 시험 할 것이다. 함수 api는 XlfOper를 예상하고이를 기본 유형으로 언랩합니다. 이것이 응용 프로그램을 통해서만 사용하도록하지는 않기를 바랍니다. 운영. 포인터에 감사드립니다. 지금 바로 링크를 읽으십시오. – Francesco

    +0

    나는 이것을 단지 오늘 시도 할 수 있었다. 그리고 그것은 작동한다. 불행히도 xll은 LPXLOPER를 둘러싼 XLW 래퍼 인 XlfOper 유형의 인수를 허용합니다. 이 함수를 선언하는 방법에 대한 흥미로운 질문을 던집니다 (네이티브 데이터 형식을 사용하는 예제가 좀 더 쉽습니다).어쩌면 나는 또 다른 질문을 할 것이다. 당분간 올바른 입력을 해주셔서 감사합니다. – Francesco

    +1

    네이티브 C 인수를 사용하여 함수를 선언 한 다음 XlfOper 인수를 만듭니다. 또는 (더 나은) : 네이티브 C 인수를 사용하여 일반 함수를 만들고 XLl 함수에서 XlfOper를 언 래핑하여 해당 함수를 호출합니다. XlfOper를 참조하는 것이 이전 함수에서 너무 깊지 않기를 바랍니다. –

    관련 문제