Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 След.
Поиск данных из Эксель-файла в базе данных SQL
 
Цитата
Андрей VG написал:
Предложенный мной вариант этого не делает
Делает. Все работает отлично. Просто, возможно, мне нужно будет полученные в рекордсете данные "на лету" еще обрабатывать и в зависимости от условия применять к ним определенные действия. Без макроса как это сделать - не знаю :-)

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

Огромное спасибо за помощь Вам и всем отписавшимся в данной теме!
Поиск данных из Эксель-файла в базе данных SQL
 
Андрей 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
Поиск данных из Эксель-файла в базе данных SQL
 
sokol92, да, в недавней теме на этом сайте один из участников форума подсказал такой вариант и добавил пример. Согласен, работает очень быстро, но все же в данном случае мне хотелось все это реализовать в виде БД, сейчас остановился на БД в Access, пытаюсь разобраться с корректным запросом для выборки)
Поиск данных из Эксель-файла в базе данных SQL
 
sokol92, добрый день, спасибо за ответ!
Цитата
sokol92 написал:
Поиск по отсортированной по ключу "базе данных" в несколько сотен тысяч записей осуществляется мгновенно (но не Find, конечно).
Если несложно, могли бы Вы более развернуто рассказать об этом?
Поиск данных из Эксель-файла в базе данных SQL
 
Андрей VG, исходя из того, что я понял по ответам в данной теме, попробую развернуто описать свою задачу.
Необходимо вставлять в книгу эксель данные для поиска (в файле-примере - столбец "А", код товара). Ячеек для поиска будет не больше 200. Сама база данных будет храниться в Access, по такой же типу, как в Вашем примере "Path.zip" выше.
В случае если поиск прошел успешно, необходимо, чтобы из БД обратно в книгу эксель напротив каждого искомого значения были перенесены некоторые параметры товара (в фале-примере - это марка, количество и стоимость).

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

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

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

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

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

Спасибо!
Поиск данных в закрытой книге Эксель, состоящей из большого количества строк.
 
Пытливый, спасибо за ответ!
Ваш способ очень устраивает. Огромное спасибо за помощь!
А можно ли доработать формулу так, чтобы она выдавала не первое совпадение, а последнее? Либо, сделать поиск снизу вверх?

Хотелось бы понять еще один момент. Есть ли у VBA в связке с SQL функционал (как тот же метод Find), при котором можно провести поиск определенного значение (к примеру, ID, как в файле-примере) в базе и при успешном нахождении искомого значения, уже далее брать нужные данные из строки с найденным значением?
Знаю, что через VBA из SQL базу можно сделать выборку по методу SELECT, но является ли это полноценным поиском?
Если такая возможность есть, то попробовал бы ознакомиться с мануалами и реализовать задачу.
Либо, возможно, есть что-то подобное в Access?
Поиск данных в закрытой книге Эксель, состоящей из большого количества строк.
 
Пытливый, спасибо за ответ!
Очень круто!) Честно сказать, не думал, что формулы могут работать с закрытыми файлами.

Подскажите, пожалуйста, по двум вопросам:

1. что будет, если в базе будет два или более одинаковых значения? Какое из них формула возьмет за результат поиска?
2. Если в базе будет несколько сотен тысяч строк, сохранится ли быстродействие поиска по формуле?
Изменено: footballplayer - 21.02.2019 15:20:13
Поиск данных в закрытой книге Эксель, состоящей из большого количества строк.
 
Пытливый, спасибо за ответ!
Да, Ваша формула работает отлично. Но правильно ли я понимаю, что для формулы необходимо чтобы файл с базой был открыт?
Основная проблема в том, чтобы сделать поиск не открывая сам файл. В связи с этим на ум пришла идея с базой в SQL или Access, но в связи с малым объемом знаний в области взаимодействия этих баз с VBA, не уверен, что метод Find будет работать с базой SQL или Access.
Поиск данных в закрытой книге Эксель, состоящей из большого количества строк.
 
Доброго дня, уважаемые участники форума!

