Поиск в базе данных vba excel


Поиск значений в базе данных по первым буквам при вводе на листе (как в 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

Можно также использовать форму (см. файл-пример)

  • 1
  • 2
  • 3
  • 4
  • 5

Добавил: nilem |

Просмотров: 42212

| Рейтинг: 5.0/7

Всего комментариев: 31 1 2 »

Порядок вывода комментариев:

   Sashagerych, набросайте какой-нибудь примерчик для поиска по книге. На форуме попробуем порешать, и, если получится что-то стоящее, положим сюда. :)

   Так и сделаю :)
Правда сам я в VBA только на пальцах считать умею, так что могу сделать примитивный примерчик с пояснениями как я это вижу :)

   Отличная вещь. А можно сделать так чтобы после того как курсор мыши убирался, поиск удалял содержимое из окошка ? Спасибо

+1
 


   Можно
Например используйте событие MouseMove

   Я и макрос то запустить не могу. Выдает object required на строке If ListBox1.ListIndex

   это название листа или обьект некий ? может где есть описание как применить данный макрос к книге ?

0
 


   А файл скачать Вы не пробовали? это же ГОТОВОЕ РЕШЕНИЕ!

   разобрался. спасибо ) Теперь надо с событием MouseMoe разобраться

0
 


   Николай, отличное решение, спасибо!

На работе всем сотрудникам его внедрил, теперь они пищат от восторга :)

   Заменил файл-пример: на 3-м листе есть разновидность поиска с встроенными полем и списком.
Кстати, если есть желание, давайте попробуем сделать красивую надстройку? (понадобятся пожелания/хотелки и время для тестирования)

   Ок, давайте хотелки :), и… где будем общаться?

   Доброго времени суток.
действительно хорошая вещь. Для своей работы мне пригодиться Sheet1 и ENTRY
Есть вопросы, на которые очень прошу ответить.
1. Для Sheet1 где поменять номер столбца? Например у меня необходимо брать данные из столбца 5 или Е.
2.Для ENTRY мне не нужно заполнять массив, а просто в ячейке ввести первые буквы, поиск должен выдать варианты.
С ёкселем чуть-чуть дружу, а вот с макросами, ни как не получается.
Если необходимо, могу скинуть свой файл.
Заранее благодарен.

   Здрасьте. По п.1 вместо
x = Range(«A1», Cells(Rows.Count, 1).End(xlUp)).Value
напишите
x = Range(«E1», Cells(Rows.Count, 5).End(xlUp)).Value

А в Sub ListBox1_Click() вместо
Columns(1).Find(ListBox1, lookat:=xlWhole).Select
нужно будет
Columns(5).Find(ListBox1, lookat:=xlWhole).Select

По п.2 не очень понятно. Наверное, лучше задать вопрос на форуме. Здесь ведь только «приемчики», а реализация м.б. какой угодно.

   Добрый день! Гуру не подскажут как сделать так, чтобы поиск был не по первым буквам, а по любым в строке. Например есть ячейка с текстом 0,75ВИНО ВАЛЛЕФЬОРИ РОСС КР СХ, и мне надо ее найти по слову вино или слову валл

   Здравствуйте!
Очень интересный код,
интересует как можно его переделать так, чтобы можно было сделать следующее:
Есть база данных (предположим на диапазоне ячеек А2:B7)
Я хочу производить поиск по диапазону А2:А7, но при выборе выводить значения из диапазона В2:В7
Так же поисковую форму я хочу, например, поставить на ячейки в диапазоне F2:F4 и G8:G10, а выводить значения в диапазон ячеек K2:K4 и K8:K10 соответственно
Я знаю, что можно эту задачу решить используя элементы ActiveX, но хотелось бы это сделать с помощью данного кода, самому опыта не хватает переделать ваш код, такое можно сделать?
Заранее спасибо

   Доброго времени суток. Подскажите пожалуйста, каким образом можно производить поиск по нескольким столбцам массива и выводить результат тоже из нескольких столбцов, а не с одного?

   Привет, Станислав
попробуйте так
Private Sub TextBox1_Change()
Dim x, v, txt As String, lt As Long, s As String
txt = TextBox1.Text: lt = Len(TextBox1.Text)
If lt = 0 Then Exit Sub
‘ будем искать в столбцах A:D
x = Range(«A1:D» & Cells(Rows.Count, 1).End(xlUp).Row).Value
For Each v In x ‘ поиск по первым буквам
If txt = Mid(v, 1, lt) Then s = s & «~» & v
Next i
‘For Each v In x ‘поиск по любому вхождению
‘ If InStr(v, txt) Then s = s & «~» & v
‘Next i
ListBox1.List = Split(Mid(s, 2), «~»)
End Sub

Private Sub ListBox1_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
Range(«A:D»).Find(ListBox1, lookat:=xlWhole).Select
End Sub

   Спасибо nilem!
Но не совсем получается. ListBox находиться в UserForm, и данные я вывожу на несколько колонок
ListBox1.ColumnCount = 11
ListBox1.ColumnWidths = «50;40;140;140;140;140;40;40;40;40;40»

А макрос у меня сейчас работает так:

Private Sub TextBox1_Change()
Dim txt$, i&, j&, ii&, n&, xx
txt = TextBox1.Text
ii = 1
With ListBox1
.Clear
If Len(txt) = 0 Then .List = x: Exit Sub
ReDim xx(1 To UBound(x, 1), 1 To UBound(x, 2))
For i = 1 To UBound(x)
For j = 2 To 6
If InStr(1, x(i, j), txt) Then
xx(ii, 1) = x(i, 1)
xx(ii, 2) = x(i, 2)
xx(ii, 3) = x(i, 3)
xx(ii, 4) = x(i, 4)
xx(ii, 5) = x(i, 5)
xx(ii, 6) = x(i, 6)
xx(ii, 7) = x(i, 7)
xx(ii, 8) = x(i, 8)
xx(ii, 9) = x(i, 9)
xx(ii, 10) = x(i, 10)
xx(ii, 11) = x(i, 11)
ii = ii + 1
Exit For
End If
Next j
Next i
.List = xx
For i = .ListCount — 1 To 0 Step -1
If .List(i, 0) = 0 Then .RemoveItem i
Next
End With
End Sub

Работает довольно быстро (Вы как-то давали пример данного поиска). Но просто для эксперимента пытался сделать быстрее взял из этой статьи пример nerv и сделал поиск:

Private Sub TextBox1_Change()
Dim txt$, t
Dim ADO As New ADO
Dim Arr As Variant
t = Timer
txt = TextBox1.Text
With ListBox1
.Clear
If Len(txt) = 0 Then .List = x: Exit Sub
ADO.Query («SELECT F1, F2, F3, F4, F5, F6, F7, F8 » _
& «FROM [Где_Искать$A2:H] » _
& «WHERE » _
& «F1 LIKE » & «‘%» & txt & «%'» _
& » Or F2 LIKE » & «‘%» & txt & «%'» _
& » Or F3 LIKE » & «‘%» & txt & «%'» _
& » Or F4 LIKE » & «‘%» & txt & «%'» _
& » Or F5 LIKE » & «‘%» & txt & «%'» _
& » Or F6 LIKE » & «‘%» & txt & «%'» _
& » Or F7 LIKE » & «‘%» & txt & «%'» _
& » Or F8 LIKE » & «‘%» & txt & «%'» _
)

Arr = ADO.ToArray()
If IsEmpty(Arr) Then
.Clear
Else
.List = Arr
End If
End With
Debug.Print Timer — t
End Sub

Работает, но все же стандартными функции VBA работают быстрее

   Лучше бы, конечно, на форуме это обсудить, чтобы не загромождать «приемчик»

   Доброго времени суток. Подскажите пожалуйста как изменить код в листе ENTRY для ввода данных с другого листа. Спасибо.

   Добрый день, может кто помочь где я что не так делаю
Option Explicit
Option Compare Text
Dim bu As Boolean

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
If Target.Row = 1 Then Me.TextBox1.Visible = False: Me.ListBox1.Visible = False: Exit Sub
If Target.Column = 2 Then
bu = True
With Me.TextBox1
.Top = Target.Top: .Text = Target.Value ‘: .Activate
End With
With Me.ListBox1
.Top = Target.Top + 5
If (.Top + .Height + ActiveWindow.PointsToScreenPixelsY(0) * Application.InchesToPoints(1) * 15 / 1440) > _
(ActiveWindow.Application.Height + ActiveWindow.Application.Top) Then _
.Top = .Top — .Height + Target.Height ‘* ActiveWindow.Zoom / 100
.Clear
End With
bu = False
Me.TextBox1.Visible = True: Me.ListBox1.Visible = True
Else
Me.TextBox1.Visible = False: Me.ListBox1.Visible = False
End If
End Sub

Private Sub TextBox1_Change()
If Len(TextBox1.Text) = 0 Or bu Then Exit Sub ‘при отсутствии символов для поиска — выход
Dim x, i As Long, txt As String, lt As Long, s As String
txt = TextBox1.Text: lt = Len(TextBox1.Text)
x = Columns(32).SpecialCells(2).Offset(1).Value
For i = 1 To UBound(x, 1) ‘ поиск по первым буквам
If txt = Mid(x(i, 1), 1, lt) Then s = s & x(i, 1) & «~»
Next i
ListBox1.List = Split(s, «~»)
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Or KeyCode = 9 Then
With Me.TextBox1
ActiveCell.Value = .Value
.Visible = False: ListBox1.Visible = False
End With
ActiveCell(2, 1).Select
End If
End Sub

Private Sub ListBox1_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
Application.EnableEvents = False
bu = True
With Me.ListBox1
ActiveCell.Value = .Value
Me.TextBox1.Text = .Value
Me.TextBox1.Visible = False: .Visible = False
End With

Application.EnableEvents = True
bu = False
End Sub

‘Sub tt()
‘Application.EnableEvents = True
‘End Sub

никак не могу заставить работать

   Спасибо, разобрался, только как данные с другого листа брать пока не понимаю.


   А все таки: что поменять, что бы база располагалась на другом листе? способ ENTRYYY

   Присоединяюсь к вопросу — нужно что бы данные брались с другого листа (способ ENTRY). Как сделать?

1-30 31-31

Добавлять комментарии могут только зарегистрированные пользователи.

[

Регистрация

|

Вход

]

 

Добрый вечер, уважаемые участники форума.

Помогите, пожалуйста, разобраться в вопросе.
Умеет ли VBA делать поиск в базе данных SQL?
Интересует функционал по типу метода Find в VBA. Если коротко описать задачу, то мне необходимо в брать данные из ячеек в файле Эксель и при помощи цикла каждое значение искать в базе SQL, после чего получить несколько параметров из найденной строки и перенести их в другой лист той же книги Эксель. Если это можно сделать в Access, то такой вариант так же устраивает.
Есть ли такая возможность у VBA?

Спасибо!

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

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

По вопросам из тем форума, личку не читаю.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#3

22.02.2019 20:32:02

Цитата
БМВ написал:
чем один городить с TEMPD

Привет, Михаил.
А зачем через tempdb? Можно одним запросом к таблице на листе Excel и таблице(ам) Access.

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

#4

22.02.2019 20:45:11

Андрей VG, Андрей, привет. Ну вопрос был про SQL, Access опционально :-).
Если

Цитата
footballplayer написал:
брать данные из ячеек в файле Эксель

и их не много, то можно и в WHERE  OR . Но неправильно это.

По вопросам из тем форума, личку не читаю.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#5

22.02.2019 20:48:58

Цитата
БМВ написал:
WHERE  

