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 не может быть вызван в диапазоне, если ячейка уже выбрана (или, возможно, если состояние выбора не определено).