Прошу помочь в решении задачи. Задача состоит в следующем.(файл с примером приложил")
Необходимо каждое значение из столбца "А"  листа "Что ищем" искать в столбце "А" листа "База". Если оно найдено, что необходимо получить параметр "Цена" у найденного оборудования.
Суть процесса примерно понимаю, но сложность состоит в том, что в файле "База" может быть несколько сотен тысяч строк, в которых нужно будет искать по одному искомому значению. Искомых значений может быть от 1 до более сотни, а сама база будет увеличиваться.
В связи с тем, что файл будет довольно тяжелым и одно его открытие для среднего ПК будет усложнено, не говоря уже о самом процессе поиска с перебором каждой строки листа "База".

Исходя из этого хотел спросить: каким образом будет оптимальнее реализовать данный процесс? Можно ли, к примеру, сделать лист "База" в виде SQL базы и уже в ней делать поиск? Будет ли это быстрее? Либо, возможно, тут будет полезнее Access?

Поделитесь, пожалуйста, Вашими мыслями по этому поводу.

Спасибо!
Корректное закрытие браузера IE
 
Доброго дня, уважаемые участники форума.
Помогите, пожалуйста, разобраться в вопросе.
Суть вопроса такова: есть макрос, который работает с сайтом. При запуске макроса сайт уже открыт и он подхватывает уже открытое окно браузера.
В процессе работы макроса необходимо иногда закрывать активное окно браузера, в котором открыт сайт, но прежде открыв новое окно браузера.
С кодом, указанным ниже все работало достаточно хорошо: открывалось новое окно браузера, после чего старое закрывалось и работа продолжалась.
Но с недавнего времени происходит так, что макрос открывает новый экземпляр браузера, но не может закрыть старое окно и происходит зависание, т.к. в макросе установлен цикл, который ждет пока количество открытых окон IE станет на 1 экземпляр меньше, но окно не закрывается.

Сам код:
Код
' макрос подхватывает уже открытое окно IE и начинает работу
Do

Dim sApplicationName As String
sApplicationName = "Internet Explorer"
Dim WshShell
Dim oShellWindows As New SHDocVw.ShellWindows
Dim oie As SHDocVw.WebBrowser
Dim brows_check As String
Dim sFlag As Boolean
sFlag = False
browser_URL = "какой-то сайт"
If oShellWindows.Count = 0 Then
MsgBox "IE не открыт!", vbCritical
Exit Sub
End If

For Each oie In oShellWindows
If oie.Application = sApplicationName And Left(oie.LocationURL, 11) = browser_URL Then
    bFlag = True

If bFlag = False Then
MsgBox "IE не открыт!", vbCritical
Exit Sub
End If

Exit For
End If
Next oie
Sleep (300)
Loop Until oie = "Internet Explorer"
Application.Wait (Now + TimeValue("0:00:03"))

''''''''''''''''''''
' тут идет определенный код

''''''''''''''''''''
'При помощи данного кода открывается новое окно IE и закрывается старое, после чего макрос идет в начало кода и повторно подхватывает IE и продолжает работу:

Set IE = CreateObject("InternetExplorer.Application") ' открывается новое окно IE
IE.Visible = True
IE.navigate "какой-то сайт" 'переход на нужный URL

shell_count = oShellWindows.Count ' запоминаем сколько окон открыто
oie.Quit ' закрывает старое окно IE (как раз тут проблема - окно не закрывается)

Do
DoEvents
Loop Until oShellWindows.Count = shell_count - 1 ' ждем, когда окон станет на 1 меньше

Set oie = Nothing

' далее макрос идет в начало данного кода

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

Спасибо!
Поиск данных на листе
 
Nordheim, спасибо за ответ.

К сожалению, Ваш пример выдал ошибку и моих небольших знаний не хватает, чтобы самому понять в чем проблема)
Вероятно, я не совсем правильно излагаю то, что хочу получить от макроса, примерно понимаю это сам.

Если попробовать объяснить на примере кода, то мне необходимо (если это возможно), доработать этот кусок кода:
Код
Set x = Text.Range("a:s").Find(find_text.Cells(i, 1), , xlValues, xlWhole)



