0x800a03ec при вызове Выбрать в диапазоне Excel (IRange). Диапазон был возвращен из используемого диапазона листа

Я пытаюсь выбрать "используемый диапазон". Я получаю UsedRange рабочего листа, затем вызываю функцию Select для него. Я получаю HRESULT 0x800a03ec на выбранный вызов.

Вот код:

COleVariant результат;

HRESULT hr = AutoWrap (DISPATCH_METHOD, & result, irange, L "Select", 0);

Я не буду публиковать код для функции AutoWrap (если кто-то не спросит). Это довольно хорошо известно, и я не изменил его.

Я почти уверен, что irange - это хорошо, потому что я попробовал несколько звонков, чтобы убедиться, что он соответствует ожиданиям, и он это делает. Если я перебираю его, я могу видеть содержимое каждой ячейки (и это правильно); число возвращаемых строк и столбцов является правильным, а возвращаемое свойство "Адрес" извлекается.

Рабочий лист не заблокирован.

Я видел другие проблемы, связанные с Locale, и моя система настроена на американский английский, как и моя учетная запись пользователя. Ни один не был изменен.

Надеюсь, кто-то может помочь!

Обновление: я тоже пробовал

hr = iRange->Select(vResult);

Это возвращает S_OK, но не выбирает диапазон. Обычно я не могу напрямую вызывать функции в структуре iRange; результат - нарушение gpf или доступа - поэтому я должен использовать функцию autowrap (для запуска вызова Invoke). Я не удивлен, что этот звонок не работает.

Я также попытался открыть файл excel в режиме, отличном от ReadOnly, на случай, если меня заблокируют. Это не решило проблему. Я могу выбрать отдельные ячейки, получив один элемент (ячейку) из диапазона и вызвав его Select, но я не могу выбрать диапазон.

1 ответ

Решение

Я нашел ответ на этот вопрос. Эта проблема возникает только при использовании в образце DSOFRAMER (Microsoft KB 311765). DSOFramer - это универсальный элемент управления ActiveX для встраивания документов MS Office. Проблема также возникает только в отладочной сборке; Выпуск сборок в порядке.

Я также нашел обходной путь, который работает при выпуске или отладочной сборке: получить любую ячейку в диапазоне (используя get_Item), затем вызвать select для этого элемента, а затем снова выбрать, чтобы отменить его выбор. Как только это будет сделано, выбор может быть вызван в диапазоне. Очевидно, что select не может быть вызван в диапазоне, если ячейка уже выбрана (или, возможно, если состояние выбора не определено).

Другие вопросы по тегам