Как перебрать выделенные ячейки в Excel с помощью Applescript?

В VBA я могу сделать что-то вроде этого, чтобы пройтись по выбранным ячейкам в Excel:

for each c in Selection
   ' do things
next

Я пытаюсь сделать то же самое в AppleScript, но я, кажется, никуда не денусь. Я получаю текущую ячейку, но даже когда я делаю

set c to count of selection

В результате c устанавливается на 0.

Руководство по использованию appleScriptcript, похоже, не помогает и не ищет Google.

Спасибо

3 ответа

Решение

Оказывается, вы должны использовать "count count", чтобы получить количество ячеек в выделении. Как только вы попали туда, это просто - вот так:

tell application "Microsoft Excel"
    repeat with j from 1 to count large of selection
         -- do stuff with the cell
         set value of cell j of selection to "cell_" & j
    end repeat
end tell

Для того, чтобы туда добраться, мне пришлось сделать

tell application "Microsoft Excel"
   set c to properties of selection
end tell
return c

и затем просмотрите список свойств, пока я не нашел перспективный. Это был хороший способ попасть в список недвижимости. Может быть, есть более быстрый способ в редакторе AppleScript, но я человек командной строки.

Вы можете попробовать что-то вроде этого:

tell application "Microsoft Excel"
    set range1 to range "A1:A5"
    set value of range1 to {{1.0}, {2.0}, {3.0}, {4.0}, {5.0}}
    set range2 to range "B1:B5"
    set value of range2 to {3}

    repeat with i from 1 to 5
        set formula of row i of column 3 to "=A" & i & "+B" & i
    end repeat
end tell

Вы можете прочитать больше здесь

Вы также можете попробовать:

set cellCount to count of (cells of selection)

Это, очевидно, старый вопрос, но я думаю, что он хороший, и в одном из комментариев поднимается вопрос о сложном выборе. Итак, вот несколько способов, которыми вы можете подойти к этому с Mac Excel (2011 в моем случае). Обработки ошибок нет, но внизу есть скрипт, который предварительно заполнит рабочий лист для демонстрационных целей. В зависимости от того, насколько велик ваш выбор, он может вылететь.

Во-первых, вы можете сделать очень простую вещь: подсчитать выбранные ячейки. Это должно работать как с простыми, так и со сложными выделениями.

      tell application "Microsoft Excel" to count of cells of selection

Выбор одной области

Во-вторых, если у вас простое выделение, то все равно не слишком многословно что-то делать с ячейками. Для тестирования здесь он работает с диапазоном 2x2.

      tell application "Microsoft Excel"
    select range "D2:E3"
    set c to selection
    value of areas of c
    --> {{7.0, 21.0}, {8.0, 24.0}} -- note hierarchy
    
    set voop to {}
    set ab to count of cells in c
    repeat with x from 1 to ab
        set end of voop to value of cell x of c as integer
    end repeat
    
    voop
    --> {7, 21, 8, 24} -- note absence of hierarchy
end tell

Выбор нескольких областей

В-третьих, вот метод, который будет работать как со сложными, так и с простыми выделениями. Опять же, скрипт внизу будет заполнен подходящим примером данных.

areas of selectionвозвращает список выбранных диапазонов. Это всегда список, поэтому даже если у вас всего один диапазон (или даже одна ячейка), вы получите список. Имея это в виду, это перебирает список выбранных диапазонов, а затем каждую ячейку в каждом диапазоне. Сценарий объемнее, чем должен быть, потому что я включил несколько примеров того, что вы можете делать, а также делать выборку и возвращать результаты.

      tell application "Microsoft Excel"
    activate
    -- make complex selection
    set aran to range "A:B 3:4"
    set bran to range "D2:E3"
    set cran to range "G5:H7"
    select (union range1 aran range2 bran range3 cran)
    
    with timeout of 10 seconds
        set c to areas of selection
        --> {range "[Workbook1]Sheet1!$A$3:$B$4" of application "Microsoft Excel", range "[Workbook1]Sheet1!$D$2:$E$3" of application "Microsoft Excel", range "[Workbook1]Sheet1!$G$5:$H$7" of application "Microsoft Excel"}
        
        set voop to {} -- value
        set coop to {} -- cell address
        
        repeat with euRg in c -- each range area
            set ceuRg to cells of euRg -- hierarchical cell list -- critical step!
            repeat with xy in ceuRg -- each cell in range area
                -- do random stuff with each cell
                copy contents of xy to end of coop
                copy value of xy as integer to end of voop
                set value of xy to ((value of xy) / 2)
            end repeat
        end repeat
        
        -- do more random stuff
        set AppleScript's text item delimiters to space
        display dialog voop as text -- display original values
        --> 8 66 6 44 7 21 8 24 1 2 3 4 5 6
        coop -- flattened cell list
        --> {cell "$A$3" of application "Microsoft Excel", cell "$B$3" of application "Microsoft Excel", cell "$A$4" of application "Microsoft Excel", cell "$B$4" of application "Microsoft Excel", cell "$D$2" of application "Microsoft Excel", cell "$E$2" of application "Microsoft Excel", cell "$D$3" of application "Microsoft Excel", cell "$E$3" of application "Microsoft Excel", cell "$G$5" of application "Microsoft Excel", cell "$H$5" of application "Microsoft Excel", cell "$G$6" of application "Microsoft Excel", cell "$H$6" of application "Microsoft Excel", cell "$G$7" of application "Microsoft Excel", cell "$H$7" of application "Microsoft Excel"}
        
    end timeout
end tell

Предварительно заполнить выборки

      tell application "Microsoft Excel"
    activate
    set value of range "A:B 3:4" to {{8, 66}, {6, 44}}
    set value of range "D2:E3" to {{7, 21}, {8, 24}}
    set value of range "G5:H7" to {{1, 2}, {3, 4}, {5, 6}}
end tell
Другие вопросы по тегам