Если вы используете возможности Excel по проверке данных, вы можете ограничить содержимое ячейки на основе содержимого другой ячейки. Например, вы можете легко ограничить содержимое ячейки A2 на основе даты, которая находится в ячейке A1. Выполните следующие действия:

  1. Выберите ячейку A2.

  2. Выберите «Проверка» в меню «Данные». Excel отображает диалоговое окно «Проверка данных».

  3. Убедитесь, что отображается вкладка «Настройки». (См. Рис. 1.)

  4. В раскрывающемся списке Разрешить выберите Дата.

  5. В раскрывающемся списке «Данные» выберите «Больше или равно».

  6. В поле Дата начала введите = A1. Это сообщает Excel, что дата должна быть больше или равна дате в ячейке A1.

  7. Щелкните ОК.

Теперь каждый раз, когда вы пытаетесь ввести дату в ячейку A2, которая предшествует дате в ячейке A1, Excel отображает сообщение об ошибке и не позволяет ввести дату.

Однако что происходит, когда вы хотите ограничить даты, которые можно ввести в ячейку A1? Например, если вы поместите дату 01.04.04 в ячейку A1 и хотите убедиться, что следующая дата, введенная в A1, наступит не ранее, чем 01.04.04. Если вы поместите дату, например, 15 апреля 2004 года, в ячейку A1, это будет нормально, но в следующий раз, когда вы введете дату в ячейку A1, вы не захотите, чтобы она была раньше 15 апреля 2004 года. Другими словами, вы хотите убедиться, что ячейка A1 может принимать только даты, более поздние, чем дата, текущая в A1.

Это немного более липко. Если вы выполните указанные выше действия, но выберите ячейку A1 на шаге 1, проверка данных не будет работать. Зачем? Поскольку дата, которую вы вводите в ячейку A1, всегда будет больше или равна дате, которую вы вводите в A1, Excel не сравнивает с предыдущей датой в ячейке A1 при проверке данных.

Единственный способ решить эту проблему — использовать два макроса. Сначала поместите следующий макрос в обычный модуль:

Sub Date_Validation()

Dim dteDate As Date     Dim strDate As String

With Range("A1")

'   Memo original date         dteDate = CDate(.Text)

'   Create date string         strDate = Format(dteDate, "m\/d\/yy")

With .Validation         '   Delete old settings             .Delete         '   Set new data validation             .Add _               Type:=xlValidateDate, _               AlertStyle:=xlValidAlertStop, _               Operator:=xlGreaterEqual, _               Formula1:=strDate

.IgnoreBlank = False             .InCellDropdown = True             .InputTitle = ""

.ErrorTitle = "Invalid Date Entry"

.InputMessage = ""

.ErrorMessage = _               "Date is older than the previous date (" & _               dteDate & ")."

.ShowInput = True             .ShowError = True         End With     End With End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next     If Target = Range("A1") Then Date_Validation End Sub

Очень интересно то, как работают эти макросы. Поскольку вы помещаете последний в окно кода рабочего листа, он срабатывает каждый раз, когда в рабочий лист вносятся изменения. Если изменяемая ячейка — A1, запускается макрос Date_Validation.

Макрос Date_Validation получает дату из ячейки A1 и создает для нее правило проверки данных. Это все, что он делает — устанавливает правило проверки данных, которое не позволяет вводить дату в ячейку, которая раньше даты, которая в данный момент находится в ячейке.

Прелесть макроса заключается в том, что после того, как правило проверки данных вступает в силу, при следующем изменении ячейки A1 правило проверки данных срабатывает до запуска события Worksheet_Change. Таким образом, правило проверки данных гарантирует, что можно ввести только дату, большую, чем текущая. Как только проверка данных очищена, макрос выполняет сброс правила проверки данных, чтобы оно сравнивалось с вновь введенной датой.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (2960) относится к Microsoft Excel 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Excel (Excel 2007 и новее) здесь:

link: / excelribbon-Limiting_Entry_of_Prior_Dates [Ограничение ввода предыдущих дат].