чтобы поиск происходил не по одной ячейке Cells(i, 1), а по нескольким ячейкам строки, к примеру
Код
Set x = Text.Range("a:s").Find(find_text.Cells(i, 1) & Cells(i, 2) & Cells(i, 3), , xlValues, xlWhole)

и поиск считался успешным, если значение трех ячеек найдено в одной строке.
В остальном, исходный макрос полностью устраивает и решает задачу.
Изменено: footballplayer - 28.03.2018 21:42:19
Поиск данных на листе
 
Nordheim, спасибо за ответ.

Забыл написать, что повторов на листе, в котором происходит поиск  - не бывает.
В идеале собираюсь подкорректировать макрос так, чтобы он не просто копировал строки, где найдено искомое значение, но и удалял их после копирования. Поэтому даже если некоторое количество повторов будет, можно будет просто несколько раз запустить макрос и эти повторные значения доперенести.
Изменено: footballplayer - 28.03.2018 21:32:43
Поиск данных на листе
 
Sanja, спасибо за ответ.
Файл  с примером приложил.

В настоящий момент макрос ищет данные, введенные в столбце "А" листа "find_text" по очереди во всех ячейках диапазона "A:P" листа "text".
Если значение находится, то происходит перенос той строки, в которой найдено значение на лист "result".
Мне необходимо, чтобы искалось значение не одной ячейки столбца "А", а поиск происходил по трем ячейкам столбцов  "А", "В" и "С" (если они заполнены)  и поиск считался успешным только тогда, когда в одной строке найдено совпадение по трем ячейкам, если заполнены только две ячейки искомой строки, то поиск считался бы успешным при совпадении двух искомых значение в одной строке и если заполнена только одна ячейка искомой строки, то поиск шел только по одной.
Вероятнее всего я объясняю совсем непонятно. В файле примере на первом листе указал три строки с искомыми ячейками -  в одной строке три ячейка заполнены, в другой одна ячейка и в третьей заполнено две ячейки. На третьем листе "result" указал результат, то есть, если искомые значение были найдены в строке, то вся строка перенеслась со второго листа на третий.
Поиск данных на листе
 
Добрый вечер, уважаемые участники форума.
Помогите, пожалуйста, разобраться в вопросе.
Есть задача произвести поиск в большой таблице на одном листе. Искомые значения располагаются на отдельном листе. Если значение найдено, то вся строка, в которой найдено искомое значение, переносится на отдельный лист.
Следующий макрос решает описанную выше задачу:

Код
Sub test()

 Set find_text = Worksheets("find_text")
    Set find_text_sheet = Worksheets("find_text_sheet")
    Set result = Worksheets("result")
    Dim x As Range
   
    LRow = find_text.Cells(Rows.Count, 1).End(xlUp).Row
    
    If LRow = 1 Then
        MsgBox "Нет данных на листе"
        Exit Sub
    End If
     
    For i = 1 To LRow
    
    Set x = find_text_sheet.Range("a:p").Find(find_text.Cells(i, 1), , xlValues, xlWhole)
    If Not x Is Nothing Then
        LRow_result = result.Cells(Rows.Count, 1).End(xlUp).Row + 1
        result.Rows(LRow_result).EntireRow.Value = find_text_sheet.Rows(x.Row).EntireRow.Value
    End If
 
    Next i

End Sub

В данном макросе искомое значение находится в ячейке "Cells(i.1), то есть, в ячейках столбца "А", т.е., сначала ищется содержимое ячейки"А1", потом "А2" и т.д. согласно циклу.
Подскажите, пожалуйста, можно ли доработать данный макрос так, чтобы поиск происходил по ячейкам "А1, В1, С1", в том случае, если в ячейках "В1" и "С1" есть содержимое, а если в них содержимого нет, то поиск происходил бы как сейчас только по ячейке "А1" и т..д. и поиск считался бы успешным, если содержимое ячеек "А1", "В1" и "С1" найдены в одной строке вместе?

