Автоматизация 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
Другие вопросы по тегам