2015-08-11 6 views
1

Это должно быть сделано без VBA.Динамическое изменение количества дней в месяц для выпадающего списка

У меня есть список месяцев, которые нужно заполнить в одной ячейке, скажем, A1. Параметры могут быть заполнены с помощью Data Validation-List (= Months), что приводит к появлению выпадающего списка в A1. В ячейке B1 введите номер года (например, 2000). Теперь я хочу, чтобы C1 содержал выпадающий список, записи, в которых изменения основаны на данных в A1 и B1. В моем примере А1 предлагает выборы январь, февраль, марш, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь и декабрь.

Если я выбираю январь или марш или май или август или октябрь или декабрь (месяцы с 31 днем), я должен получить номера от 1 до 31 в качестве опции в C1.

Если я выбираю апрель или июнь или сентябрь или ноябрь (месяцы с 30 днями), я должен получить номера от 1 до 30 в качестве опции в C1.

Если я выбираю февраль, я должен сначала проверить, если год високосный год с этой формулой:

=((MOD(B1;4)=0)*((MOD(B1;100)<>0)+(MOD(B1;400)=0))=1) 

и на основе результата этой формулы (TRUE или FALSE), я должен получить число от 1 до 28 (или 29, если это високосный год) в качестве опции в C1.

Я создал списки под названием Days30, Days31, Days28 и Days29. Как я могу использовать Data Validation для переключения между этими списками для моего выпадающего списка в C1 ?? Я пытаюсь перевести эту логику в формулу валидации данных, но не повезло:

If (A1 = "april" OR A1 = "june" OR A1 = "september" OR A1 = "november") Then 
    Days30 
ElseIf (A1 = "february" AND leapyear = 1) Then 
    Days29 
ElseIf (A1 = "february" AND leapyear = 0) Then 
    Days28 
Else     
    Days31 
End if 

ответ

3
  1. В Z1 поставить эту формулу,
     
      =DAY(DATEVALUE(A$1&" "&ROW(1:1)&", "&B$1))
     
  2. В Z2 поставить эту формулу,
     
      =IFERROR(IF(MONTH(DATEVALUE(A$1&" "&ROW(1:1)&", "&B$1))=MONTH(DATEVALUE(A$1&" "&ROW(2:2)&", "&B$1)), DAY(DATEVALUE(A$1&" "&ROW(2:2)&", "&B$1)), ""), "")
     
      ... и заполните до Z31.
  3. Перейти к формулам ► Определенные имена ► Менеджер имен. Когда откроется диалоговое окно «Диспетчер имен», нажмите Новый.
  4. Дайте ему имя (например, lstDOM), оставьте его в рамках рабочей книги и поставить следующие за Обозначает:  
      =Sheet1!$Z$1:INDEX(Sheet1!$Z:$Z, MATCH(1e99, Sheet1!$Z:$Z))  
     
      dynamic named range  
     
  5. Нажмите OK создать динамический именованный диапазон затем Закрыть.
  6. С выбранным C1 выберите Данные ► Инструменты данных ► Проверка данных. Выберите «Разрешить: список и поставку» =lstDOM для источника :.

Ваши результаты должны быть похожи на следующие.

dynamic range days of month

+0

Jeeped, большое вам спасибо! Я так и не думал. Это самый крутой подход когда-либо :) – Vladimir

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

  • Нет связанных вопросов^_^