Finalmente, tengo una solución. Muchísimas gracias a Monomeeth por la versión de VBA que me puso en el camino correcto. (Y también es posible hacer esto en Windows)
Funciona de manera similar a la versión de Monomeeth. Tiene un rango considerado por razones de rendimiento. Configúralo 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