Автоматизация Excel. Нужно выбрать несколько предметов из диапазона - PullRequest
2 голосов
/ 07 ноября 2008

У меня есть код, который позволяет мне выбрать один элемент в диапазоне:

        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 ]

1 голос
/ 14 ноября 2008

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

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

1 голос
/ 07 ноября 2008

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