Спасибо.
Изменено: footballplayer - 28.03.2018 21:04:49
Процессор для оптимально работы VBA
 
Казанский, Anchoret, спасибо за ответ!

Буду смотреть в сторону I5 с высокой частотой ядер.
Процессор для оптимально работы VBA
 
Добрый вечер, уважаемые участники форума.
Извиняюсь за вторую подряд тему на форуме.
Прошу помощи в моем вопросе.
Прочитал несколько тем, в которых обсуждается выбор процессора и объема ОЗУ для оптимальной скорости работы макросов VBA.
Исходя из прочитанного стало понятно, что VBA работает однопоточно, т.е. с одним ядром процессора и не умеет работать со всеми ядрами процессора, если их больше одного. Исходя их этого получается, что лучше работать на 2-х ядерном процессоре с большей частотой, чем на 4-х ядерном с меньшей частотой каждого изз ядер.
Подскажите, пожалуйста, правильно ли я сделал выводы из прочитанного? Лучше ли для VBA, к примеру, 2-х ядерный процессор с 3 МГц, чем 4-х ядерный процессор с 2 МГц?
Объем памяти процесса IE в процессе работы макроса
 
Игорь, спасибо за ответ!

Понятно)  Тогда действительно придется смириться с таким поведением браузера )

Спасибо!
Объем памяти процесса IE в процессе работы макроса
 
Добрый вечер, уважаемые участники форума.

Помогите, пожалуйста, разобраться в вопросе.
Есть несколько макросов, которые зациклены и работают в том числе с браузером IE. В процессе работы замечаю, что в диспетчере задач с каждым выполненным циклом макроса увеличивается и объем памяти, которую занимает браузер IE. При достижении определенного объема памяти занимаемой процессом, работа макроса становится нестабильной.
Более чем уверен, что сам макрос написан далеко не в лучшем виде. Но возникает такой вопрос: если почему растет объем памяти, занимаемого процессом IE, если все переменные, все формулы и т.д. работает в рамках Экселя и не должен ли расти объем памяти процесса Экселя, а не процесса браузера?
Самого кода под рукой нет, но вопрос даже не в правильности кода, а в том  - почему с каждым циклом макроса растет занимаемая IE памяти?
Спасибо!
Макрос: работа с окнами браузера IE
 
Доброго дня, уважаемые участники форума!
Прошу помочь разобраться с проблемой в макросе.

Суть проблемы такова. Есть небольшой макрос, который заполняет поля на сайте. Макрос работает с уже открытым окном браузера IE (при запуске макроса IE уже открыт на нужном сайте). Доступ к открытому окну браузера получаю так:
Код
Public Const sAppName As String = "Internet Explorer"


sub ie_macro()

new_ie:

Dim oShellWindows As New SHDocVw.ShellWindows
Dim ie_browser As SHDocVw.WebBrowser
Dim sFlag As Boolean
sFlag = False
If oShellWindows.Count = 0 Then
MsgBox "Браузер не открыт!", vbCritical
Exit Sub
End If
For Each ie_browser In oShellWindows
If ie_browser.Application = sAppName Then
    bFlag = True
    ie_browser.Visible = False
    ie_browser.Visible = True

If bFlag = False Then
MsgBox "Браузер не открыт!", vbCritical
Exit Sub
End If

Exit For
End If
Next ie_browser


ie_browser.document.getElementById("text_1").Value = "Какой-то текст 1"
ie_browser.document.getElementById("text_2").Value = "Какой-то текст 2"

end sub
В процессе работы макроса появляется необходимость в открытии нового окна браузера IE (именно окна, не вкладки), перехода по URL и закрытии старого окна IE, после чего работа макроса должна продолжиться уже в новом открытом окне IE, а старое - закрывается.


Написал такой код.:
Код
new_ie:

 If new_ie_id = 1 Then
 
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "Необходимый URL сайта"
        Application.Wait (Now + TimeValue("0:00:03"))
