#excel #vba
#excel #vba
Вопрос:
У меня есть проект с сотрудниками (от 1 до 8 сотрудников) и их ежемесячный график, и у меня есть 2 (или более) рабочих должности. Их номера сдвига равны 1,2 и 3. Допустим, S1 — это 1-я запись, а S2 — вторая. Сотрудники с 1 по 4 обычно запланированы для S1 и 5-8 для S2. Когда мне нужен сотрудник из S1 для работы в смену на S2, я помещаю эту смену в его строку S1 с индикатором (например, 2 S02), и у меня есть второй лист, в котором указаны все смены с индексом / совпадением (Мне нужно, чтобы вся программа была в одной строке, чтобы я мог выполнить некоторые другие вычисления на 2-м листе). Затем на 1-м листе у меня есть все сотрудники на обеих должностях (так что обе должности имеют 8 строк), с дополнительными строками для каждой, скрытыми с помощью функции counta и фильтра 0/1, которые содержат простую функцию if, которая возвращает только номер смены, а не индикатор должности. Эти строки считывают значение со второго листа и возвращают сдвиг, который вставляется в другой записи, поэтому, когда отфильтрованное значение счетчика становится 1, у меня есть команда vba, которая выполняет повторное применение фильтра каждый раз, когда вставляется значение, поэтому появляется строка. Такой подход делает рабочую книгу слишком медленной при работе со 100 сотрудниками и 20 должностями. Есть ли способ отобразить строки с помощью другого более легкого метода?
На 1-м рисунке вы можете видеть, как выглядит лист без фильтрации, а на 2-м — как он выглядит отфильтрованным.
Команда VBA, которую я использую, выглядит следующим образом:
Private Sub Worksheet_Change(ByVal Target As Range)
Sheets("SHIFTS").AutoFilter.ApplyFilter
End Sub
Заранее спасибо.
Комментарии:
1. Пожалуйста, отредактируйте свой вопрос, добавив «команду» VBA, которая у вас уже есть.
Ответ №1:
Полагаю, я понимаю вашу проблему: в настоящее время при каждом изменении вашего рабочего листа (то есть при заполнении каждой ячейки) автофильтр применяется повторно, что сильно замедляет работу вашего файла Excel.
Я вижу два возможных результата для этого:
-
Либо вы предвидите какую-то форму, в которой люди могут вводить все значения для определенного сотрудника, и когда они нажимают кнопку «Ок», значения заполняются, а затем вы повторно применяете фильтр. (Очевидно, это означает, что вам нужно удалить упомянутый макрос).
-
Либо вы упоминаете, что автофильтр необходимо применять только в случае ввода определенного значения (скажем, столбец «E»), это можно сделать следующим образом:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 5 'Column "E" stands for .Column number 5 Then Sheets("SHIFTS").AutoFilter.ApplyFilter End If End Sub
Комментарии:
1. 1-е — это то, что я сейчас делаю, но это нелегко для других коллег, которые используют форму и не имеют знаний Excel, кроме ввода значений. Второй я действительно не понимаю. Вы предлагаете добавить столбец, в котором я должен хранить все конкретные значения? Потому что это невозможно, поскольку существуют бесконечные комбинации. В любом случае я искал другой подход к добавлению дополнительных строк без их присутствия, но скрытый, потому что, например, для 120 сотрудников и 20 должностей мне нужен лист с 4000 строк, большинство из них с функциями, поэтому лист становится слишком тяжелым даже без макроса VBA. Спасибо.
2. @RagnarNightwalker: возможно, это не тот ответ, который вы ищете, но зачем вам все равно повторно применять этот автофильтр и автоматически? Вы можете рассказать клиентам, как запустить автофильтр, вы можете создать кнопку, которая включает автофильтр, …, но я не понимаю, зачем вам нужно проходить все эти проблемы, просто чтобы показать что-то такое простое, как автофильтр.
3. Потому что, когда нам нужно создать расписание на целый месяц, и нам нужно регулярно переводить сотрудников с должности на должность, 1 ошибка при повторном применении фильтра (забыта или что-то в этом роде) может привести к большому количеству потраченных впустую рабочих часов. Лучше перестраховаться, чем потом сожалеть. Вот почему мне нужны дополнительные строки, появляющиеся мгновенно.