2016-11-25 2 views
0

У меня есть лист расписания на весь год для группы. В третьей строке есть все даты года, следующая пара строк имеет имя каждого члена группы.Вставить текст в ячейки, когда вышеуказанная ячейка соответствует условию

Члены, указанные в A4: A9. Праздники указаны в ячейках A20: A28.

Итак, что я хочу делать, вероятно, через VBA, это сделать правило вроде условного форматирования, которое вставляет слово «Праздник» в B4: B9, если B3 соответствует дате в A $ 20: A $ 28, и затем в C4: C9, если C3 соответствует и так далее.

Теперь я не могу написать это условие в каждой ячейке, так как это расписание, используемое каждым членом, что является предположением, которое я часто получал от googling, и я не могу это сделать с условным форматированием, поэтому я предполагаю, что VBA путь, но код VBA, который я нашел до сих пор, кажется, использует определенные ячейки и не будет проходить через каждый столбец.

+0

Добро пожаловать в StackOverflow. Обратите внимание, что это не бесплатный сервис написания кода, но мы готовы помочь другим программистам (и претендентам) написать собственный код. Пожалуйста, прочитайте разделы справки на странице [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask "How To"). Вы также можете принять [Tour] (http://stackoverflow.com/tour «Волшебный тайный тур») и заработать значок при этом. Впоследствии, пожалуйста, обновите свой вопрос с помощью кода VBA, который вы написали до сих пор, чтобы выполнить задачу (задачи), которую вы хотите достичь. Это можно запустить даже с помощью макроса. –

+0

Все, что вам нужно для решения вашей проблемы, - использовать выражения «для каждого» и «if ... then ... else». Вы можете прочитать о них в справке VBA (в Excel нажмите Alt + F11, затем F1). –

+0

@ EganWolf Я изучу его. Благодарю. –

ответ

0

Не подвергая сомнению своего общий подхода, простой код, который делает то, что вы планируете делать могут работать, как следующее:

Option Explicit 

Sub markhd() 

    ' get calendardays, holidays and employees somehow into collections 
    ' that can be looped. Since that information is stored in a worksheet, 
    ' using ranges is one way to achive that 

    ' holidays 
    Dim rhd As Range 
    Set rhd = ActiveSheet.Range("A20:A28") 

    ' group employees 
    Dim remp As Range 
    Set remp = ActiveSheet.Range("A4:A9") 

    ' calendar days 
    Dim rcal As Range 
    Set rcal = ActiveSheet.Range("B3:NB3") 

    Dim c As Object 

    ' Loop every day (every c-object in your calendar days), 
    ' then write "Holiday", if it matches an entry in your holiday-range 
    For Each c In rcal 
     If Not IsError(Application.Match(c, rhd.Cells, False)) Then 
      remp.Offset(0, c.Column - remp.Column).Value = "Holiday" 
     End If 
    Next c 

End Sub 

Примечание:

  • Концепция @EganWolf упоминается это искать аналогичные объекты (календарные дни в этом примере) и прокручивать их, выполняя действие (записывая «Праздник»), если проверка прошла (календарный день находится в диапазоне отпусков). Существует gazillion различных способов реализации этого, я просто разместил один простой пример:
  • Цикл каждого календарного дня мы делаем 365 итераций здесь, пытаясь сопоставить каждый календаря в 9 праздниках.
  • Однако мы могли бы сделать это наоборот: зацикливаем 9 праздников, сопоставим их в 365 календарных днях, поэтому цикл занимает всего 9 раз. Производительность теоретически может колебаться в обоих направлениях, поскольку, несмотря на меньшее количество итераций, одна итерация может занять больше времени ... но, очевидно, в 365 дней производительность - это всего лишь теоретическая проблема.

Надеюсь, что это поможет!

+0

Спасибо, это очень помогло. Производительность не является проблемой, это просто что-то, чтобы предотвратить слишком много ручного ввода. –

Смежные вопросы