Wie kann ich meine Auswahl in Microsoft Excel mit AppleScript umkehren? (Auswahl selbst, nicht Eigenschaften der Auswahl)

Ich möchte meine Auswahl mit AppleScript umkehren. Dies ist analog zur Funktionalität von Adobe Photoshop (und anderen Adobe-Produkten) „Auswahl umkehren (Strg/Cmd + I, um die zuvor ausgewählte Auswahl aufzuheben und auszuwählen, was nicht ausgewählt war)“

  1. Ich kann eine Gruppe von Zellen mit AppleScript auswählen.
  2. Ich kann den ausgewählten Bereich mit AppleScript abrufen
  3. Ich kann ausgewählte Zellen loopen
  4. Ich möchte alle Zellen auswählen, die derzeit nicht ausgewählt sind

Code

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

Ursprünglich ausgewählte Zellen

Geben Sie hier die Bildbeschreibung ein

Gewünschte Auswahl

(Alle Zellen im Blatt werden ausgewählt, die ursprünglich nicht ausgewählt waren)Geben Sie hier die Bildbeschreibung ein

Wenn wir über das Festlegen einer Füllfarbe sprechen, kann „eine Auswahl umkehren“ zwei verschiedene Dinge bedeuten. Ist Ihr Ziel, die Textfarbe mit der Hintergrundfarbe in jeder ausgewählten Zelle auszutauschen? Oder versuchen Sie, einen Satz von Zellen auszuwählen, der derzeit nicht ausgewählt ist (und umgekehrt)? Wo soll das enden? (Möchten Sie in Ihrem Beispiel-Screenshot, dass Ihre invertierte Auswahl über H18, oder über ? hinausgeht H20? Wie wäre es mit A200? ZZ999? XFD1048576?)
@Synoli "einen Satz von Zellen festlegen, der derzeit nicht ausgewählt ist" (und umgekehrt) Die Auswahl kann aus beliebigen Zellen in einer bestimmten Reihenfolge bestehen, daher die ungleichmäßige Auswahl in meinem Beispiel. Wenn es schön und ordentlich wäre, könnte ich es leicht programmieren.
Müsste also in Ihrem Beispiel H20 ausgewählt werden oder nicht?
@Synoli Ja, weil es im Bereich des Nichtausgewählten liegt.
Vielleicht fehlt mir etwas, aber wenn Sie meine Auswahl umkehren, möchten Sie, dass Excel die Textfarbe mit der Hintergrundfarbe austauscht (wie Synoli gefragt hat) oder möchten Sie nur, dass die Zelle eine bestimmte Farbe schattiert?
Ich greife diese Frage noch einmal auf und habe mich gefragt, ob ich den gesamten Code und nicht nur das Snippet teilen könnte?
Oh! Habe gerade deine neueste Bearbeitung gelesen und jetzt ergibt es für mich Sinn! Danke schön. :)
Ok, ich habe zwei Fragen an Sie: (1) Welche Version von Excel verwenden Sie? (2) Muss die Lösung AppleScript verwenden? Ein bisschen Kontext hinter meinen beiden Fragen ... Ich glaube, ich habe erreicht, was Sie wollen, indem ich die integrierte Visual Basic-Unterstützung von Excel verwende. Je nach Version von Excel ist dies jedoch möglicherweise nicht relevant, und wenn Sie die Lösung in AppleScript benötigen, ist dies ebenfalls nicht relevant. :)
@Monomeeth Ich arbeite in einer Unternehmensumgebung mit mehreren Versionen. Die neueste Version würde jedoch ausreichen. Offensichtlich wurden die Parameter der Frage festgelegt, sodass Visual Basic nicht die "akzeptierte" Antwort wäre, aber dennoch denke ich, dass es für andere sehr nützlich wäre und vielleicht einen Hinweis zur Lösung des Problems in AppleScript liefern würde. Ich würde empfehlen, Ihre vorhandene Antwort zu ändern, da sie dann für die Frage gelten würde.

Antworten (2)

Endlich habe ich eine Lösung. Vielen Dank an Monomeeth für die VBA-Version, die mich auf den richtigen Weg gebracht hat. (Und dies auch unter Windows möglich machen)

Funktioniert ähnlich wie die Version von Monomeeth. Es hat einen Bereich, der aus Leistungsgründen berücksichtigt wird. Stellen Sie es ein, indem Sie diese Zeile entsprechend ändern:

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

Hier ist es:

-- 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

Ich habe eine Weile an dieser Frage gearbeitet und, als ich auf eine Mauer stieß, beschlossen, es stattdessen mit Visual Basic zum Laufen zu bringen. Ich hoffe, dass es dadurch einfacher wird, den Code in AppleScript richtig hinzubekommen, also teile ich den Visual Basic-Code, falls er jemand anderem hilft, eine AppleScript-Version zum Laufen zu bringen - nicht, dass ich das selbst aufgegeben hätte noch! :)

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

ANMERKUNGEN:

  • Ich bin auf ein Problem gestoßen - nämlich, dass ich keinen Weg finden konnte, dies auf das gesamte Blatt anzuwenden, ohne dass Excel extrem lange hängen bleibt (wahrscheinlich, weil es 1.048.576 Zeilen und 16.384 Spalten überprüfen muss). dazu.
  • Um dieses Problem zu umgehen, habe ich Set s2 = Range("A1:Z100")den Bereich des Blattes, auf den sich der Code bezieht, auf den Bereich von A1:Z100 begrenzt. Dies kann jedoch bei Bedarf an eine größere Fläche angepasst werden.
  • Ich kann mir vorstellen, dass der Versuch, das gesamte Blatt abzudecken, auch in AppleSCript ein Problem sein wird.
Diese Antwort geht nicht auf die Frage ein.
@macmadness86 Ich denke, nicht nur ich verstehe nicht, was um alles in der Welt du fragst. Könntest du es etwas klären und dann hier einen Kommentar hinterlassen, damit ich es mir genauer ansehen kann?
@ macmadness86 Vielleicht hätte ich etwas klarer sein sollen, aber was ich wirklich mit dem Satz gemeint habe Wenn ich deine Frage völlig falsch verstanden habe, lass es mich bitte wissen, war es für dich, die Frage tatsächlich zu klären, anstatt mir nur zu sagen, dass meine Antwort nicht stimmt. nicht ansprechen. Wenn es Ihnen nichts ausmacht, könnten Sie Ihre Frage vielleicht so bearbeiten, dass sie zwei Screenshots (einen davor, einen danach) enthält, damit wir wissen, was der Code tun soll. Versuchen Sie nicht, schwierig zu sein, sondern versuchen Sie, dies zu klären, damit Ihnen jemand helfen kann. :)
Ich dachte, Synoli hat die Frage in den Kommentaren ziemlich gut geklärt. Und ich habe meine Frage angepasst, um sie kurz nach Synolis Kommentaren klarer zu machen. Ich kann natürlich einen Screenshot hinzufügen, der das gewünschte Ergebnis zeigt.