установить значение для ячейки Excel в C ++ сгенерировать исключение 0x800A03EC

Я пишу надстройку Excel. Одним из UDF в надстройке является установка значения для выбранной ячейки с помощью Excel Automation в C ++. В моем коде у меня нет проблем получить диапазон, прочитать значение из выбранной ячейки, но когда я пытаюсь установить значение в ячейку, если значение является строкой, исключение кода выдает (0x80020005 несоответствие типов), в противном случае, оно всегда выбрасывает исключение с HResult 0x800A03EC. Ниже приведен фрагмент кода:

Есть идеи?

void SetValue()
{
Excel::SheetsPtr pSheets = GetExcelApplicationObj()->GetWorksheets();
Excel::_WorksheetPtr pSheet = GetExcelApplicationObj()->GetActiveSheet();

_variant_t text = pSheet->Range["A2"]->Text; //Read value from selected cell works fine

pSheet->Range["C2"]->Value = "Hello"; // throw 0x80020005 Type mismatch

pSheet->Range["B2"]->Value = 5.0; //Set value throw Exception with HRESULT 0x800A03EC
}

Excel::_Application* GetExcelApplicationObj()
{
if (m_pApp == NULL)
{
std::vector<HWND>::iterator it;
std::vector<HWND> handles = getToplevelWindows();
for (it = handles.begin(); it != handles.end(); it++)
{
HWND hwndChild = NULL;
::EnumChildWindows( (*it), EnumChildProc, (LPARAM)&hwndChild);
if (hwndChild != NULL)
{
Excel::Window* pWindow = NULL;
HRESULT hr = ::AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM, __uuidof(Excel::Window), (void**)&pWindow);
if (SUCCEEDED(hr))
{
if (pWindow != NULL)
{
m_pApp = pWindow->GetApplication();
pWindow->Release();
}
break;
}
}
}
}
return m_pApp;
}

std::vector<HWND> getToplevelWindows()
{
EnumWindowsCallbackArgs args( ::GetCurrentProcessId() );
if ( ::EnumWindows( &EnumWindowsCallback, (LPARAM) &args ) == FALSE ) {
return std::vector<HWND>();
}
return args.handles;
}

BOOL CALLBACK EnumWindowsCallback( HWND hnd, LPARAM lParam )
{
EnumWindowsCallbackArgs *args = (EnumWindowsCallbackArgs *)lParam;

DWORD windowPID;
(void)::GetWindowThreadProcessId( hnd, &windowPID );
if ( windowPID == args->pid ) {
args->handles.push_back( hnd );
}

return TRUE;
}

BOOL CALLBACK EnumChildProc(HWND hwndChild,LPARAM lParam)
{
CHAR className[128];
::GetClassName(hwndChild, className, 128);
if (strcmp(className, "EXCEL7") == 0)
{
HWND * phandle = (HWND*)lParam;
(*phandle) = hwndChild;
return FALSE;
}
return TRUE;
}

2

Решение

Вы должны обернуть string значение в варианте.

Попробуй это:

pSheet->Range["C2"]->Value = _variant_t(_bstr_t("Hello")).Detach();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]