#ms-access #vba
#ms-access #vba
Вопрос:
У меня есть поле даты с соответствующим столбцом datetime, и я хочу иметь возможность вводить строку относительной даты, скажем, «m 1», чтобы ввести дату ровно через месяц с сегодняшнего дня. Есть ли событие для подключения, к которому я могу написать код VBA, который интерпретирует это и изменит значение поля на фактическую дату, которую поймет проверка, прежде чем оно будет отправлено на проверку?
Кажется, я не могу найти такое событие, даже BeforeUpdate
срабатывает слишком поздно. Я получаю "The value you entered isn't valid for this field."
сообщение об ошибке перед BeforeUpdate
срабатыванием.
Комментарии:
1. У вас есть текстовое поле, привязанное к полю даты / времени? Вы хотите, чтобы это поле в новой записи имело значение по умолчанию Сегодня 1 месяц? Используйте свойство defaultValue с вычислением с использованием функции DateAdd(). Заблокируйте текстовое поле, чтобы пользователи не могли редактировать.
2. Есть
Change
где вы могли бы отслеживатьmyTextbox.Text
специальный синтаксис и редактировать текст, если он соответствует. Хотя это был бы странный пользовательский интерфейс.
Ответ №1:
Вы можете использовать событие нажатия клавиши элемента управления. И отключиться (чтобы отключить нажатие клавиши из системы управления доступом, НЕ видящей клавишу, затем установите keycode = 0.
Таким образом, эта процедура позволит пользователю нажать Y или y = добавить или вычесть год D или d = добавить или вычесть день M или m — добавить или вычесть месяц.
Обратите внимание, что вы должны использовать клавишу shift — caps lock игнорируется.
Private Sub IvDate_KeyDown(KeyCode As Integer, Shift As Integer)
Dim strMyKeys As String
strMyKeys = "mdy" ' key check ignores caps
If InStr(strMyKeys, Chr(KeyCode)) > 0 Then
If IsNull(Me.IvDate) Then Me.IvDate = Date
Select Case KeyCode
Case Asc("M") And (Shift = 1)
' Move ahead one month
Me.IvDate = DateAdd("m", 1, Me.IvDate)
Case Asc("M")
' move bck one month
Me.IvDate = DateAdd("m", -1, Me.IvDate)
Case Asc("D") And (Shift = 1)
Me.IvDate = DateAdd("d", 1, Me.IvDate)
Case Asc("D")
Me.IvDate = DateAdd("d", -1, Me.IvDate)
Case Asc("Y") And (Shift = 1)
Me.IvDate = DateAdd("yyyy", 1, Me.IvDate)
Case Asc("Y")
Me.IvDate = DateAdd("yyyy", -1, Me.IvDate)
End Select
KeyCode = 0 ' sends current key to black hole
End If
End Sub