Страницы: 1
RSS
Поиск данных из Эксель-файла в базе данных SQL
 
Добрый вечер, уважаемые участники форума.

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

Спасибо!
 
Есть, только обычно делается это не так, ибо по каждому значению базу дергать нет смысла, а вот подготовить таблицу и по ней получить ответ с пакетом данных что нужен - это правильнее. хотя смотря сколько ячеек, может оказаться проще несколько запросов, чем один городить с TEMPDB.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
чем один городить с TEMPD
Привет, Михаил.
А зачем через tempdb? Можно одним запросом к таблице на листе Excel и таблице(ам) Access.
 
Андрей VG, Андрей, привет. Ну вопрос был про SQL, Access опционально :-).
Если
Цитата
footballplayer написал:
брать данные из ячеек в файле Эксель
и их не много, то можно и в WHERE  OR . Но неправильно это.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
WHERE  
Зачем тут Where (можно, но зачем)? Классика жанра Inner Join таблицы нужного в Excel и таблицы откуда брать в Access.
Изменено: Андрей VG - 22.02.2019 20:49:24
 
Андрей,
Цитата
БМВ написал:
Ну вопрос был про SQL
я про это.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Ну вопрос был про SQL
Дык, и я про это. Распаковываем архив в папку c:\path. На листе queryTable вводим нужные имена, по которым нужно выбрать данные в таблице Access, на листе queryResult обновляем таблицу. Или я о чём то другом?
 
Что-то,  наверно впервые, мы не синхронизируемся. Вы про SQL синтаксис, а я про базу и SQL сервер . Или так и с ней пройдет? Да даже если и пройдет, то связка будет на уровне клиента, а не сервера, что возможно окажется хуже, чем несколько простых запросов.
Изменено: БМВ - 22.02.2019 21:29:23
По вопросам из тем форума, личку не читаю.
 
Спасибо за отклик на мой вопрос.
На самом деле для меня приоритетнее смотреть в сторону SQL, но если с SQL это невозможно, то Access так же подходит.
Еще забыл указать, что база SQL (или Access) может храниться локально на том же компьютере, что и файл с искомыми данными.
Если бы Вы подсказали мне в какую сторону смотреть для реализации, был бы очень благодарен, попробовал бы разобраться сам, если, конечно, это реально без особых знаний в SQL реализовать)
 
Цитата
БМВ написал:
SQL сервер
смотря какой. Тут ТС как обычно постеснялся детализировать. К ms sql server и Oracle можно в принципе сделать. Тут всё зависит, что разрешено. По мне так лучше через временну таблицу и через Power Query. Но тут я пас, пример рисовать не буду.
Изменено: Андрей VG - 22.02.2019 21:37:49
 
Андрей VG, сказать честно в разновидностях SQL  серверов не искушен. Работал с таблицами SQL через phpMyAdminи это весь опыт. В данном случае хотел перенести функционал в область поисковых запросов не в другую книгу эксель, а в базу данных. Для меня предпочтителен тот вариант, где я смогу по гуглу составить скрипт на поиск максимально проще, т.к. в этой области не силен. Если Вы укажете куда мне, как чайнику,  лучше смотреть - занялся бы изучением вопроса прямо сегодня, т.к. сроки меня поджимают)
 
footballplayer, смотреть надо не в сторону, а отталкиваться от объемов.
По вопросам из тем форума, личку не читаю.
 
Цитата
footballplayer написал:
перенести функционал в область поисковых запросов не в другую книгу эксель, а в базу данных
Тогда вам лучше идти на sql.ru с таким вопросом. Явно же не по Excel вопрос.
 
Спасибо всем отписавшимся!

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

Андрей VG,  вероятно, я, из-за слабого знания предмета вопроса, я выразился неправильно. Из Вашего примера в файле Path.zip стало понятно, что SQL-запрос может быть и таблицу Access (не только d SQL базу), этого просто не знал. Попробую изучить пример написанного Вами запроса в таблицу для выборки данных.
Подскажите, пожалуйста, возможно ли перенести запрос в таблицу из Вашего примера в макрос? Для этих целей используется ADO, нужно читать об этом?
Спрашиваю в связи с тем, что хотелось бы иметь кнопку на рабочем листа, чтобы пользователь нажал и произошла выборка данных из таблицы, по типу запуска макроса.
Изменено: footballplayer - 23.02.2019 13:46:38
 
Цитата
footballplayer написал:
Если сама база будет ориентировочно 100 000+ строк
то и просто таблицы excel будет достаточно, а уж как запрос будет оформлен, через SQL или PowerQuery - это дело техники. СУБД  может потребоваться при больших объемах, нагрузке  или удаленности её от клиента. Вот тогда получить в качеcтве ответа готовую выборку, а не всю таблицу для последующей обработки на клиенте, эффективнее, в том числе и access.
Изменено: БМВ - 23.02.2019 14:00:19
По вопросам из тем форума, личку не читаю.
 
БМВ, согласен с Вами, для 100 000 строк самого Экселя достаточно, сейчас процесс именно так и организован.
Но со временем база может расти и строк будет больше, поэтому хотелось сразу воспользоваться базой данных (SQL, Access) и делать выборку оттуда путем SQL запросов.
Из полученных в данной теме подсказок и примера многое в решении задачи стало более понятно, буду стараться разобраться.

Есть два небольших вопроса:
1. Если БД лежит на локальном компьютере или в локально сети, можно ли получить выборку из БД при помощи рекордсета?
2. По скорости работы, поиск в БД при помощи SQL запроса быстрее, чем делать Find через макрос в книге Эксель с таким же количеством строк?
 
