Поиск значений в базе данных по первым буквам при вводе на листе (как в 1С)
21.09.2013, 16:40 | |
[ Файл-пример (191.3 Kb) ] | |
Предположим, на листе есть большая база данных. Поиск по базе можно организовать с помощью поля (текстбокс) для ввода интересующего значения и обновляющегося по мере ввода списка (листбокс) подходящих значений: Option Compare Text Private Sub TextBox1_Change() Dim x, i As Long, txt As String, lt As Long, s As String txt = TextBox1.Text: lt = Len(TextBox1.Text) If lt = 0 Then Exit Sub x = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value For i = 1 To UBound(x, 1) ' поиск по первым буквам If txt = Mid(x(i, 1), 1, lt) Then s = s & "~" & x(i, 1) Next i 'For i = 1 To UBound(x, 1) 'поиск по любому вхождению ' If InStr(x(i, 1), txt) Then s = s & "~" & x(i, 1) 'Next i ListBox1.List = Split(Mid(s, 2), "~") End Sub Private Sub ListBox1_Click() If ListBox1.ListIndex = -1 Then Exit Sub Columns(1).Find(ListBox1, lookat:=xlWhole).Select End Sub Можно также использовать форму (см. файл-пример) |
|
Добавил: nilem | |
|
Просмотров: 42212
| Рейтинг: 5.0/7 |
Всего комментариев: 31 | 1 2 » |
Порядок вывода комментариев: Sashagerych, набросайте какой-нибудь примерчик для поиска по книге. На форуме попробуем порешать, и, если получится что-то стоящее, положим сюда.
Так и сделаю Отличная вещь. А можно сделать так чтобы после того как курсор мыши убирался, поиск удалял содержимое из окошка ? Спасибо +1
Я и макрос то запустить не могу. Выдает object required на строке If ListBox1.ListIndex это название листа или обьект некий ? может где есть описание как применить данный макрос к книге ? 0
разобрался. спасибо ) Теперь надо с событием MouseMoe разобраться 0
На работе всем сотрудникам его внедрил, теперь они пищат от восторга
Заменил файл-пример: на 3-м листе есть разновидность поиска с встроенными полем и списком. Ок, давайте хотелки :), и… где будем общаться?
Доброго времени суток.
Здрасьте. По п.1 вместо А в Sub ListBox1_Click() вместо По п.2 не очень понятно. Наверное, лучше задать вопрос на форуме. Здесь ведь только «приемчики», а реализация м.б. какой угодно. Добрый день! Гуру не подскажут как сделать так, чтобы поиск был не по первым буквам, а по любым в строке. Например есть ячейка с текстом 0,75ВИНО ВАЛЛЕФЬОРИ РОСС КР СХ, и мне надо ее найти по слову вино или слову валл
Здравствуйте! Доброго времени суток. Подскажите пожалуйста, каким образом можно производить поиск по нескольким столбцам массива и выводить результат тоже из нескольких столбцов, а не с одного?
Привет, Станислав Private Sub ListBox1_Click()
Спасибо nilem! А макрос у меня сейчас работает так: Private Sub TextBox1_Change() Работает довольно быстро (Вы как-то давали пример данного поиска). Но просто для эксперимента пытался сделать быстрее взял из этой статьи пример nerv и сделал поиск: Private Sub TextBox1_Change() Arr = ADO.ToArray() Работает, но все же стандартными функции VBA работают быстрее Лучше бы, конечно, на форуме это обсудить, чтобы не загромождать «приемчик» Доброго времени суток. Подскажите пожалуйста как изменить код в листе ENTRY для ввода данных с другого листа. Спасибо.
Добрый день, может кто помочь где я что не так делаю Private Sub Worksheet_SelectionChange(ByVal Target As Range) Private Sub TextBox1_Change() Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Private Sub ListBox1_Click() Application.EnableEvents = True ‘Sub tt() никак не могу заставить работать Спасибо, разобрался, только как данные с другого листа брать пока не понимаю.
Присоединяюсь к вопросу — нужно что бы данные брались с другого листа (способ ENTRY). Как сделать? |
|
1-30 31-31 | |
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация
|
Вход
]
Добрый вечер, уважаемые участники форума. Помогите, пожалуйста, разобраться в вопросе. Спасибо! |
|
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
Есть, только обычно делается это не так, ибо по каждому значению базу дергать нет смысла, а вот подготовить таблицу и по ней получить ответ с пакетом данных что нужен — это правильнее. хотя смотря сколько ячеек, может оказаться проще несколько запросов, чем один городить с TEMPDB. По вопросам из тем форума, личку не читаю. |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#3 22.02.2019 20:32:02
Привет, Михаил. |
||
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
#4 22.02.2019 20:45:11 Андрей VG, Андрей, привет. Ну вопрос был про SQL, Access опционально :-).
и их не много, то можно и в WHERE OR . Но неправильно это. По вопросам из тем форума, личку не читаю. |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#5 22.02.2019 20:48:58
Зачем тут Where (можно, но зачем)? Классика жанра Inner Join таблицы нужного в Excel и таблицы откуда брать в Access. Изменено: Андрей VG — 22.02.2019 20:49:24 |
||
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
#6 22.02.2019 20:53:53 Андрей,
я про это. По вопросам из тем форума, личку не читаю. |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#7 22.02.2019 21:20:13
Дык, и я про это. Распаковываем архив в папку c:path. На листе queryTable вводим нужные имена, по которым нужно выбрать данные в таблице Access, на листе queryResult обновляем таблицу. Или я о чём то другом? Прикрепленные файлы
|
||
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
Что-то, наверно впервые, мы не синхронизируемся. Вы про SQL синтаксис, а я про базу и SQL сервер . Или так и с ней пройдет? Да даже если и пройдет, то связка будет на уровне клиента, а не сервера, что возможно окажется хуже, чем несколько простых запросов. Изменено: БМВ — 22.02.2019 21:29:23 По вопросам из тем форума, личку не читаю. |
Спасибо за отклик на мой вопрос. |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#10 22.02.2019 21:37:08
смотря какой. Тут ТС как обычно постеснялся детализировать. К ms sql server и Oracle можно в принципе сделать. Тут всё зависит, что разрешено. По мне так лучше через временну таблицу и через Power Query. Но тут я пас, пример рисовать не буду. Изменено: Андрей VG — 22.02.2019 21:37:49 |
||
Андрей VG, сказать честно в разновидностях SQL серверов не искушен. Работал с таблицами SQL через phpMyAdminи это весь опыт. В данном случае хотел перенести функционал в область поисковых запросов не в другую книгу эксель, а в базу данных. Для меня предпочтителен тот вариант, где я смогу по гуглу составить скрипт на поиск максимально проще, т.к. в этой области не силен. Если Вы укажете куда мне, как чайнику, лучше смотреть — занялся бы изучением вопроса прямо сегодня, т.к. сроки меня поджимают) |
|
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
footballplayer, смотреть надо не в сторону, а отталкиваться от объемов. По вопросам из тем форума, личку не читаю. |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#13 22.02.2019 21:50:24
Тогда вам лучше идти на sql.ru с таким вопросом. Явно же не по Excel вопрос. |
||
Спасибо всем отписавшимся! БМВ, объемы динамические. Если сама база будет ориентировочно 100 000+ строк, то количество значений для поиска будет где-то от 1 до 200 разных. Андрей VG, вероятно, я, из-за слабого знания предмета вопроса, я выразился неправильно. Из Вашего примера в файле Path.zip стало понятно, что SQL-запрос может быть и таблицу Access (не только d SQL базу), этого просто не знал. Попробую изучить пример написанного Вами запроса в таблицу для выборки данных. Изменено: footballplayer — 23.02.2019 13:46:38 |
|
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
#15 23.02.2019 13:56:47
то и просто таблицы excel будет достаточно, а уж как запрос будет оформлен, через SQL или PowerQuery — это дело техники. СУБД может потребоваться при больших объемах, нагрузке или удаленности её от клиента. Вот тогда получить в качеcтве ответа готовую выборку, а не всю таблицу для последующей обработки на клиенте, эффективнее, в том числе и access. Изменено: БМВ — 23.02.2019 14:00:19 По вопросам из тем форума, личку не читаю. |
||
БМВ, согласен с Вами, для 100 000 строк самого Экселя достаточно, сейчас процесс именно так и организован. Есть два небольших вопроса: |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#17 23.02.2019 16:04:45
Можно, просто нужно детализировать, что за базу данных вы используете. Если Access, то данные свойства подключения переносятся один к одному. Строка подключения и собственно SQL запрос.
Быстрее, если построен индекс по поисковым полям, в противном случае особой разницы не будет. Более того, учитывая что для реализации SQL нужно инициализировать движок, то первый запрос может выполняться и дольше. |
||||
Андрей VG, исходя из того, что я понял по ответам в данной теме, попробую развернуто описать свою задачу. Насколько, для подключения к БД я могу использовать данные из Вашего примера «Path.zip», а вот SQL запрос на выборку мне придется писать другой. Прикрепленные файлы
|
|
sokol92 Пользователь Сообщений: 4445 |
Добрый день, коллеги! Мне кажется, всё определяется количеством пользователей. Если пользователь один, то нет никакого смысла выходить за рамки Excel. Поиск по отсортированной по ключу «базе данных» в несколько сотен тысяч записей осуществляется мгновенно (но не Find, конечно). |
footballplayer Пользователь Сообщений: 114 |
#20 23.02.2019 18:49:26 sokol92, добрый день, спасибо за ответ!
Если несложно, могли бы Вы более развернуто рассказать об этом? |
||
sokol92 Пользователь Сообщений: 4445 |
В Вашем примере из #18 на листе Access (поменять имя во избежание путаницы ) уже есть фрагмент этой «базы» данных. Отсортируйте ее по столбцу «A» и подтягивайте из нее данные с помощью функций ВПР, ПОИСКПОЗ и др. c параметрами поиска, рассчитанными на отсортированные диапазоны (массивы). |
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
#22 23.02.2019 19:18:54
и объемом данных. Еще сравнительно недавно 32к строк — это был предел. По вопросам из тем форума, личку не читаю. |
||
sokol92 Пользователь Сообщений: 4445 |
Здравствуйте, Михаил! Согласен. |
sokol92, да, в недавней теме на этом сайте один из участников форума подсказал такой вариант и добавил пример. Согласен, работает очень быстро, но все же в данном случае мне хотелось все это реализовать в виде БД, сейчас остановился на БД в Access, пытаюсь разобраться с корректным запросом для выборки) |
|
PowerBoy Пользователь Сообщений: 141 |
Может Вам это поможет: https://vk.com/excelsql Excel + SQL = Activetables |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#26 23.02.2019 22:20:18
Да пожалуйста. Набиваете нужные коды товаров на листе queryResult в соответствующем столбце, удаляете строки с уже не нужными и нажимаете обновить. Архив распаковать в папку c:path. Прикрепленные файлы
|
||
footballplayer Пользователь Сообщений: 114 |
#27 24.02.2019 20:11:25 Андрей VG, спасибо за помощь!
Значит ли это, что я каждый раз создаю рекордсет, потребляет ли это ресурсы и увеличивает ли время работы программы? 2.Сейчас результаты поиска вставляются от ячейки («А1») и ниже. Можно ли на лету разобрать полученный запросом SELECT результат и поместить его в нужную ячейку? Файл с примером и БД приложил в архиве. Прикрепленные файлы
Изменено: footballplayer — 24.02.2019 20:12:15 |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#28 24.02.2019 20:19:11
Предложенный мной вариант этого не делает?
Не обязательно. Достаточно закрыть после записи данных Recordset и по новой открыть с новой SQL инструкцией.
Изучите Range.CopyFromRecordset Изменено: Андрей VG — 24.02.2019 20:20:25 |
||||||
footballplayer Пользователь Сообщений: 114 |
#29 24.02.2019 21:09:27
Делает. Все работает отлично. Просто, возможно, мне нужно будет полученные в рекордсете данные «на лету» еще обрабатывать и в зависимости от условия применять к ним определенные действия. Без макроса как это сделать — не знаю
Спасибо за подсказку! Уже разобрался как переместить результаты в нужные ячейки! Огромное спасибо за помощь Вам и всем отписавшимся в данной теме! |
||||
0 / 0 / 0 Регистрация: 26.07.2012 Сообщений: 5 |
|
1 |
|
Поиск в базе данных26.07.2012, 22:13. Показов 2013. Ответов 12
Плиз, помогите чайниГову… Есть база данных в Excel 2007 (создана не мной). Три именных листа с данными: все клиенты, заключенные договора и отказные.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
26.07.2012, 22:13 |
Ответы с готовыми решениями: Поиск по базе данных Поиск по базе данных Поиск в базе данных Подскажите, пожалуйста, как можно осуществить поиск водителя по номеру… VBA поиск по базе данных 12 |
Модератор 34709 / 19230 / 4040 Регистрация: 12.02.2012 Сообщений: 32,197 Записей в блоге: 13 |
|
26.07.2012, 22:41 |
2 |
Может существует какой макрос? — не думаю.
Причём, в каждой ячейке вся информация об одном клиенте собрана вместе: телефоны, имена, адреса и прочее — и кто же это набивал? В глазки бы ему взглянуть… А если без ёрничанья, то надо парсить каждую ячейку, выделять телефоны и т.д. Но без конкретного примера Вам вряд ли помогут — покажите хотя бы кусок данных.
2 |
0 / 0 / 0 Регистрация: 26.07.2012 Сообщений: 5 |
|
27.07.2012, 00:41 [ТС] |
3 |
Catstail Тогда, чтоб нормальных людей не морочить, сначала «вытащу» все номера телефонов в отдельные столбцы (как приоритет). Пожалуй, ещё ФИО растащу. Хотя, там тоже не полные данные. Гацтво Потом уж скрин сделаю иль ещё какой вариант инфы.
0 |
призрак 3261 / 889 / 119 Регистрация: 11.05.2012 Сообщений: 1,702 Записей в блоге: 2 |
|
27.07.2012, 01:21 |
4 |
не надо скрин.
2 |
2784 / 716 / 106 Регистрация: 04.02.2011 Сообщений: 1,443 |
|
27.07.2012, 07:36 |
5 |
Сообщение было отмечено как решение РешениеРегулярками телефоны просмотреть можно с высокой вероятностью — несколько цифр, разделенных тире и круглыми скобками, надеюсь без пробелов внутри (это надо видеть данные), ограниченные как слово: пробельными символами и спецсимволами (это тоже надо видеть исходные данные). После того, как выделим номера телефонов — один и более в каждой ячейке — их привести в один формат, скажем набор цифр без разделителя, и вынести в отдельную колонку, по которой уже провести поиск на совпадение. От homka надо хотя бы по 30 строк с каждого листа, чтобы составить общее представление. Не нужно выкладывать коммерческую данную, но нужно выложить то, что составит представление о самих данных. Файл прикрепиле к посту через кнопку «Управление вложениями» в «Расширенном режиме» (есть такая кнопка) при создании поста.
3 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,147 |
|
27.07.2012, 09:34 |
6 |
…телефонов или совпадения прочих данных… …сначала «вытащу» все номера телефонов в отдельные столбцы.. Рациональнее было бы разбивать сразу на отдельные составляющие. Вплоть до Фамилия, Имя, Отчество, Телефон_дом, Телефон_моб, Город, Улица, Дом, Квартира. Добавлено через 3 минуты
0 |
537 / 28 / 4 Регистрация: 25.04.2011 Сообщений: 238 |
|
27.07.2012, 11:49 |
7 |
Пожалуй, ещё ФИО растащу. Лучше кусочек покажите, потихоньку можно и к результату придти Миниатюры
2 |
0 / 0 / 0 Регистрация: 26.07.2012 Сообщений: 5 |
|
27.07.2012, 12:19 [ТС] |
8 |
ikki В листе Консультаций инфа мной уже растащена на колонки. Каким словом правильно заменить «растащено»?
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,147 |
||||||||
27.07.2012, 16:21 |
9 |
|||||||
Для поиска подстроки можно использовать функцию, которая выкладывалась здесь на форуме:
Для проверки повторяемости мне очень нравится словарь.
Для ускорения обработки рекомендую считать в массив
1 |
0 / 0 / 0 Регистрация: 26.07.2012 Сообщений: 5 |
|
06.08.2012, 12:31 [ТС] |
10 |
Alex77755
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,147 |
|
06.08.2012, 12:46 |
11 |
Ну по тому примеру, что выложен(с одной строкой) трудно о чём-то судить.
0 |
0 / 0 / 0 Регистрация: 26.07.2012 Сообщений: 5 |
|
06.08.2012, 13:05 [ТС] |
12 |
Теперь все номера телефон в одном формате через «тире» х-ххх-ххх-хх-хх. Так они читабельней. Некоторые прямые телефоны в старом формате без префикса ххх-хх-хх
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,147 |
||||||||
06.08.2012, 15:51 |
13 |
|||||||
Сообщение было отмечено как решение РешениеТак они читабельней Зато без тире юзабельней
Добавлено через 24 минуты
3 |
Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.
Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.
Синтаксис метода Range.Find
Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat) |
Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.
В скобках перечислены параметры метода, среди них только What является обязательным.
Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.
Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.
Параметры метода Range.Find
Наименование | Описание |
---|---|
Обязательный параметр | |
What | Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant. |
Необязательные параметры | |
After | Ячейка, после которой следует начать поиск. |
LookIn | Уточняет область поиска. Список констант xlFindLookIn:
|
LookAt | Поиск частичного или полного совпадения. Список констант xlLookAt:
|
SearchOrder | Определяет способ поиска. Список констант xlSearchOrder:
|
SearchDirection | Определяет направление поиска. Список констант xlSearchDirection:
|
MatchCase | Определяет учет регистра:
|
MatchByte | Условия поиска при использовании двухбайтовых кодировок:
|
SearchFormat | Формат поиска – используется вместе со свойством Application.FindFormat. |
* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments
и MsgBox xlNotes
.
В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.
Знаки подстановки для поисковой фразы
Условные знаки в шаблоне поисковой фразы:
- ? – знак вопроса обозначает любой отдельный символ;
- * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
- ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).
Простые примеры
При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:
- Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
- Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.
В примерах используются переменные:
- myPhrase – переменная для записи поисковой фразы;
- myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.
Пример 1
Sub primer1() Dim myPhrase As Variant, myCell As Range myPhrase = «стакан» Set myCell = Range(«A1:L30»).Find(myPhrase) If Not myCell Is Nothing Then MsgBox «Значение найденной ячейки: « & myCell MsgBox «Строка найденной ячейки: « & myCell.Row MsgBox «Столбец найденной ячейки: « & myCell.Column MsgBox «Адрес найденной ячейки: « & myCell.Address Else MsgBox «Искомая фраза не найдена» End If End Sub |
В этом примере мы присваиваем переменной myPhrase значение для поиска – "стакан"
. Затем проводим поиск этой фразы в диапазоне "A1:L30"
с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.
Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне "A1:L30"
есть ячейка со строкой, содержащей подстроку "стакан"
, и когда такой ячейки нет.
Пример 2
Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.
Sub primer2() Dim myPhrase As Variant, myCell As Range myPhrase = 526.15 Set myCell = Rows(1).Find(myPhrase) If Not myCell Is Nothing Then MsgBox «Значение найденной ячейки: « & myCell Else: MsgBox «Искомая фраза не найдена» End If End Sub |
Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15
, и 129526,15
, и 526,15254
. То есть, как и в предыдущем примере, поиск идет по подстроке.
Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:
Set myCell = Rows(1).Find(myPhrase, , , xlWhole) |
Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues
. Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.
Пример 3
Допустим, у нас есть многострочная база данных в Excel. В первой колонке находятся даты. Нам необходимо создать отчет за какой-то период. Найти номер начальной строки для обработки можно с помощью следующего кода:
Sub primer3() Dim myPhrase As Variant, myCell As Range myPhrase = «01.02.2019» myPhrase = CDate(myPhrase) Set myCell = Range(«A:A»).Find(myPhrase) If Not myCell Is Nothing Then MsgBox «Номер начальной строки: « & myCell.Row Else: MsgBox «Даты « & myPhrase & » в таблице нет» End If End Sub |
Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.
Содержание
- 1 Change column data case
- 2 Finding a Record Based on Multiple Criteria
- 3 Finding a Specific Record in a Recordset
- 4 Finding Records Using the Find Method
- 5 Finding the Record Position
- 6 Find record by using Recordset.FindFirst
- 7 NoMatch property in Recordset
- 8 Select specific column in select statement
- 9 Simple Select statement
- 10 SQL with where clause
Change column data case
<source lang="vb">
Sub exaRecordsetEdit()
Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("Employees") rs.MoveFirst Do While Not rs.EOF rs.Edit rs!Title = UCase$(rs!Title) rs.Update rs.MoveNext Loop rs.Close
End Sub
</source>
Finding a Record Based on Multiple Criteria
<source lang="vb">
Sub Find_WithFilter()
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & _ "mydb.mdb" Set rst = New ADODB.Recordset rst.Open "Employees", conn, adOpenKeyset, adLockOptimistic rst.Filter = "TitleOfCourtesy ="Ms." and Country ="USA"" Do Until rst.EOF Debug.Print rst.Fields("LastName").Value rst.MoveNext Loop rst.Close Set rst = Nothing conn.Close Set conn = Nothing
End Sub
</source>
Finding a Specific Record in a Recordset
<source lang="vb">
Sub FindProject()
Dim strSQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.ActiveConnection = CurrentProject.Connection rst.CursorType = adOpenStatic rst.Open "Select * from Employees" "Attempt to find a specific project strSQL = "[EmployeeID] = " & 1 rst.Find strSQL "Determine if the specified project was found If rst.EOF Then msgBox lngValue & " Not Found" Else msgBox lngValue & " Found" End If rst.Close Set rst = Nothing
End Sub
</source>
Finding Records Using the Find Method
<source lang="vb">
Sub Find_WithFind()
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "mydb.mdb" Set rst = New ADODB.Recordset rst.Open "Employees", conn, adOpenKeyset, adLockOptimistic rst.Find "TitleOfCourtesy ="Ms."" Do Until rst.EOF Debug.Print rst.Fields("LastName").Value rst.Find "TitleOfCourtesy ="Ms."", SkipRecords:=1, _ SearchDirection:=adSearchForward Loop rst.Close Set rst = Nothing conn.Close Set conn = Nothing
End Sub
</source>
Finding the Record Position
<source lang="vb">
Sub FindRecordPosition()
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset Dim strConn As String strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & CurrentProject.Path & _ "mydb.mdb" Set conn = New ADODB.Connection conn.Open strConn Set rst = New ADODB.Recordset With rst .Open "Select * from Employees", conn, adOpenKeyset, _ adLockOptimistic, adCmdText Debug.Print .AbsolutePosition .Move 3 " move forward 3 records Debug.Print .AbsolutePosition .MoveLast " move to the last record Debug.Print .AbsolutePosition Debug.Print .RecordCount .Close End With Set rst = Nothing conn.Close Set conn = Nothing
End Sub
</source>
Find record by using Recordset.FindFirst
<source lang="vb">
Sub findrecorder()
Dim dbNorthwind As DAO.Database Dim dbPath As String DbPath = CurrentProject.Path & "mydb.mdb" Set dbNorthwind = OpenDatabase(dbPath) Dim rsEmployees As DAO.Recordset Dim rsCustomers As DAO.Recordset Set rsEmployees = dbNorthwind.OpenRecordset("Employees", dbOpenTable) Set rsCustomers = dbNorthwind.OpenRecordset("Customers", dbOpenTable) rsCustomers.MoveLast numCustomers = rsCustomers.RecordCount With rsEmployees .FindFirst "City = "Seattle"" If .NoMatch Then MsgBox ("No Records Found!") .MoveFirst Else MsgBox ("Found "& .Fields(2).Value & " "& .Fields(1).Value & _ "in Seattle") End If End With
End Sub
</source>
NoMatch property in Recordset
<source lang="vb">
Sub SeekByPrice(curPrice As Currency)
Dim db As Database Dim rec As Recordset Dim strSQL As String strSQL = "tblSales" Set db = CurrentDb() Set rec = db.OpenRecordset(strSQL) rec.Index = "AmountPaid" rec.Seek "=", curPrice If rec.NoMatch = True Then Debug.Print "No orders cost " & FormatCurrency(curPrice) Else Debug.Print "Order No. " & rec("SalesID") & " placed on " & _ FormatDateTime(rec("DateOrdered"), vbLongDate) & _ " cost " & FormatCurrency(rec("AmountPaid")) End If rec.Close
End Sub
</source>
Select specific column in select statement
<source lang="vb">
Sub MyFirstConnection()
Dim myConnection As ADODB.Connection Dim myRecordset As ADODB.Recordset Dim strSQL As String strSQL = "SELECT txtCustFirstName, txtCustLastName FROM tblCustomer" Set myConnection = CurrentProject.Connection Set myRecordset = New ADODB.Recordset myRecordset.Open strSQL, myConnection Do Until myRecordset.EOF Debug.Print myRecordset.Fields("txtCustFirstName") & " " & _ myRecordset.Fields("txtCustLastName") myRecordset.MoveNext Loop myRecordset.Close myConnection.Close Set myConnection = Nothing Set myRecordset = Nothing
End Sub
</source>
Simple Select statement
<source lang="vb">
Sub MyFirstConnection()
Dim myConnection As ADODB.Connection Dim myRecordset As ADODB.Recordset Dim strSQL As String strSQL = "SELECT * FROM tblCustomer ORDER BY txtCustLastName" Set myConnection = CurrentProject.Connection Set myRecordset = New ADODB.Recordset myRecordset.Open strSQL, myConnection Do Until myRecordset.EOF Debug.Print myRecordset.Fields("txtCustFirstName"), _ myRecordset.Fields("txtCustLastName") myRecordset.MoveNext Loop myRecordset.Close myConnection.Close Set myConnection = Nothing Set myRecordset = Nothing
End Sub
</source>
SQL with where clause
<source lang="vb">
Sub MyFirstConnection()
Dim myConnection As ADODB.Connection Dim myRecordset As ADODB.Recordset Dim strSQL As String Dim strSearch As String strSearch = "Joe" strSQL = "SELECT txtCustFirstName, txtCustLastName FROM tblCustomer" & _ " WHERE txtCustLastName = " & " "" & strSearch & """ Set myConnection = CurrentProject.Connection Set myRecordset = New ADODB.Recordset myRecordset.Open strSQL, myConnection Do Until myRecordset.EOF Debug.Print myRecordset.Fields("txtCustFirstName"), _ myRecordset.Fields("txtCustLastName") myRecordset.MoveNext Loop myRecordset.Close myConnection.Close Set myConnection = Nothing Set myRecordset = Nothing
End Sub
</source>