Excel — копирование определенных непустых ячеек с одного листа на другой

#excel #vba #copy

#excel #vba #Копировать

Вопрос:

У меня есть вопрос о копировании определенных непустых ячеек с одного листа Excel на другой. Обычно я бы использовал ИНДЕКС / СТРОКУ, но в этом случае мне нужно выбрать 1 из 3 ячеек, в зависимости от того, работает ли человек в обычное время, сверхурочно или в сменную смену, и скопировать эти часы в определенном формате на другой лист. Я подумал, что это может быть проще сделать с помощью VBA.

Ниже приведен конкретный пример:

Лист 1 В воскресенье 27/12/20 СОТРУДНИК 1 будет работать РОВНО 12.00 часов (BH14), и мне нужно скопировать эту информацию на Лист2 (I17).

На следующий день, в понедельник 28/12/20, СОТРУДНИК 1 будет работать в 12.00 часов в смену (на этот раз другой столбец — BJ74), и мне это нужно для ввода в Лист2 (J17).

Во вторник 29/12/20 СОТРУДНИК 1 будет работать в 10.00 часов СВЕРХУРОЧНО (столбец BI134), и мне нужно, чтобы это было внесено в Лист2 (K17).

Важно, чтобы часы, которые копируются в Лист2, оставались в том же формате — например, обычный (для ПЛОСКОГО), фиолетовый (для ПОДКАЧКИ) или синий (для СВЕРХУРОЧНОЙ РАБОТЫ).

Комментарии:

1. Используйте оператор if, чтобы проверить, пусто ли значение Flat, затем проверьте Swap, а затем Overtime. Возьмите то, что имеет значение, и вставьте с форматированием.

2. Привет, спасибо за ответ. В «Листе 2» мне нужно было бы сделать это для каждой ячейки, для каждого сотрудника, в течение всего года. Разве это не сильно замедлило бы работу всей электронной таблицы?

3. Оператор If будет выполняться очень быстро, например, увеличение на несколько миллисекунд для сотен тысяч строк. Если вы видите заметное замедление, значит, что-то еще мешает вам.

Ответ №1:

Я не уверен, в чем здесь проблема. Речь идет о принятии решения о том, о каком сдвиге идет речь? Как решить, какую копию куда?

Что касается копирования определенного формата, вы можете попробовать

1:

 Sheet1.Range(BH14).Copy
Sheet2.Range(I17).Select
ActiveSheet.Paste
 

2:

 Sheet2.Range(I17).Value = Sheet1.Range(BH14).Value 'You will copy value this way    Sheet1.Range(BH14).Copy 'copy the formatting (like colors)
Sheet2.Range(I17).PasteSpecial Paste:=xlPasteFormats 'paste the formatting <br>
Application.CutCopyMode = False   'clear memory
 

Комментарии:

1. Привет, спасибо за ответ. Значение должно быть скопировано в «Лист2», несмотря ни на что, или оставаться пустым, если у человека нет значения в «Лист1» за день. Наиболее важной частью является то, что в ‘Sheet2’ мне все еще нужно уметь различать обычную смену, сверхурочную работу и смену смены. У меня это основано на условном форматировании, и часы затем включаются в мой ежедневный итог — так что, если человек 1 работает 12 часов сверхурочно, а человек 2 тоже работает, у меня будет 24 часа сверхурочной работы в течение этого конкретного дня — вот почему форматирование так важно.

2. «Лист1» похож на ежедневный планировщик «задач», и на основе этого я получаю общее количество часов в обзорной части (годовой планировщик труда), которая называется «Лист2». Не уверен, имеет ли это смысл?

3. Привет, решение 2 также должно скопировать форматирование условия. Не могли бы вы поместить этот Excel на какой-нибудь Google диск?