Цитата
footballplayer написал:
при помощи рекордсета?
Можно, просто нужно детализировать, что за базу данных вы используете. Если Access, то данные свойства подключения переносятся один к одному. Строка подключения и собственно SQL запрос.
Цитата
footballplayer написал:
поиск в БД при помощи SQL запроса быстрее, чем делать Find через макрос в книге Эксель
Быстрее, если построен индекс по поисковым полям, в противном случае особой разницы не будет. Более того, учитывая что для реализации SQL нужно инициализировать движок, то первый запрос может выполняться и дольше.
Слишком мало вы предоставляете информации. При таком объёме вводных все рассуждения аналогичны рассуждениям о сферическом коне в вакууме.
 
Андрей VG, исходя из того, что я понял по ответам в данной теме, попробую развернуто описать свою задачу.
Необходимо вставлять в книгу эксель данные для поиска (в файле-примере - столбец "А", код товара). Ячеек для поиска будет не больше 200. Сама база данных будет храниться в Access, по такой же типу, как в Вашем примере "Path.zip" выше.
В случае если поиск прошел успешно, необходимо, чтобы из БД обратно в книгу эксель напротив каждого искомого значения были перенесены некоторые параметры товара (в фале-примере - это марка, количество и стоимость).

Насколько, для подключения к БД я могу использовать данные из Вашего примера "Path.zip", а вот SQL запрос на выборку мне  придется писать другой.
 
Добрый день, коллеги! Мне кажется, всё определяется количеством пользователей. Если пользователь один, то нет никакого смысла выходить за рамки Excel. Поиск по отсортированной по ключу "базе данных" в несколько сотен тысяч записей осуществляется мгновенно (но не Find, конечно).
Владимир
 
sokol92, добрый день, спасибо за ответ!
Цитата
sokol92 написал:
Поиск по отсортированной по ключу "базе данных" в несколько сотен тысяч записей осуществляется мгновенно (но не Find, конечно).
Если несложно, могли бы Вы более развернуто рассказать об этом?
 
В Вашем примере из #18 на листе Access (поменять имя во избежание путаницы :) ) уже есть фрагмент этой "базы" данных. Отсортируйте ее по столбцу "A" и подтягивайте из нее данные с помощью функций ВПР, ПОИСКПОЗ и др. c параметрами поиска, рассчитанными на отсортированные диапазоны (массивы).
Владимир
 
Цитата
sokol92 написал:
всё определяется количеством пользователей.
и объемом данных. Еще сравнительно недавно 32к строк  - это был предел.
По вопросам из тем форума, личку не читаю.
 
Здравствуйте, Михаил! Согласен.
Владимир
 
sokol92, да, в недавней теме на этом сайте один из участников форума подсказал такой вариант и добавил пример. Согласен, работает очень быстро, но все же в данном случае мне хотелось все это реализовать в виде БД, сейчас остановился на БД в Access, пытаюсь разобраться с корректным запросом для выборки)
 
Может Вам это поможет: https://vk.com/excelsql
Excel + SQL = Activetables
 
Цитата
footballplayer написал:
чтобы из БД обратно в книгу эксель напротив каждого искомого значения были перенесены некоторые параметры товара (в фале-примере - это марка, количество и стоимость).
Да пожалуйста. Набиваете нужные коды товаров на листе queryResult в соответствующем столбце, удаляете строки с уже не нужными и нажимаете обновить. Архив распаковать в папку c:\path.
 
Андрей VG, спасибо за помощь!
Практически удалось реализовать поиск в базе .accdb при помощи макроса и ADO.
Взяв макрос в интернете немного изменил под себя. Все работает, все ищет и вставляет в ячейки в экселе.
У меня возникло 2 вопроса, решив которые все будет работать именно как надо.
1. В процессе поиска мне нужно искать не одно значение, а несколько (от 1 до 200), поэтому, в макросе добавил конструкцию for...next, чтобы перебиваться ячейки книги и поочередно их искать. Но переборе ячеек в for...next, повторно выполняется следующий код:
Код
   Set rs = CreateObject("ADODB.Recordset")
Значит ли это, что я каждый раз создаю рекордсет, потребляет ли это ресурсы и увеличивает ли время работы программы?
Можно ли это обойти и записать все результаты поиска каждой из искомых ячеек в один рекордсет?

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

Файл с примером и БД приложил в архиве.
Изменено: footballplayer - 24.02.2019 20:12:15
 
Цитата
footballplayer написал:
В процессе поиска мне нужно искать не одно значение, а несколько (от 1 до 200),
Предложенный мной вариант этого не делает?
Цитата
footballplayer написал:
Но переборе ячеек в for...next, повторно выполняется следующий код:
Не обязательно. Достаточно закрыть после записи данных Recordset и по новой открыть с новой SQL инструкцией.
Цитата
footballplayer написал:
Можно ли на лету разобрать полученный запросом SELECT результат и поместить его в нужную ячейку?
Изучите Range.CopyFromRecordset
Тема Adodb на форуме избита вдоль и поперёк. Не интересно. Так как всё то, что представлено мною выше можно выполнить и макросом, не прибегая к For Each.
Изменено: Андрей VG - 24.02.2019 20:20:25
 
Цитата
Андрей VG написал:
Предложенный мной вариант этого не делает
Делает. Все работает отлично. Просто, возможно, мне нужно будет полученные в рекордсете данные "на лету" еще обрабатывать и в зависимости от условия применять к ним определенные действия. Без макроса как это сделать - не знаю :-)

Цитата
Андрей VG написал:
Изучите Range.CopyFromRecordset
Спасибо за подсказку! Уже разобрался как переместить результаты в нужные ячейки!

Огромное спасибо за помощь Вам и всем отписавшимся в данной теме!
Страницы: 1
Наверх