Зачем тут Where (можно, но зачем)? Классика жанра Inner Join таблицы нужного в Excel и таблицы откуда брать в Access.

Изменено: Андрей VG22.02.2019 20:49:24

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

#6

22.02.2019 20:53:53

Андрей,

Цитата
БМВ написал:
Ну вопрос был про SQL

я про это.

По вопросам из тем форума, личку не читаю.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#7

22.02.2019 21:20:13

Цитата
БМВ написал:
Ну вопрос был про SQL

Дык, и я про это. Распаковываем архив в папку c:path. На листе queryTable вводим нужные имена, по которым нужно выбрать данные в таблице Access, на листе queryResult обновляем таблицу. Или я о чём то другом?

Прикрепленные файлы

  • Path.zip (25.75 КБ)

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

Что-то,  наверно впервые, мы не синхронизируемся. Вы про SQL синтаксис, а я про базу и SQL сервер . Или так и с ней пройдет? Да даже если и пройдет, то связка будет на уровне клиента, а не сервера, что возможно окажется хуже, чем несколько простых запросов.

Изменено: БМВ22.02.2019 21:29:23

По вопросам из тем форума, личку не читаю.

 

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

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#10

22.02.2019 21:37:08

Цитата
БМВ написал:
SQL сервер

смотря какой. Тут ТС как обычно постеснялся детализировать. К ms sql server и Oracle можно в принципе сделать. Тут всё зависит, что разрешено. По мне так лучше через временну таблицу и через Power Query. Но тут я пас, пример рисовать не буду.

Изменено: Андрей VG22.02.2019 21:37:49

 

Андрей VG, сказать честно в разновидностях SQL  серверов не искушен. Работал с таблицами SQL через phpMyAdminи это весь опыт. В данном случае хотел перенести функционал в область поисковых запросов не в другую книгу эксель, а в базу данных. Для меня предпочтителен тот вариант, где я смогу по гуглу составить скрипт на поиск максимально проще, т.к. в этой области не силен. Если Вы укажете куда мне, как чайнику,  лучше смотреть — занялся бы изучением вопроса прямо сегодня, т.к. сроки меня поджимают)

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

footballplayer, смотреть надо не в сторону, а отталкиваться от объемов.

По вопросам из тем форума, личку не читаю.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#13

22.02.2019 21:50:24

Цитата
footballplayer написал:
перенести функционал в область поисковых запросов не в другую книгу эксель, а в базу данных

Тогда вам лучше идти на

sql.ru

с таким вопросом. Явно же не по Excel вопрос.

 

Спасибо всем отписавшимся!

БМВ,  объемы динамические. Если сама база будет ориентировочно 100 000+ строк, то количество значений для поиска будет где-то от 1 до 200 разных.

Андрей VG,  вероятно, я, из-за слабого знания предмета вопроса, я выразился неправильно. Из Вашего примера в файле Path.zip стало понятно, что SQL-запрос может быть и таблицу Access (не только d SQL базу), этого просто не знал. Попробую изучить пример написанного Вами запроса в таблицу для выборки данных.
Подскажите, пожалуйста, возможно ли перенести запрос в таблицу из Вашего примера в макрос? Для этих целей используется ADO, нужно читать об этом?
Спрашиваю в связи с тем, что хотелось бы иметь кнопку на рабочем листа, чтобы пользователь нажал и произошла выборка данных из таблицы, по типу запуска макроса.

Изменено: footballplayer23.02.2019 13:46:38

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

#15

23.02.2019 13:56:47

Цитата
footballplayer написал:
Если сама база будет ориентировочно 100 000+ строк

то и просто таблицы excel будет достаточно, а уж как запрос будет оформлен, через

SQL

или PowerQuery — это дело техники. СУБД  может потребоваться при больших объемах, нагрузке  или удаленности её от клиента. Вот тогда получить в качеcтве ответа готовую выборку, а не всю таблицу для последующей обработки на клиенте, эффективнее, в том числе и access.

Изменено: БМВ23.02.2019 14:00:19

По вопросам из тем форума, личку не читаю.

 

БМВ, согласен с Вами, для 100 000 строк самого Экселя достаточно, сейчас процесс именно так и организован.
Но со временем база может расти и строк будет больше, поэтому хотелось сразу воспользоваться базой данных (SQL, Access) и делать выборку оттуда путем SQL запросов.
Из полученных в данной теме подсказок и примера многое в решении задачи стало более понятно, буду стараться разобраться.

Есть два небольших вопроса:
1. Если БД лежит на локальном компьютере или в локально сети, можно ли получить выборку из БД при помощи рекордсета?
2. По скорости работы, поиск в БД при помощи SQL запроса быстрее, чем делать Find через макрос в книге Эксель с таким же количеством строк?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#17

23.02.2019 16:04:45

Цитата
footballplayer написал:
при помощи рекордсета?

Можно, просто нужно детализировать, что за базу данных вы используете. Если Access, то данные свойства подключения переносятся один к одному. Строка подключения и собственно SQL запрос.

Цитата
footballplayer написал:
поиск в БД при помощи SQL запроса быстрее, чем делать Find через макрос в книге Эксель

Быстрее, если построен индекс по поисковым полям, в противном случае особой разницы не будет. Более того, учитывая что для реализации SQL нужно инициализировать движок, то первый запрос может выполняться и дольше.
Слишком мало вы предоставляете информации. При таком объёме вводных все рассуждения аналогичны рассуждениям о сферическом коне в вакууме.

 

Андрей VG, исходя из того, что я понял по ответам в данной теме, попробую развернуто описать свою задачу.
Необходимо вставлять в книгу эксель данные для поиска (в файле-примере — столбец «А», код товара). Ячеек для поиска будет не больше 200. Сама база данных будет храниться в Access, по такой же типу, как в Вашем примере «Path.zip» выше.
В случае если поиск прошел успешно, необходимо, чтобы из БД обратно в книгу эксель напротив каждого искомого значения были перенесены некоторые параметры товара (в фале-примере — это марка, количество и стоимость).

Насколько, для подключения к БД я могу использовать данные из Вашего примера «Path.zip», а вот SQL запрос на выборку мне  придется писать другой.

Прикрепленные файлы

  • Пример.xlsx (12.02 КБ)

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

Добрый день, коллеги! Мне кажется, всё определяется количеством пользователей. Если пользователь один, то нет никакого смысла выходить за рамки Excel. Поиск по отсортированной по ключу «базе данных» в несколько сотен тысяч записей осуществляется мгновенно (но не Find, конечно).

 

footballplayer

Пользователь

Сообщений: 114
Регистрация: 24.01.2017

#20

23.02.2019 18:49:26

sokol92, добрый день, спасибо за ответ!

Цитата
sokol92 написал:
Поиск по отсортированной по ключу «базе данных» в несколько сотен тысяч записей осуществляется мгновенно (но не Find, конечно).

Если несложно, могли бы Вы более развернуто рассказать об этом?

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

В Вашем примере из #18 на листе Access (поменять имя во избежание путаницы :) ) уже есть фрагмент этой «базы» данных. Отсортируйте ее по столбцу «A» и подтягивайте из нее данные с помощью функций ВПР, ПОИСКПОЗ и др. c параметрами поиска, рассчитанными на отсортированные диапазоны (массивы).

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

#22

23.02.2019 19:18:54

Цитата
sokol92 написал:
всё определяется количеством пользователей.

и объемом данных. Еще сравнительно недавно 32к строк  — это был предел.

По вопросам из тем форума, личку не читаю.

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

Здравствуйте, Михаил! Согласен.

 

sokol92, да, в недавней теме на этом сайте один из участников форума подсказал такой вариант и добавил пример. Согласен, работает очень быстро, но все же в данном случае мне хотелось все это реализовать в виде БД, сейчас остановился на БД в Access, пытаюсь разобраться с корректным запросом для выборки)

 

PowerBoy

Пользователь

Сообщений: 141
Регистрация: 13.01.2014

Может Вам это поможет:

https://vk.com/excelsql

Excel + SQL = Activetables

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#26

23.02.2019 22:20:18

Цитата
footballplayer написал:
чтобы из БД обратно в книгу эксель напротив каждого искомого значения были перенесены некоторые параметры товара (в фале-примере — это марка, количество и стоимость).

Да пожалуйста. Набиваете нужные коды товаров на листе queryResult в соответствующем столбце, удаляете строки с уже не нужными и нажимаете обновить. Архив распаковать в папку c:path.

Прикрепленные файлы

  • Path.zip (28.82 КБ)

 

footballplayer

Пользователь

Сообщений: 114
Регистрация: 24.01.2017

#27

24.02.2019 20:11:25

Андрей VG, спасибо за помощь!
Практически удалось реализовать поиск в базе .accdb при помощи макроса и ADO.
Взяв макрос в интернете немного изменил под себя. Все работает, все ищет и вставляет в ячейки в экселе.
У меня возникло 2 вопроса, решив которые все будет работать именно как надо.
1. В процессе поиска мне нужно искать не одно значение, а несколько (от 1 до 200), поэтому, в макросе добавил конструкцию for…next, чтобы перебиваться ячейки книги и поочередно их искать. Но переборе ячеек в for…next, повторно выполняется следующий код:

Код
   Set rs = CreateObject("ADODB.Recordset")

Значит ли это, что я каждый раз создаю рекордсет, потребляет ли это ресурсы и увеличивает ли время работы программы?
Можно ли это обойти и записать все результаты поиска каждой из искомых ячеек в один рекордсет?

2.Сейчас результаты поиска вставляются от ячейки («А1») и ниже. Можно ли на лету разобрать полученный запросом SELECT результат и поместить его в нужную ячейку?

Файл с примером и БД приложил в архиве.

Прикрепленные файлы

  • Пример.zip (27.17 КБ)

Изменено: footballplayer24.02.2019 20:12:15

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#28

24.02.2019 20:19:11

Цитата
footballplayer написал:
В процессе поиска мне нужно искать не одно значение, а несколько (от 1 до 200),

Предложенный мной вариант этого не делает?

Цитата
footballplayer написал:
Но переборе ячеек в for…next, повторно выполняется следующий код:

Не обязательно. Достаточно закрыть после записи данных Recordset и по новой открыть с новой SQL инструкцией.

Цитата
footballplayer написал:
Можно ли на лету разобрать полученный запросом SELECT результат и поместить его в нужную ячейку?

Изучите Range.CopyFromRecordset
Тема Adodb на форуме избита вдоль и поперёк. Не интересно. Так как всё то, что представлено мною выше можно выполнить и макросом, не прибегая к For Each.

Изменено: Андрей VG24.02.2019 20:20:25

 

footballplayer

Пользователь

Сообщений: 114
Регистрация: 24.01.2017

#29

24.02.2019 21:09:27

Цитата
Андрей VG написал:
Предложенный мной вариант этого не делает

Делает. Все работает отлично. Просто, возможно, мне нужно будет полученные в рекордсете данные «на лету» еще обрабатывать и в зависимости от условия применять к ним определенные действия. Без макроса как это сделать — не знаю :-)

Цитата
Андрей VG написал:
Изучите Range.CopyFromRecordset

Спасибо за подсказку! Уже разобрался как переместить результаты в нужные ячейки!

Огромное спасибо за помощь Вам и всем отписавшимся в данной теме!

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

Ответы с готовыми решениями:

Поиск по базе данных
Ситуация такая. В Outlook приходит письмо с прикрепленным exel файлом. В файле. Заказ, номер, дата…

Поиск по базе данных
Здравствуйте, допустим у нас есть некая база данных(будет приложена) нужно написать макрос который…

Поиск в базе данных
Доброго времени суток!

Подскажите, пожалуйста, как можно осуществить поиск водителя по номеру…

VBA поиск по базе данных
Есть база данных 7X100. Нужно произвести поиск по этой базе данных по каждому пункту и вывести…

12

Модератор

Эксперт функциональных языков программированияЭксперт Python

34709 / 19230 / 4040

Регистрация: 12.02.2012

Сообщений: 32,197

Записей в блоге: 13

26.07.2012, 22:41

2

Цитата
Сообщение от homka
Посмотреть сообщение

Может существует какой макрос?

— не думаю.

Цитата
Сообщение от homka
Посмотреть сообщение

Причём, в каждой ячейке вся информация об одном клиенте собрана вместе: телефоны, имена, адреса и прочее

— и кто же это набивал? В глазки бы ему взглянуть…

А если без ёрничанья, то надо парсить каждую ячейку, выделять телефоны и т.д. Но без конкретного примера Вам вряд ли помогут — покажите хотя бы кусок данных.



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 минуты
Вот только как данные записаны? если по какой-то системе…
А если без системы, то задача может быть и не реализуема программно. Такие вырианты здесь тоже обсуждались, но, кажется, 100% решения так и не нашли



0



537 / 28 / 4

Регистрация: 25.04.2011

Сообщений: 238

27.07.2012, 11:49

7

Цитата
Сообщение от homka
Посмотреть сообщение

Пожалуй, ещё ФИО растащу.

Лучше кусочек покажите, потихоньку можно и к результату придти
Вот на тему «ФИО растащу».

Миниатюры

Поиск в базе данных
 



2



0 / 0 / 0

Регистрация: 26.07.2012

Сообщений: 5

27.07.2012, 12:19

 [ТС]

8

ikki
mc-black
Alex77755
Номера телефонов были записаны в разных стилях. Со всеми прелестями: слитно, в скобках, есть пробелы, тире. От незнания в ручную проверены, исправлены мной и, теперь, вроде как, в едином стиле. На сегодняшний день хотя бы можно пользоваться обычным поиском дубликатов при введении новых данных.

В листе Консультаций инфа мной уже растащена на колонки. Каким словом правильно заменить «растащено»?



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,147

27.07.2012, 16:21

9

Для поиска подстроки можно использовать функцию, которая выкладывалась здесь на форуме:

Visual Basic
1
2
3
4
5
6
7
Function FindDigits(ByVal txt$, ByVal DigitsCount%) As String
    ' ищет в строке txt$ подстроку цифр длиной DigitsCount%
    Set RegExp = CreateObject("VBScript.RegExp"): RegExp.Global = True
    RegExp.Pattern = "[D]": txt$ = " " & RegExp.Replace(txt$, " ") & " "
    RegExp.Pattern = " [d]{" & DigitsCount% & "} "
    If RegExp.test(txt$) Then FindDigits = Trim$(RegExp.Execute(txt$)(0).Value)
End Function

Для проверки повторяемости мне очень нравится словарь.

Visual Basic
1
 Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")  ' Создаем словарь

Для ускорения обработки рекомендую считать в массив



1



0 / 0 / 0

Регистрация: 26.07.2012

Сообщений: 5

06.08.2012, 12:31

 [ТС]

10

Alex77755
Спасибо.
Если не затруднит, объясните подробней «что и куда». К сожалению, мы с кодом Visual Basic не на короткой ноге



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

Лучший ответ Сообщение было отмечено как решение

Решение

Так они читабельней

Зато без тире юзабельней
при активном листе «ТК заключенные договора» найдёт дубликаты:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Sub Поиск_дубликатов_номеров()
Dim M()
Dim LR
Dim REZ
Dim R
Dim T
Dim N
Dim S
 
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")  ' Создаем словарь
LR = Cells(Rows.Count, 6).End(xlUp).Row
M = Range(Cells(1, 6), Cells(LR, 6)).Value
    For R = 1 To UBound(M)
    T = Replace(M(R, 1), "-", "")
        N = FindDigits(T, 11) & FindDigits(T, 7) ' вызываем функцию поиска номеров
        If N <> "" Then
            If oDict.exists(N) Then
            oDict.Item(N) = oDict.Item(N) + 1
            S = S & N & " строка " & R & vbCrLf
            Else
            oDict.Add N, 1
            End If
        End If
    Next R
MsgBox S, 64, "ДУБЛИКАТЫ"
End Sub
 
Function FindDigits(ByVal txt$, ByVal DigitsCount%) As String
    ' ищет в строке txt$ подстроку цифр длиной DigitsCount%
    Set RegExp = CreateObject("VBScript.RegExp"): RegExp.Global = True
    RegExp.Pattern = "[D]": txt$ = " " & RegExp.Replace(txt$, " ") & " "
    RegExp.Pattern = " [d]{" & DigitsCount% & "} "
    If RegExp.test(txt$) Then FindDigits = Trim$(RegExp.Execute(txt$)(0).Value)
End Function

Добавлено через 24 минуты
ну и если по всем листам искать:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Dim oDict
Dim S
 
Sub Поиск_дубликатов_номеров()
 
Dim M()
Dim T
Dim N
S = ""
Application.ScreenUpdating = False
Set oDict = CreateObject("Scripting.Dictionary")  ' Создаем словарь
Sheets("ТК  заключенные договора").Select
M = Range(Cells(1, 6), Cells(Cells(Rows.Count, 6).End(xlUp).Row, 7)).Value
ПОИСК M, "ТК  заключенные договора"
Sheets("ТК консультация").Select
M = Range(Cells(1, 6), Cells(Cells(Rows.Count, 6).End(xlUp).Row, 6)).Value
ПОИСК M, "ТК консультация"
Sheets("ТК (отказные)").Select
M = Range(Cells(1, 6), Cells(Cells(Rows.Count, 6).End(xlUp).Row, 6)).Value
ПОИСК M, "ТК (отказные)"
Application.ScreenUpdating = True
MsgBox S, 64, "ДУБЛИКАТЫ"
End Sub
 
Sub ПОИСК(M, List)
Dim R, C
    For R = 1 To UBound(M)
        For C = 1 To UBound(M, 2)
        T = Replace(M(R, C), "-", "")
            N = FindDigits(T, 11) & FindDigits(T, 7) ' вызываем функцию поиска номеров
            If N <> "" Then
                If oDict.exists(N) Then
                oDict.Item(N) = oDict.Item(N) + 1
                S = S & N & " " & List & " строка " & R & vbCrLf
                Else
                oDict.Add N, 1
                End If
            End If
        Next C
    Next R
End Sub
 
Function FindDigits(ByVal txt$, ByVal DigitsCount%) As String
    ' ищет в строке txt$ подстроку цифр длиной DigitsCount%
    Set RegExp = CreateObject("VBScript.RegExp"): RegExp.Global = True
    RegExp.Pattern = "[D]": txt$ = " " & RegExp.Replace(txt$, " ") & " "
    RegExp.Pattern = " [d]{" & DigitsCount% & "} "
    If RegExp.test(txt$) Then FindDigits = Trim$(RegExp.Execute(txt$)(0).Value)
End Function



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:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • xlFormulas (-4123) – формулы.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Знаки подстановки для поисковой фразы

Условные знаки в шаблоне поисковой фразы:

  • ? – знак вопроса обозначает любой отдельный символ;
  • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
  • ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).

Простые примеры

При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

  1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
  2. Если поисковая фраза в заданном диапазоне найдена не будет, метод 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>

Понравилась статья? Поделить с друзьями:
  • Поиск в word спецсимволы
  • Поиск в word по словам клавиши
  • Поиск в word по сети
  • Поиск в word несколько документов
  • Поиск в word не открывая документа