簡體   English   中英

選定范圍的 Excel 單元格傳遞給 VBA 函數的“作為變體”參數,然后傳遞給 C++ 中 ATL 對象的方法

[英]Selected range of Excel cells passed to an argument “as Variant” of a VBA function, then passed to an method of an ATL object in c++

這個問題來自以下問題:

ATL/COM 對象的鏈接方法

假設我有一個暴露給 vba 的 dll 的 ATL/COM 類TheClass的實例MyObj1TheMethod的方法TheClass

在VBA中,我有一個功能

Public Function func(x as Variant) as Variant
    '... something
    MyObj1.TheMethod( x )
    '... other things
End Function

這個函數在excel中使用,我將一個excel范圍的單元格傳遞給它。 在 VBA 中調試時,x 被視為 vba 類型“ Variant/Object/Range ”,並且具有 vba 類型“ Variant/Variant ”的“ Value2 ”,如果范圍是例如包含 expty 單元格的矩形並在 excel 中加倍,當Value2展開時(在 vba 中的調試中仍在觀察中),它由Variant的類型“ Variant/Double ”或“ Variant/Empty ”組成。 在下一步中,我想在 c++ 中隔離這個“核心”“ Value2Variant

下一步,at debug in c++ at the entry of the ATL method TheMethod of signature

STDMETHODIMP TheClass::TheMethod( VARIANT* var_in )

var_in (接收到后者x )的vt等於VT_DISPATCH 這個家伙肯定會攜帶(即使我不知道)后者x已經攜帶的所有東西,但我想知道如何隔離它的“ Value2 ”部分以捕獲它並使用它,因為只有我對Value2部分感興趣。

讓我說我知道我可以在 vba 中執行此操作而不是在 c++ 中執行此操作:

Public Function func(x as Variant) as Variant
    '... something
    MyObj1.TheMethod( x.Value2 )
    '... other things
End Function

我不想在 VBA 中訴諸這樣的事情

好的,正如 Igor Tandetnik 建議的那樣,我做了類似的事情:

VARIANT * pVARIANT_IN_EXTENSION = new VARIANT() ;
VariantInit(pVARIANT_IN_EXTENSION);
IDispatch * piDisp = pVARIANT_IN->pdispVal ;
::DISPPARAMS invokeparams = {0} ;
HRESULT hRes = piDisp->Invoke(0, IID_NULL, 0, DISPATCH_PROPERTYGET,&invokeparams, pVARIANT_IN_EXTENSION, NULL, NULL);

將真正的“數組變體”(vt 等於 VT_ARRAY)打包到 VT_DISPATCH 變體 pVARIANT_IN 中。

稍后我將嘗試導入Excel的類型庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM