VBA в Access

Программирование на Visual Basic for Applications
eugen81
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 22.07.2010 (Чт) 20:28

VBA в Access

Сообщение eugen81 » 22.07.2010 (Чт) 22:05

Доброго времени суток!
Возникла следующая проблема. Есть форма "Объекты", на которой расположен список и поле. В списке выводится перечень адресов объектов, а поле необходимо для того, чтобы при наборе в нем адреса этот самый список фильтровался с вводом каждого символа.
Примерно, что у меня получилось - во вложении
Начал с того, что для поля "Фильтр" использовал событие KeyPress, а строку для фильтра брал из свойства поля .Text
Код: Выделить всё
Private Sub Form_Load()
Фильтр.SetFocus
Фильтр.Text = ""
Список.RowSource = "SELECT [Адреса].[Адрес] FROM Адреса;"
End Sub

Private Sub Фильтр_KeyPress(KeyAscii As Integer)
Dim str As String, src As String
src = "SELECT [Адреса].[Адрес] FROM Адреса"
'Строка до нажатия клавиши:
str = Фильтр.Text
If str <> "" Then src = src & " WHERE ((Адреса.Адрес) Like (" & Chr(34) & "*" & str & "*" & Chr(34) & "));"
End If
Список.RowSource = src
DoCmd.Requery "Список"
End Sub

Вскоре выяснил, что при наборе в "Фильтр" очередного символа, в .Text передаются все набранные символы кроме последнего. В итоге пришлось к Фильтр.Text добавлять и ChrW(KeyAscii), что не очень удобно, так как пишется лишний код, как мне кажется, и возникает необходимость обработки клавиши Backspace.
То, как реализована эта обработка в коде ниже - просто для отвода глаз, лишь бы хоть как-то работала.
Код: Выделить всё
Private Sub Фильтр_KeyPress(KeyAscii As Integer)
Dim str As String, src As String
src = "SELECT [Адреса].[Адрес] FROM Адреса"
'Строка до нажатия клавиши:
str = Фильтр.Text
'Доступные символы ввода:
If KeyAscii > 31 Then
'если да - добавляем к str символ только что нажатой клавиши:
str = str & ChrW(KeyAscii)
'Обработка Backspace
ElseIf KeyAscii = 8 Then
    str = ""
    Фильтр.Text = ""
End If
If str <> "" Then
    src = src & " WHERE ((Адреса.Адрес) Like (" & Chr(34) & "*" & str & "*" & Chr(34) & "));"
End If
Список.RowSource = src
DoCmd.Requery "Список"
End Sub

Вероятно есть способ заставить последний символ передать вместе с набранным текстом в .Text, но я все никак не соображу, так как в VBA начал разбираться пару дней назад.
Если кто сможет мне помочь - буду очень благодарен.
Вложения
Database1.zip
База в формате Access 2007
(44.69 Кб) Скачиваний: 161

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: VBA в Access

Сообщение alibek » 22.07.2010 (Чт) 22:24

Проверяй в Change, а в KeyPress устанавливай флаг проверки.
Добавлять ChrW бессмысленно, в KeyAscii передается только ASCII-код.
Lasciate ogni speranza, voi ch'entrate.

eugen81
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 22.07.2010 (Чт) 20:28

Re: VBA в Access

Сообщение eugen81 » 23.07.2010 (Пт) 5:06

alibek, спасибо! через Change все заработало!
Только не понял про флаг проверки в KeyPress. Зачем он там и что требуется проверять?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList