Wie kann ich Daten neu sortieren lassen, wenn eine Datei geöffnet wird?

1

Ich habe eine Arbeitsmappe mit Daten, die ich bei jedem Öffnen der Arbeitsmappe nach dem Zufallsprinzip neu sortieren möchte. (Zum Beispiel die Sortierung nach Spalte B, erzeugt durch a rand() rufen Sie in der unten abgebildeten Arbeitsmappe jedes Mal auf, wenn die Datei geöffnet wird.)

enter image description here

Ich bin kein Script-Wiz, aber es scheint auch nicht so

ganz dort hin. (Wenn ich richtig lese, sprechen sie davon, Dinge zu aktualisieren, wenn eine Aktivität innerhalb des Arbeitsblatts ausgeführt wird: Für meinen Zweck ist es wichtig, dass die Sortierung beim ersten Öffnen des Arbeitsblatts erfolgt.)

Ich gehe davon aus, dass es so etwas wie ein vierzeiliges Skript gibt, das ich schreiben könnte, aber ich habe keine Ahnung wie.

Wie kann ich eine Arbeitsmappe bei geöffneter Datei neu sortieren?

[Excel-Version 14.0.7180.5002, Teil von Office 2010.]


Für den Fall, dass jemand neugierig ist, ist die Verwendung: Ich schicke meiner Gemeinschaft eine Liste mit einer Liste von Kandidaten, für die abgestimmt werden soll; Ich möchte, dass die Liste nach dem Zufallsprinzip präsentiert wird, um die Stimmen nicht nach oben zu streichen. (Es gibt über hundert Kandidaten und nur eine Stimme, die abgegeben werden kann.)

nitsua60
quelle

Antworten:

3

In VBA kann dies mit einer Codezeile in einem Unterprogramm erfolgen:

Private Sub Workbook_Open()

    Sheet1.Range("A:B").Sort Key1:=Sheet1.Range("B:B"), Order1:=xlAscending, Header:=xlYes

End Sub

(Ersetzen Sie jede Instanz von "sheet1" durch den Namen Ihres Arbeitsblatts (nicht der Arbeitsmappe).)

Erklärung von Layman: Das Workbook_Open-Ereignis tritt ein, wenn die Excel-Arbeitsmappe geöffnet wird und einmal ausgeführt wird. Dort lautet die eine Zeile Code im Wesentlichen: Verwenden Sie die Sortiermethode für diesen Zellenbereich basierend auf Spalte B. Sortieren Sie die Ergebnisse aufsteigend. Ignorieren Sie die oberste Zeile, da es sich um eine Kopfzeile handelt.

Beachten Sie, dass die Werte in Spalte B nicht sortiert angezeigt werden. Dies liegt daran, dass Excel die rand () - Funktion zweimal neu berechnet - einmal beim Öffnen der Arbeitsmappe und einmal beim Sortieren der Daten. Sie könnten mehr Code hinzufügen, um zu steuern, wann die Berechnungen stattfinden. In Ihrem Fall scheint dies jedoch keine Rolle zu spielen. Das Endergebnis ist, dass die Namen in zufälliger Reihenfolge sind.

Schritt für Schritt, wie man das zum Laufen bringt:

  1. Speichern Sie Ihre Arbeitsmappe als Makro-aktivierte Arbeitsmappe. Datei & gt; Speichern unter & gt; Ändern Sie die Dropdown-Liste "Dateityp" in "Excel Macro Enabled Workbook" (* .xlsm).

  2. Aktivieren Sie die Entwicklerregisterkarte. Datei & gt; Optionen & gt; Band anpassen & gt; Aktivieren Sie "Entwickler" unter den Hauptregisterkarten. Drücke OK.

  3. Registerkarte "Entwickler" & gt; Klicken Sie auf "Visual Basic". Ein neues Fenster öffnet sich. Klicken Sie mit der rechten Maustaste auf "ThisWorkbook" und klicken Sie mit der linken Maustaste auf "Code anzeigen".

  4. Fügen Sie das Unterprogramm in den Codebereich rechts ein. Ändern Sie den Namen des Arbeitsblattobjekts von Tabelle1 in den gewünschten Wert. Speichern, schließen, wieder öffnen, und Sie sollten die Namen nach dem Zufallsprinzip sortieren.

Was das Zeug unter der Haube und das Innenleben von VBA angeht, gibt es im Internet viele Ressourcen. Leider mache ich in meinem Berufsleben immer noch ein bisschen davon und habe "Mastering VBA for Microsoft Office 2010" von Sybex als eine gute Referenz.

BrianC
quelle
1

Wenn Sie die Verwendung von VBa vermeiden möchten, ist die einfachste Lösung die Verwendung einer Pivot-Tabelle.

Wählen Sie Ihre Spalten aus, fügen Sie eine Pivot-Tabelle in ein neues Blatt ein, ordnen Sie die Spalten an "Tabellenform" und verwenden Sie den manuellen Filter ( absteigend oder aufsteigend (es spielt keine Rolle). Wählen Sie auf der Registerkarte mit der randomisierten Nummer die Registerkarte Optionen (der Pivot-Tabelle) aus, wählen Sie Optionen aus, und suchen Sie nach der Unterregisterkarte Daten. Aktualisieren Sie die Daten beim Öffnen ".

Sie können das erste Blatt mit den Quelldaten ausblenden, wenn Sie möchten.

Voilà!

Bei jedem Öffnen der Datei wird die Pivot-Tabelle neu angeordnet.

P. O.
quelle
Ich habe die entsprechenden Links in meine Antwort eingefügt. Der verwirrende Teil ist, dass es sich um mehrere Orte handelt, die als "Daten" oder "Optionen" bezeichnet werden. Verwenden Sie die bereitgestellten Links.
P. O.
1

Noch eine weitere Alternative (VBA-frei).

Angenommen, eine Originalliste ist in $H$2:$H$7. und die Zellformel in einem Bereich $B$2:$B$7 ist RAND(). Geben Sie eine Formel ein

=INDEX($H$2:$H$7,SUMPRODUCT(--((FLOOR($B$2:$B$7*100000000,1)*0.00000001+(ROW($B$2:$B$7)-ROW($B$2))*0.000000001)<FLOOR(B2*100000000,1)*0.00000001))+1,1)

in A2 und kopiere / füge die Zelle in ein A3:A7 und speichern Sie die Datei.

Die Liste in A2:A7 wird bei jedem Öffnen neu sortiert.

enter image description here

Beachten Sie jedoch, dass es auch jedes Mal neu sortiert wird $B$2:$B$7 wird neu berechnet.

Sie können die statische Liste aus der Ansicht verschieben (auf dem anderen Blatt, / verstecken / schützen, etc).

Kommentar: der Teil mit dem FLOOR() Funktion

(FLOOR($B$2:$B$7*100000000,1)*0.00000001+(ROW($B$2:$B$7)-ROW($B$2))*0.000000001)

wurde hinzugefügt, um die Eindeutigkeit der Zufallsschlüssel zu gewährleisten durch Anhängen eines eindeutigen "Endes" an jeden Zufallswert.

Bearbeiten

Es ist besser, die Formel einzugeben A2 wie Matrixformel ( Ctrl + Verschiebung + Eingeben ). Überraschenderweise macht dies keinen Unterschied für Excel oder LibreOffice Calc. aber mit Gnumeric Nur das Array-Formular funktioniert einwandfrei.

Bearbeiten 2

Das ist noch einfacher Matrixformel ( Ctrl + Verschiebung + Eingeben ) einfügen A2:

=INDEX($H$2:$H$7,1+SUM(1*($B$2:$B$7&$H$2:$H$7<B2&H2)))
g.kov
quelle
Ist dies nur ein Bootstrapping von der Tatsache, dass die rand() Werte werden beim Öffnen der Datei neu berechnet? (Eine Tatsache, die ich nicht weiß, aber vielleicht ist sie wahr?) Wenn ja, warum nicht? randbetween(1,$NUMBER_MUCH_LARGER_THAN_NUMBER_OF_TERMS_TO_BE_RANDOMIZED) anstelle von Skalierung + Bodenbelag & c
nitsua60
@ nitsua60: rand() Neuberechnung scheint die plausibelste Erklärung zu sein. Wie für randbetween() etc - der Kommentar war nur zu beachten, dass jede andere Art, einen eindeutigen Schlüssel zu erstellen, in Ordnung ist.
g.kov
0

Das macht es zufällig ein bisschen interessanter. Spalte A in diesem Beispiel (die 1 st Spalte) ist = rand (), und Sie befinden sich im Arbeitsblatt Geht kaputt mit 10000 Zeilen

Private Sub Workbook_Open() 

 ActiveWorkbook.Worksheets("Breaks").AutoFilter.Sort.SortFields.Add Key:=Range _
        ("A1:A10000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Breaks").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub
Selkie
quelle