Автоматизация Excel. Нужно выбрать несколько предметов из диапазона
У меня есть код, который позволяет мне выбрать один элемент в Arange:
COleVariant vItems = cstrAddr;
hr = AutoWrap(
DISPATCH_PROPERTYGET,
&vCell,
irange,
L"Item",
2,
COleVariant((short)(1)),
COleVariant((short)(1)));
if (FAILED(hr)) return hr;
// Use the dispatch interface to select the cell
COleVariant result;
hr = AutoWrap(
DISPATCH_METHOD,
&result,
vCell.pdispVal,
L"Select",
0);
if (FAILED(hr)) return hr;
Это отлично работает. Однако мне нужно выбрать все ячейки в диапазоне, но я не смог найти способ указать это в вызове get для свойства Item. Попытался использовать -1,-1... попытался передать пару bstr в 2 вариантах, указав разделенный двоеточиями диапазон столбцов и диапазон строк; также попытался передать один параметр строки спецификации диапазона. Никто не работал.
Обновление: я тоже пробовал
hr = iRange->Select(vResult);
Это возвращает S_OK, но не выбирает диапазон. Обычно я не могу напрямую вызывать функции в структуре iRange; результат - нарушение gpf или доступа - поэтому я должен использовать функцию autowrap (для запуска вызова Invoke). Я не удивлен, что этот звонок не работает. Надеюсь, я смогу заставить это работать... это последняя часть этого проекта.
2 ответа
Я нашел ответ на этот вопрос. Эта проблема возникает только при использовании в образце DSOFRAMER (Microsoft KB 311765). DSOFramer - это универсальный элемент управления ActiveX для встраивания документов MS Office. Проблема также возникает только в отладочной сборке; Выпуск сборок в порядке.
Я также нашел обходной путь, который работает при выпуске или отладочной сборке: получить любую ячейку в диапазоне (используя get_Item), затем вызвать select для этого элемента, а затем снова выбрать, чтобы отменить его выбор. Как только это будет сделано, выбор может быть вызван в диапазоне. Очевидно, что select не может быть вызван в диапазоне, если ячейка уже выбрана (или, возможно, если состояние выбора не определено).
Не знакомый с кодом такого типа (в VB автоматизацию намного проще) Я думаю, что в вашем примере вы выбираете одну ячейку из диапазона, используя свойство Item и метод Select. Правильный?
Так что в VB
Dim oRange as Range
Dim oCell as Range
Set oRange = WorkSheet.Range("A1:A10") '<-- get range
Set oCell = oRange.Item(1) '<-- returns first cell in range
oCell.Select '<-- selects first cell
Проблема в том, что свойство Item возвращает только одну ячейку - вы должны применить метод Select к исходному диапазону.
Dim oRange as Range
Set oRange = WorkSheet.Range("A1:A10") '<-- get range
oRange.Select '<-- Selects the range