Як можна повторно сортувати дані після відкриття файлу?


1

У мене є робоча книга з даними, які я хотів би повторно сортувати (випадково, якщо це важливо) щоразу, коли робоча книга відкривається. (Наприклад, повторне сортування за стовпцем B, генерованим a rand() виклику, у робочій книжці, зображеній нижче, кожен раз, коли файл відкривається.)

enter image description here

Я не скрипт wiz, але це не здається, що ні

досить потрапити туди. (Якщо я читаю правильно, вони говорять про оновлення речей, коли активність виконується в аркуші: для моєї мети важливо, щоб повторне сортування відбувалося, коли лист буде відкрито.)

Я припускаю, що є щось подібне до чотирьох рядків, які я міг би написати, але я не знаю, як це зробити.

Як я можу повторно відсортувати робочу книгу на відкритому файлі?

[Excel версія 14.0.7180.5002, частина офісу 2010.]


У випадку, якщо хтось цікавиться, використання: я надсилаю список моїй громаді списку кандидатів для голосування; Я хотів би, щоб список був представлений випадково, щоб не ухилятися від голосів до вершини стека. (Є більше ста кандидатів і лише один голос.)

Відповіді:


3

У VBA це можна зробити за допомогою одного рядка коду в одній підпрограмі:

Private Sub Workbook_Open()

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

End Sub

(Замінити кожен екземпляр "sheet1" на ім'я робочого листа (не робочої книги))

Пояснення Леймана: подія Workbook_Open відбувається, коли робоча книга Excel відкривається і запускається один раз. В межах одного рядка коду в основному кажуть: Використовуйте метод сортування на цій ділянці комірок, заснований на стовпці B. Сортування результатів за зростанням. Ігнорувати верхній рядок, оскільки це заголовок.

Зауважте, що значення у стовпці B не відображатимуться. Це відбувається тому, що Excel перераховує функцію rand () двічі - один раз, коли робоча книга відкривається, і один раз, коли дані сортуються. Ви можете додати більше коду, щоб контролювати, коли відбуваються розрахунки, але у вашому випадку це не має значення; кінцевим результатом є те, що імена знаходяться у випадковому порядку.

Поетапно, як це зробити:

  1. Збережіть вашу книгу як робочу книгу, яка підтримує макрос. Файл & gt; Зберегти як & gt; Змінити "Зберегти як тип" у випадаючому меню "Excel Macro Enabled Workbook (* .xlsm).

  2. Увімкніть вкладку розробника. Файл & gt; Параметри & gt; Налаштувати стрічку & gt; Відмітьте "Розробник" під основними вкладками. Натисніть OK.

  3. Вкладка розробника & gt; натисніть кнопку "Visual Basic". Відкриється нове вікно. Клацніть правою кнопкою миші на "ThisWorkbook" і клацніть лівою кнопкою миші "Переглянути код".

  4. Вставте підпрограму в область коду справа. Змініть назву об'єкта аркуша з аркуша1 на будь-який інший. Збережіть, закрийте, знову відкрийте, і ви побачите, як імена випадково сортують.

Що стосується під-капот речі і внутрішні роботи VBA, Є багато ресурсів в Інтернеті. На жаль, я все ще роблю трохи про це в моєму професійному житті, і "Мастеринг VBA для Microsoft Office 2010" від Sybex як хороший довідник.


1

Якщо ви хочете уникнути використання VBa, найпростішим рішенням є використання зведеної таблиці.

Виберіть стовпці, вставте зведену таблицю в новий аркуш, розташуйте стовпці "Таблична форма" і використовувати ручний фільтр ( спускаючись або висхідний , це неважливо) на одному з випадковим номером, потім перейдіть на вкладку Параметри (зведеної таблиці), виберіть Опції та знайдіть вкладку Дані, натисніть " актуалізувати дані про відкриття ".

Ви можете приховати перший аркуш, що містить вихідні дані, якщо хочете.

Voilà!

Кожен раз, коли ви відкриваєте файл, змінна таблиці буде змінена.


Я додав у відповідь відповідні посилання. Заплутана частина полягає в тому, що вони є декількома місцями, які називаються "дані" або "опції" тощо.
P. O.

1

Ще одна альтернатива для розгляду (VBA-free).

Припускаючи, що оригінальний список є $H$2:$H$7, і формулу комірки в діапазоні $B$2:$B$7 є RAND(), Введіть формулу

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

в A2 і скопіюйте / вставте клітинку A3:A7 і зберегти файл.

Список у A2:A7 буде повторно сортовано кожного разу, коли відкрито.

enter image description here

Але зверніть увагу, що він буде також повторно сортуватися кожен раз, коли $B$2:$B$7 перераховується.

Ви можете перемістити статичний список з перегляду (на іншому аркуші, / hide / protect і т.д.).

Коментар: частина з FLOOR() функції

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

було додано на всякий випадок, щоб гарантувати унікальність випадкових клавіш шляхом приєднання унікального "хвоста" до кожного випадкового значення.

Редагувати

Краще ввести формулу в A2 як формула масиву ( Ctrl + Shift + Enter ). Дивно, але це не має помітної різниці Excel або LibreOffice Calc, але з Gnumeric тільки форма масиву працює належним чином.

Редагувати 2

Це ще простіше формула масиву ( Ctrl + Shift + Enter ) поставити A2:

=INDEX($H$2:$H$7,1+SUM(1*($B$2:$B$7&$H$2:$H$7<B2&H2)))

Це просто завантаження від того, що rand() значення перераховуються на відкритому файлі? (Факт, який я не знаю, але, можливо, є правдою?) Якщо так, то чому б не піти randbetween(1,$NUMBER_MUCH_LARGER_THAN_NUMBER_OF_TERMS_TO_BE_RANDOMIZED) замість масштабування + підлога & amp; c.
nitsua60

@ nitsua60: rand() перерахунок виглядає як найбільш вірогідне пояснення. Як для randbetween() і т.д. - коментар був лише для того, щоб відзначити, що будь-який інший спосіб створення унікального ключа - прекрасний.
g.kov

0

Так що випадково робить його трохи більш цікавим. Колонка А в цьому прикладі ( 1 st column) є = rand (), і ви знаходитесь на аркуші Перерви с 10000 лінії

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.