Цитата |
---|
Андрей VG написал: Предложенный мной вариант этого не делает |
Цитата |
---|
Андрей VG написал: Изучите Range.CopyFromRecordset |
Огромное спасибо за помощь Вам и всем отписавшимся в данной теме!
24.02.2019 21:09:27
Огромное спасибо за помощь Вам и всем отписавшимся в данной теме! |
|||||
|
24.02.2019 20:11:25
Андрей VG, спасибо за помощь!
Практически удалось реализовать поиск в базе .accdb при помощи макроса и ADO. Взяв макрос в интернете немного изменил под себя. Все работает, все ищет и вставляет в ячейки в экселе. У меня возникло 2 вопроса, решив которые все будет работать именно как надо. 1. В процессе поиска мне нужно искать не одно значение, а несколько (от 1 до 200), поэтому, в макросе добавил конструкцию for...next, чтобы перебиваться ячейки книги и поочередно их искать. Но переборе ячеек в for...next, повторно выполняется следующий код:
Можно ли это обойти и записать все результаты поиска каждой из искомых ячеек в один рекордсет? 2.Сейчас результаты поиска вставляются от ячейки ("А1") и ниже. Можно ли на лету разобрать полученный запросом SELECT результат и поместить его в нужную ячейку? Файл с примером и БД приложил в архиве.
Изменено: |
|||
|
23.02.2019 19:33:22
sokol92, да, в недавней теме на этом сайте один из участников форума подсказал такой вариант и добавил пример. Согласен, работает очень быстро, но все же в данном случае мне хотелось все это реализовать в виде БД, сейчас остановился на БД в Access, пытаюсь разобраться с корректным запросом для выборки)
|
|
|
23.02.2019 16:45:45
Андрей VG, исходя из того, что я понял по ответам в данной теме, попробую развернуто описать свою задачу.
Необходимо вставлять в книгу эксель данные для поиска (в файле-примере - столбец "А", код товара). Ячеек для поиска будет не больше 200. Сама база данных будет храниться в Access, по такой же типу, как в Вашем примере "Path.zip" выше. В случае если поиск прошел успешно, необходимо, чтобы из БД обратно в книгу эксель напротив каждого искомого значения были перенесены некоторые параметры товара (в фале-примере - это марка, количество и стоимость). Насколько, для подключения к БД я могу использовать данные из Вашего примера "Path.zip", а вот SQL запрос на выборку мне придется писать другой. |
|
|
23.02.2019 15:53:26
БМВ, согласен с Вами, для 100 000 строк самого Экселя достаточно, сейчас процесс именно так и организован.
Но со временем база может расти и строк будет больше, поэтому хотелось сразу воспользоваться базой данных (SQL, Access) и делать выборку оттуда путем SQL запросов. Из полученных в данной теме подсказок и примера многое в решении задачи стало более понятно, буду стараться разобраться. Есть два небольших вопроса: 1. Если БД лежит на локальном компьютере или в локально сети, можно ли получить выборку из БД при помощи рекордсета? 2. По скорости работы, поиск в БД при помощи SQL запроса быстрее, чем делать Find через макрос в книге Эксель с таким же количеством строк? |
|
|
23.02.2019 13:45:33
Спасибо всем отписавшимся!
БМВ, объемы динамические. Если сама база будет ориентировочно 100 000+ строк, то количество значений для поиска будет где-то от 1 до 200 разных. Андрей VG, вероятно, я, из-за слабого знания предмета вопроса, я выразился неправильно. Из Вашего примера в файле Path.zip стало понятно, что SQL-запрос может быть и таблицу Access (не только d SQL базу), этого просто не знал. Попробую изучить пример написанного Вами запроса в таблицу для выборки данных. Подскажите, пожалуйста, возможно ли перенести запрос в таблицу из Вашего примера в макрос? Для этих целей используется ADO, нужно читать об этом? Спрашиваю в связи с тем, что хотелось бы иметь кнопку на рабочем листа, чтобы пользователь нажал и произошла выборка данных из таблицы, по типу запуска макроса.
Изменено: |
|
|
22.02.2019 21:47:51
Андрей VG, сказать честно в разновидностях SQL серверов не искушен. Работал с таблицами SQL через phpMyAdminи это весь опыт. В данном случае хотел перенести функционал в область поисковых запросов не в другую книгу эксель, а в базу данных. Для меня предпочтителен тот вариант, где я смогу по гуглу составить скрипт на поиск максимально проще, т.к. в этой области не силен. Если Вы укажете куда мне, как чайнику, лучше смотреть - занялся бы изучением вопроса прямо сегодня, т.к. сроки меня поджимают)
|
|
|
22.02.2019 09:49:11
Пытливый, спасибо за ответ!
Ваш способ очень устраивает. Огромное спасибо за помощь! А можно ли доработать формулу так, чтобы она выдавала не первое совпадение, а последнее? Либо, сделать поиск снизу вверх? Хотелось бы понять еще один момент. Есть ли у VBA в связке с SQL функционал (как тот же метод Find), при котором можно провести поиск определенного значение (к примеру, ID, как в файле-примере) в базе и при успешном нахождении искомого значения, уже далее брать нужные данные из строки с найденным значением? Знаю, что через VBA из SQL базу можно сделать выборку по методу SELECT, но является ли это полноценным поиском? Если такая возможность есть, то попробовал бы ознакомиться с мануалами и реализовать задачу. Либо, возможно, есть что-то подобное в Access? |
|
|
21.02.2019 15:19:21
Пытливый, спасибо за ответ!
Очень круто!) Честно сказать, не думал, что формулы могут работать с закрытыми файлами. Подскажите, пожалуйста, по двум вопросам: 1. что будет, если в базе будет два или более одинаковых значения? Какое из них формула возьмет за результат поиска? 2. Если в базе будет несколько сотен тысяч строк, сохранится ли быстродействие поиска по формуле?
Изменено: |
|
|
21.02.2019 14:48:18
Пытливый, спасибо за ответ!
Да, Ваша формула работает отлично. Но правильно ли я понимаю, что для формулы необходимо чтобы файл с базой был открыт? Основная проблема в том, чтобы сделать поиск не открывая сам файл. В связи с этим на ум пришла идея с базой в SQL или Access, но в связи с малым объемом знаний в области взаимодействия этих баз с VBA, не уверен, что метод Find будет работать с базой SQL или Access. |
|
|
28.03.2018 21:40:55
Nordheim, спасибо за ответ.
К сожалению, Ваш пример выдал ошибку и моих небольших знаний не хватает, чтобы самому понять в чем проблема) Вероятно, я не совсем правильно излагаю то, что хочу получить от макроса, примерно понимаю это сам. Если попробовать объяснить на примере кода, то мне необходимо (если это возможно), доработать этот кусок кода:
чтобы поиск происходил не по одной ячейке Cells(i, 1), а по нескольким ячейкам строки, к примеру
и поиск считался успешным, если значение трех ячеек найдено в одной строке. В остальном, исходный макрос полностью устраивает и решает задачу.
Изменено: |
|||||
|
28.03.2018 21:31:17
Nordheim, спасибо за ответ.
Забыл написать, что повторов на листе, в котором происходит поиск - не бывает. В идеале собираюсь подкорректировать макрос так, чтобы он не просто копировал строки, где найдено искомое значение, но и удалял их после копирования. Поэтому даже если некоторое количество повторов будет, можно будет просто несколько раз запустить макрос и эти повторные значения доперенести.
Изменено: |
|
|
28.03.2018 21:03:56
Sanja, спасибо за ответ.
Файл с примером приложил. В настоящий момент макрос ищет данные, введенные в столбце "А" листа "find_text" по очереди во всех ячейках диапазона "A:P" листа "text". Если значение находится, то происходит перенос той строки, в которой найдено значение на лист "result". Мне необходимо, чтобы искалось значение не одной ячейки столбца "А", а поиск происходил по трем ячейкам столбцов "А", "В" и "С" (если они заполнены) и поиск считался успешным только тогда, когда в одной строке найдено совпадение по трем ячейкам, если заполнены только две ячейки искомой строки, то поиск считался бы успешным при совпадении двух искомых значение в одной строке и если заполнена только одна ячейка искомой строки, то поиск шел только по одной. Вероятнее всего я объясняю совсем непонятно. В файле примере на первом листе указал три строки с искомыми ячейками - в одной строке три ячейка заполнены, в другой одна ячейка и в третьей заполнено две ячейки. На третьем листе "result" указал результат, то есть, если искомые значение были найдены в строке, то вся строка перенеслась со второго листа на третий. |
|
|
28.03.2018 20:21:37
Добрый вечер, уважаемые участники форума.
Помогите, пожалуйста, разобраться в вопросе. Есть задача произвести поиск в большой таблице на одном листе. Искомые значения располагаются на отдельном листе. Если значение найдено, то вся строка, в которой найдено искомое значение, переносится на отдельный лист. Следующий макрос решает описанную выше задачу:
В данном макросе искомое значение находится в ячейке "Cells(i.1), то есть, в ячейках столбца "А", т.е., сначала ищется содержимое ячейки"А1", потом "А2" и т.д. согласно циклу. Подскажите, пожалуйста, можно ли доработать данный макрос так, чтобы поиск происходил по ячейкам "А1, В1, С1", в том случае, если в ячейках "В1" и "С1" есть содержимое, а если в них содержимого нет, то поиск происходил бы как сейчас только по ячейке "А1" и т..д. и поиск считался бы успешным, если содержимое ячеек "А1", "В1" и "С1" найдены в одной строке вместе? Спасибо.
Изменено: |
|||
|
03.03.2018 00:50:25
Добрый вечер, уважаемые участники форума.
Извиняюсь за вторую подряд тему на форуме. Прошу помощи в моем вопросе. Прочитал несколько тем, в которых обсуждается выбор процессора и объема ОЗУ для оптимальной скорости работы макросов VBA. Исходя из прочитанного стало понятно, что VBA работает однопоточно, т.е. с одним ядром процессора и не умеет работать со всеми ядрами процессора, если их больше одного. Исходя их этого получается, что лучше работать на 2-х ядерном процессоре с большей частотой, чем на 4-х ядерном с меньшей частотой каждого изз ядер. Подскажите, пожалуйста, правильно ли я сделал выводы из прочитанного? Лучше ли для VBA, к примеру, 2-х ядерный процессор с 3 МГц, чем 4-х ядерный процессор с 2 МГц? |
|
|
02.03.2018 23:30:18
Добрый вечер, уважаемые участники форума.
Помогите, пожалуйста, разобраться в вопросе. Есть несколько макросов, которые зациклены и работают в том числе с браузером IE. В процессе работы замечаю, что в диспетчере задач с каждым выполненным циклом макроса увеличивается и объем памяти, которую занимает браузер IE. При достижении определенного объема памяти занимаемой процессом, работа макроса становится нестабильной. Более чем уверен, что сам макрос написан далеко не в лучшем виде. Но возникает такой вопрос: если почему растет объем памяти, занимаемого процессом IE, если все переменные, все формулы и т.д. работает в рамках Экселя и не должен ли расти объем памяти процесса Экселя, а не процесса браузера? Самого кода под рукой нет, но вопрос даже не в правильности кода, а в том - почему с каждым циклом макроса растет занимаемая IE памяти? Спасибо! |
|
|
26.02.2018 14:53:55
Доброго дня, уважаемые участники форума!
Прошу помочь разобраться с проблемой в макросе. Суть проблемы такова. Есть небольшой макрос, который заполняет поля на сайте. Макрос работает с уже открытым окном браузера IE (при запуске макроса IE уже открыт на нужном сайте). Доступ к открытому окну браузера получаю так:
Написал такой код.:
По факту же, из всего указанного работает только открытие нового окна браузера, переход по ссылке и с переменным успехом закрывается старое окно (иногда может не закрыться). После чего все повисает, макрос не продолжает работу с новым окном браузера и подвисает на первой же строке кода, где используется ie_browser.getElementByID("...").value = "....". Если остановить макрос и навести мышкой на ie_browser, то видно, что скрипт на определил новое окно и подсвечивается ошибка "variable or with block variable not set". Понимаю, что мой код далек от совершенства. Помогите, пожалуйста, понять что мешает работе с новым окном, как описано выше. Спасибо! UPD: пришла такая мысль... Если открыть новое окно браузера, перейти по URL, закрыть старое окно и сделать:
Просто сейчас протестировать этот момент не могу. UPD 2: Насколько удалось понять данный код просто не замечает новое открытое окно браузера IE и не передает переменной ie_browser управление браузером.. Однако данный код отлично работает, если остановить макрос и запустить его заново руками, но если перейти в начало кода через GoTo, то код не перехватывает окно IE...
Изменено: |
|||||||||
|
04.02.2018 14:28:39
Добрый день!
На сайте, работающем на ангуляре, есть кнопка, при нажатии которой происходит определенное действие. При просмотре кода кнопки видно, что на нее повешено событие следующего типа:
Насколько я понимаю, это означает, что при нажатии кнопки будет выполнена функция "addText()". Отсюда возник вопрос: можно ли как-нибудь из кода VBA запустить программно функцию "addText()", без нажатия кнопки на сайте? Пытался сделать так:
|
|||||
|
31.12.2017 23:10:56
AAF, подскажите, пожалуйста, почему данная пауза не срабатывает в следующем случае:
Делаю так: запускаю данный код, когда браузер находится на сайте, где класса "textbox" в HTML коде нет. Соответственно, код запускается и повторяется в цикле, т.к. нужного имени класса в HTML коде нет. После этого перехожу в браузере на сайт, где имя класса "textbox" и, как я понимаю, при загрузке HTML кода, где есть данное имя класса тега, код должен при очередном прохождении цикла увидеть, что есть нужный класс и вывести его текст через MsgBox text_item.innerText. Однако, этого не происходит. Даже после полной загрузке сайта код продолжает выполняться в цикле бесконечно, не замечая, что нужное имя класса уже существует. Возможно, я что-то делаю не так?
Изменено: |
|||
|
31.12.2017 18:58:58
AAF, спасибо за ответ!
Указанный Вами код помог в решении вопроса. Заполнение полей происходит без ошибок. Спасибо! Jungl, чуть доработал указанный Вами код с добавлением Err.Clear, код так же работает отлично, заполнение происходит без ошибок.
Большое спасибо всем за помощь! |
|||
|
27.12.2017 02:21:37
Jungl, спасибо за ответ.
К сожалению, показать сам сайт в качестве примера сейчас не смогу, т.к. там специфическая форма входа. Понимаю, что без примера говорить о чем-то очень сложно) Код приведенный вами, понял, разобрал. :
Это как раз именно то, что мне нужно. Но возникла проблема. Для проверки делал так: запускал кусок макроса для заполнения одного отдельного поля в то время, когда сайт открыт в том месте, где этого поля нет. Потом перехожу на страницу, где есть заполняемое поле. Поле корректно заполняется, но выход из цикла не происходит и в цикле повторяется ошибка (как я увидел в debug.print), ошибка даже после заполнения формы не исчезает и цикл бесконечно выполняется. Попробовал доработать код так, чтобы происходил выход из цикла, когда в заполняемом поле появляется текст с длиной более нескольких символов:
Скажите, пожалуйста, такой способ выхода из цикла корректен? Фактически это срабатывает, но волнует момент - не снижает ли такая конструкция работу макроса на среднем ПК? Возможно, можно как-то по-другому выйти из цикла:
Если это возможно, то данный вариант был бы идеально подходящим для меня.
Изменено: |
|||||||
|
26.12.2017 22:22:58
Jungl, спасибо за ответ.
Если Вам несложно, объясните, пожалуйста для понимания процесса два момента. 1. Правильно ли я понимаю, что данная конструкция означает, что выход из цикла будет выполнен, если в течение этого цикла не было ошибок
А как себя поведет данный код, если возникнет ошибка с номером, указанная в начале темы? Макрос остановится и выдаст окно ошибки? 2. Правильно ли я понимаю, что процесс заполнения в поля формы, код которого указан ниже, возвращает True?
|
|||||
|