ie_browser.Quit
Set ie_browser = Nothing
new_ie_id = 0
        Application.Wait (Now + TimeValue("0:00:03"))
        
        
GoTo new_ie:
 
 
End If
По моему пониманию, данный код должен открыть новое окно браузера, перейти на заданный URL, далее закрыть старое окно браузера и перейти на маркер new_ie, где макрос заново найдет открытое окно браузера IE и продолжит работу так, будто бы макрос только что запущен.

По факту же, из всего указанного работает только открытие нового окна браузера, переход по ссылке и с переменным успехом закрывается старое окно (иногда может не закрыться). После чего все повисает, макрос не продолжает работу с новым окном браузера и подвисает на первой же строке кода, где используется ie_browser.getElementByID("...").value = "....".
Если остановить макрос и навести мышкой на ie_browser, то видно, что скрипт на определил новое окно и подсвечивается ошибка "variable or with block variable not set".

Понимаю, что мой код далек от совершенства.
Помогите, пожалуйста, понять что мешает работе с новым окном, как описано выше.

Спасибо!



UPD: пришла такая мысль... Если открыть новое окно браузера, перейти по URL, закрыть старое окно и сделать:
Код
call ie_macro
то есть, из макроса запустить его же - это будет работать?
Просто сейчас протестировать этот момент не могу.






UPD 2:
Насколько удалось понять данный код просто не замечает новое открытое окно браузера IE и не передает переменной ie_browser управление браузером.. Однако данный код отлично работает, если остановить макрос и запустить его заново руками, но если перейти в начало кода через GoTo, то код не перехватывает окно IE...


Код
Public Const sAppName As String = "Internet Explorer"sub ie_macro()

new_ie:

Dim oShellWindows As New SHDocVw.ShellWindows
Dim ie_browser As SHDocVw.WebBrowser
Dim sFlag As Boolean
sFlag = False
If oShellWindows.Count = 0 Then
MsgBox "Браузер не открыт!", vbCritical
Exit Sub
End If
For Each ie_browser In oShellWindows
If ie_browser.Application = sAppName Then
    bFlag = True
    ie_browser.Visible = False
    ie_browser.Visible = True

If bFlag = False Then
MsgBox "Браузер не открыт!", vbCritical
Exit Sub
End If

Exit For
End If
Next ie_browser


ie_browser.document.getElementById("text_1").Value = "Какой-то текст 1"
ie_browser.document.getElementById("text_2").Value = "Какой-то текст 2"

end sub
Изменено: footballplayer - 26.02.2018 16:03:09
Запуск кода Angular в макросе VBA
 
Добрый день!

На сайте, работающем на ангуляре, есть кнопка, при нажатии которой происходит определенное действие.
При просмотре кода кнопки видно, что на нее повешено событие следующего типа:
Код
data-ng-click = "addText()"

Насколько я понимаю, это означает, что при нажатии кнопки будет выполнена функция "addText()".
Отсюда возник вопрос: можно ли как-нибудь из кода VBA запустить программно функцию "addText()", без нажатия кнопки на сайте?
Пытался сделать так:
Код
Call ie.document.parentWindow.execScript("addText()")
но такая попытка не сработала.
Ошибка -2147352319 при использовании parentWindow.execScript
 
AAF, подскажите, пожалуйста, почему данная пауза не срабатывает в следующем случае:
Код
On Error Resume Next
Do While True
Err.Clear

For Each text_item In oie.document.getElementsByClassName("textbox")
MsgBox text_item.innerText
Next text_item

If Err.Number = 0 Then
    On Error GoTo 0
    Exit Do
End If
DoEvents
Loop

Делаю так: запускаю данный код, когда браузер находится на сайте, где класса "textbox" в HTML коде нет. Соответственно, код запускается и повторяется в цикле, т.к. нужного имени класса в HTML коде нет.
После этого перехожу в браузере на сайт, где имя класса "textbox" и, как я понимаю, при загрузке HTML кода, где есть данное имя класса тега, код должен при очередном прохождении цикла увидеть, что есть нужный класс и вывести его текст через  MsgBox text_item.innerText.
Однако, этого не происходит. Даже после полной загрузке сайта код продолжает выполняться в цикле бесконечно, не замечая, что нужное имя класса уже существует.
Возможно, я что-то делаю не так?
Изменено: footballplayer - 31.12.2017 23:12:30
Ошибка -2147352319 при использовании parentWindow.execScript
 
