¿Cómo puedo invertir mi selección en Microsoft Excel usando AppleScript? (selección en sí, no propiedades de selección)

4

Me gustaría invertir mi selección con AppleScript. Esto es análogo a la funcionalidad de Adobe Photoshop (y otros productos de Adobe) "Invertir selección (Ctrl / Cmd + I para anular la selección de lo que se seleccionó previamente y seleccionar lo que no se seleccionó)"

  1. Yo puedo seleccionar un grupo de células con AppleScript.
  2. Yo puedo ser seleccionado gama con AppleScript
  3. I puedo bucle de células seleccionado
  4. Me gustaría seleccionar todas las celdas que no están seleccionados actualmente

Código

tell application "Microsoft Excel"
    repeat with item_cell from 1 to count large of selection -- all cells in selection
        --do stuff with selected cells
    end repeat

    -- index of selected cells technique, not sure whether helpful
    set sel_range to selection
    tell selection to set {rowIndex, columnIndex, rowCount, columnCount} to {get first row index of sel_range, get first column index of sel_range, get count rows of sel_range, get count columns of sel_range}
end tell

Celdas seleccionadas originalmente

ingrese la descripción de la imagen aquí

Selección deseada

(Se seleccionan todas las celdas de la hoja que no se seleccionaron originalmente) ingrese la descripción de la imagen aquí

Jonathan Komar
fuente
Cuando hablamos de establecer un color de relleno, "invertir una selección" podría significar dos cosas diferentes. ¿Su objetivo es intercambiar el color del texto con el color de fondo en cada celda seleccionada? ¿O está intentando seleccionar un conjunto de celdas que no está seleccionado actualmente (y viceversa)? ¿Dónde quieres que esto termine? (En el ejemplo, pantalla, ¿le gustaría su selección invertida para ir más allá H18, o en el pasado H20¿Qué tal? A200? ZZ999? XFD1048576?)
Synoli
1
@Synoli "establece un conjunto de celdas si no está seleccionado actualmente" (y viceversa) La selección puede ser cualquier celda en un orden particular, de ahí la selección desigual en mi ejemplo. Si fuera agradable y ordenado, podría programarlo fácilmente.
Jonathan Komar
Entonces, en su ejemplo, ¿debería seleccionarse H20 o no?
Synoli
1
@Synoli Sí, porque se encuentra dentro del ámbito de los no seleccionados.
Jonathan Komar
Tal vez me falta algo, pero al invertir mi selección , ¿desea que Excel intercambie el color del texto con el color de fondo (como Synoli preguntó) o simplemente quiere que la celda esté sombreada en un color en particular?
Monomeeth

Respuestas:

1

Finalmente tengo una solución. Muchas gracias a Monomeeth por la versión VBA que me puso en el camino correcto. (Y haciendo posible hacer esto también en Windows)

Funciona de manera similar a la versión de Monomeeth. Tiene un rango considerado por razones de rendimiento. Configúrelo cambiando esta línea en consecuencia:

set range_considered to range "A1:Z100" of active sheet

Aquí está:

-- use "intersect" to test whether the considered area overlaps with the selected area
-- use union to append non-selected cells to a new range

tell application "Microsoft Excel"
    set screen updating to false -- optimize performance
    --tell active sheet of active workbook
    set range_considered to range "A1:Z100" of active sheet
    set range_selected to selection
    set range_new_selection to "Nothing"

    -- setup ref vars for selection
    tell selection to set {range_selected_row_index, range_selected_column_index, range_selected_row_count, range_selected_column_count} to {get first row index of selection, get first column index of selection, get count rows of selection, get count columns of selection}
    -- setup ref vars for considered
    tell selection to set {range_considered_row_index, range_considered_column_index, range_considered_row_count, range_considered_column_count} to {get first row index of range_considered, get first column index of range_considered, get count rows of range_considered, get count columns of range_considered}

    -- go column by column and iterate each row in each column
    repeat with considered_col_step from range_considered_column_index to range_considered_column_count
        repeat with considered_row_step from range_considered_row_index to range_considered_row_count
            set range_this_cell to range (get address row considered_row_step of column considered_col_step of active sheet) of active sheet
            log range_selected
            try
                set range_test to intersect range1 range_this_cell range2 range_selected -- test for intersection with selected
                (*use try to detect error. Will fail if cell is within selection*)
                log "TRUE Intersected"
            on error
                (*Create or append to range_new_selection*)
                log "FALSE intersected"
                if range_new_selection is "Nothing" then
                    set range_new_selection to range_this_cell
                else
                    set range_new_selection to union range1 range_new_selection range2 range_this_cell
                end if
            end try
        end repeat
    end repeat
    try
        select range_new_selection
    on error
        log "Could not select new range."
    end try
    set screen updating to true -- optimize performance
end tell
Jonathan Komar
fuente
1

He estado trabajando en esta pregunta durante un tiempo y, golpeando una pared de ladrillos, decidí intentar que funcionara con Visual Basic. Espero que hacer esto haga que sea más fácil obtener el código correcto dentro de AppleScript, así que comparto el código de Visual Basic en caso de que ayude a alguien más a tener una versión de AppleScript funcionando, no es que yo mismo haya renunciado a esto. ¡todavía! :)

Sub InvertSheet()

Set s1 = Selection
Set s2 = Range("A1:Z100")
Set sinv = Nothing

For Each s In s2
If Intersect(s, s1) Is Nothing Then
If sinv Is Nothing Then
Set sinv = s
Else
Set sinv = Union(sinv, s)
End If
End If
Next

If sinv Is Nothing Then
Else
sinv.Select
End If
End Sub

NOTAS

  • Encontré un problema, es decir, que no pude encontrar una manera de aplicar esto a toda la hoja sin que Excel se bloqueara durante períodos de tiempo extremadamente largos (probablemente porque tiene que verificar 1,048,576 filas y 16,384 columnas) para hacerlo
  • Para solucionar este problema, solía Set s2 = Range("A1:Z100")limitar el área de la hoja a la que se aplica el código al rango de A1: Z100. Sin embargo, esto se puede cambiar para adaptarse a un área más grande si es necesario.
  • Me imagino que tratar de cubrir toda la hoja también será un problema dentro de AppleSCript.
Monomeeth
fuente
Esta respuesta no aborda la pregunta.
Jonathan Komar
@ macmadness86 Creo que no soy solo yo quien no entiende lo que estás preguntando. ¿Te importaría aclarar un poco y luego dejar un comentario aquí para que pueda verlo más?
owlswipe
1
@ macmadness86 Tal vez debería haber sido un poco más claro, pero lo que realmente quise decir con la oración. Si no he entendido completamente su pregunta, hágamelo saber para que realmente aclare la pregunta, en lugar de decirme que mi respuesta no lo hace. t abordarlo. Si no le importa, quizás podría editar su pregunta para incluir dos capturas de pantalla (una antes y otra después) para que sepamos qué desea que haga el código. No tratando de ser difícil, solo tratando de aclarar esto para que alguien pueda ayudarlo. :)
Monomeeth
Pensé que synoli aclaró bastante bien la pregunta en los comentarios. Y ajusté mi pregunta para aclararla poco después de los comentarios de synoli. Puedo agregar una captura de pantalla que muestre el resultado deseado, claro.
Jonathan Komar