AAF, спасибо за ответ!
Указанный Вами код помог в решении вопроса. Заполнение полей происходит без ошибок. Спасибо!

Jungl,  чуть доработал указанный Вами код с добавлением Err.Clear, код так же работает отлично, заполнение происходит без ошибок.
Код
On Error Resume Next
Do While True
Err.clear
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]').scope().text = 'какой-либо текст';"
If Err.Number = 0 Then
    On Error GoTo 0
    Exit Do
End If
DoEvents
Loop


Большое спасибо всем за помощь!
Ошибка -2147352319 при использовании parentWindow.execScript
 
Jungl, спасибо за ответ.
К сожалению, показать сам сайт в качестве примера сейчас не смогу, т.к. там специфическая форма входа.
Понимаю, что без примера говорить о чем-то очень сложно)

Код приведенный вами, понял, разобрал. :
Код
On Error Resume Next
Do While True
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]').scope().text = 'какой-либо текст';"
If Err.Number = 0 Then
    On Error GoTo 0
    Exit Do
End If
DoEvents
Loop

Это как раз именно то, что мне нужно. Но возникла проблема.
Для проверки делал так: запускал кусок макроса для заполнения одного отдельного поля в то время, когда сайт открыт в том месте, где этого поля нет. Потом перехожу на страницу, где есть заполняемое поле. Поле корректно заполняется, но выход из цикла не происходит и в цикле повторяется ошибка (как я увидел в debug.print), ошибка даже после заполнения формы не исчезает и цикл бесконечно выполняется.

Попробовал доработать код так, чтобы происходил выход из цикла, когда в заполняемом поле появляется текст с длиной более нескольких символов:
Код
On Error Resume Next
Do While True
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]').scope().text = 'какой-либо текст';"


For Each aa In oie.document.getElementsByTagName("input")
If aa.getAttribute("data-ng-model") = "text" Then
If Len(aa.Value) > 0 Then

Exit Do
End If
End If
Next aa

If Err.Number = 0 Then

On Error GoTo 0
Exit Do

End If
DoEvents
Loop

Скажите, пожалуйста, такой способ выхода из цикла корректен? Фактически это срабатывает, но волнует момент - не снижает ли такая конструкция работу макроса на среднем ПК?
Возможно, можно как-то по-другому выйти из цикла:
Код
On Error Resume NextDo While True
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]').scope().text = 'какой-либо текст';"
If Err.Number = 0 Then
    On Error GoTo 0
    Exit Do
End If
DoEvents
Loop

Если это возможно, то данный вариант был бы идеально подходящим для меня.
Изменено: footballplayer - 01.01.2018 19:05:44
Ошибка -2147352319 при использовании parentWindow.execScript
 
Казанский, спасибо за ответ.

Готовность браузера  данном случае работает не совсем корректно, т.к. изменения на сайте происходят динамически и, как я понимаю, в данном случае через ReadyStatec= 4 готовность HTML кода отследить корректно не получается.
Ошибка -2147352319 при использовании parentWindow.execScript
 
Jungl,  спасибо за ответ.
Если Вам несложно, объясните, пожалуйста для понимания процесса два момента.

1. Правильно ли я понимаю, что данная конструкция означает, что выход из цикла будет выполнен, если в течение этого цикла не было ошибок
Код
On Error GoTo 0
ExitDo

А как себя поведет данный код, если возникнет ошибка с номером, указанная в начале темы? Макрос остановится и выдаст окно ошибки?

2. Правильно ли я понимаю, что процесс заполнения в поля формы, код которого указан ниже, возвращает True?
Код
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]').scope().text = 'какой-либо текст';"
Страницы: 1 2 3 4 След.
Наверх