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

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

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

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

Прошу помочь в решении задачи. Задача состоит в следующем.(файл с примером приложил")
Необходимо каждое значение из столбца "А"  листа "Что ищем" искать в столбце "А" листа "База". Если оно найдено, что необходимо получить параметр "Цена" у найденного оборудования.
Суть процесса примерно понимаю, но сложность состоит в том, что в файле "База" может быть несколько сотен тысяч строк, в которых нужно будет искать по одному искомому значению. Искомых значений может быть от 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 реализовать по-другому?

Спасибо!
Поиск данных на листе
 
Добрый вечер, уважаемые участники форума.
Помогите, пожалуйста, разобраться в вопросе.
Есть задача произвести поиск в большой таблице на одном листе. Искомые значения располагаются на отдельном листе. Если значение найдено, то вся строка, в которой найдено искомое значение, переносится на отдельный лист.
Следующий макрос решает описанную выше задачу:

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

Прошу помочь в решении вопроса.
Написал небольшой макрос, который работает с веб-формой. Чтобы поля становились сразу валидными, заполняю их по таким способом:
Код
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]').scope().text = 'какой-либо текст';"
oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]').scope().$apply();" '
Заполнение полей таким образом работает, в общем, нормально, но периодически возникает ошибка такого вида "Run-time error: -2147352319 (80020101) ".
Таких ошибок (с таким номером) ранее не встречал и на просторах интернета понятного объяснения так же не нашел, хотя, возможно, плохо искал.
Насколько я понял, эта ошибка означает, что код не дождался появления в HTML коде свойств, которые ему необходимо заполнить и ушел в ошибку. Или я не прав?
Пытался сделать цикл с проверкой существования кода  oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]') применого так:
Код
IsObject( oie.document.parentWindow.execScript "angular.element('[data-ng-model=""text""]'))

но VBA такого не понимает и выдает ошибку...

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

Спасибо!
Выявление всплывающего окна на сайте и работа с ним
 
Здравствуйте!
Прошу подсказать по вопросу всплывающих окон сайта.

В работе макроса по заполнению веб-формы, в случае различных ошибок, на сайте появляется всплывающее окно на переднем плане сайта, блокируя для клика мышкой все остальное пространство сайта, кроме всплывшего окна. Насколько я понимаю, всплывающее окно реализовано с применением Javascript, как и сам сайт сделан с применением этого языка.
Мне необходимо при появлении такого окна возвращать макрос в самое начало и запускать его снова.
ID тега всплывающего окна мне известен. Отсюда вопрос: есть какой-нибудь универсальный прием в VBA, который позволяет в процессе работы макроса параллельно отследить появление нового элемента в коде и сделать с ним какие-либо манипуляции?

Опираясь на свои знания в VBA на ум приходят два варианта:

1. Сделать таймер внутри конструкции do...loop и если в определенном месте пауза больше заданного времени сделать GoTo начало макроса.
2. Второй вариант - часто проверять существование (при помощи IsObject) в коде HTML ID, который соответствует тегу всплывающего окна и если он есть,  то применять какие-либо действия.

Наверняка у обоих вариантов есть куча минусов, но это все, что пришло на ум.
Подскажите, пожалуйста, возможно есть процессы, в которых эта задача может быть реализована лучше и с меньшей нагрузкой на скорость работы макроса?
Валидация полей ангулярной формы без SendKeys, ошибка Syntax error, unrecognized expression
 
Здравствуйте!

Скачать честно - не уверен, что данный вопрос относится к VBA или JS.
Практически дописал макрос, но тут возникла ошибка.
В работе макроса использую вставки кода JS для заполнения полей формы в браузере.
Казалось, нашел код, который подходит, но он начал выдавать ошибку: Syntax error, unrecognized expression: [data-ng-model=text]
Сам код выглядит так:
Код
oie.document.parentWindow.execScript "angular.element('[data-ng-model=some.text ]').scope().some.text = '12345';"
oie.document.parentWindow.execScript "angular.element('[data-ng-model=some.text ]').scope().$apply();"

Ошибку вижу в инструменте разработчика, который открывается по нажатию F12 в IE.
Исходя из текста ошибки, получается, что выражение не распознано. Но для меня такая ошибки в настоящее время - это очень сложно, пока только учусь.
Возможно, кто-нибудь сталкивался с такой ошибкой.
Помогите, пожалуйста, понять в чем причина ошибки и как ее исправить.
Спасибо!


UPD:
Попробовав различные варианты кода, чтобы понять откуда берется ошибка, пришел к выводу, что ошибка появляется, если название свойства data-ng-model имеет в себе точку.
К примеру, ошибка не возникает в случае, если:
Код
data-ng-model = sometext
и ошибка возникает, если:
Код
data-ng-model = some.text
Изменено: footballplayer - 10.12.2017 12:43:09
Переменная VBA в коде JS
 
Здравствуйте!

Помогите, пожалуйста, по вопросу запуска скрипта JS в коде VBA.

Есть небольшой макрос, в котором есть такой код:

Код
ie.document.parentWindow.execScript "angular.element(document.getElementsByTagName('input')[1]).scope().text ='123';"
ie.document.parentWindow.execScript "angular.element(document.getElementsByTagName('input')[1]).scope().$apply();"

Насколько я понимаю, в данном коде VBA происходит вызов строки с кодом JS.
Проблема в следующем. В указанном примере скрипт присваивает полю текст "123". В таком виде все работает очень хорошо.
Но мне нужно вместо "123" вставить туда переменную из макроса и когда я пытаюсь так сделать, выдается ошибка:
Код
ie.document.parentWindow.execScript "angular.element(document.getElementsByTagName('input')[1]).scope().text =" & ivar &  " ;" "
ie.document.parentWindow.execScript "angular.element(document.getElementsByTagName('input')[1]).scope().$apply();"
Подскажите, пожалуйста, что нужно сделать, чтобы переменная ivar в примере подставила свое значение и не выпадало ошибки? И возможно ли это технически?

Перепробовал разные варианты, но не хочет работать.

Спасибо!
Перебор тегов сайта и добавление значений тегов в ячейки
 
Добрый вечер, уважаемые участники форума!

Подскажите, пожалуйста, что я делаю не так в коде ниже.
Задача: нужно перебрать теги сайта с определенным классом и содержимое этих тегов перенести в ячейки в книге эксель, т.е. содержимое первого тега в ячейку "А1", содержимое второго тега в ячейку "А2" и т.д.
Делаю так:

Код
Sub site_txt()


Dim sApplicationName As String
 sApplicationName = "Internet Explorer"

Dim oShellWindows As New SHDocVw.ShellWindows
Dim oie As SHDocVw.WebBrowser
Dim brows_check As String
Dim sFlag As Boolean
sFlag = False

For Each oie In oShellWindows
If oie.Application = sApplicationName Then
    bFlag = True
  


Set tag_div = oie.document.getElementsByTagName("div")

i = 0 'определяем начальное значение счетчика

For Each div_txt In tag_div

If div_txt.getAttribute("class") = "text" Then
i = i + 1 'увеличиваем счетчик на 1
Sheets(1).Range("A" & i).Value = div_txt.innerText
End If

Next div_txt

Exit For
End If
Next oie

End Sub

все работает хорошо, кроме того, что не происходит вставка текста из тега  ячейки А1,А2,А3 поочередно, а все вставляется по очереди в ячейку "А1" и, соответственно, в ячейке "А1" в итоге работы макроса остается содержимое последнего тега из перебираемых.

Почему не происходит роста счетчика i?
Если я правильно понимаю, при каждом цикле for each счетчик же должен увеличиваться на 1?
Поиск слова и перенос строки на другой лист
 
Добрый вечер!

Пытался разобраться с вопросом сам при помощи небольших знаний VBA и поисковика, но не получилось(
Так же, задал вопрос на соседнем форуме, ответ получил, это помогло,  но после корректировки макроса, выяснилось, что в нем есть еще один момент, который работает не так, как нужно в данной ситуации.
Искал решение такого вопроса: есть три листа. С первого листа берется значение из ячейки, ищется в столбце на втором листе и, если есть совпадение, вся строка из второго листа переносится в третий лист.
Нашел в инете код, примерно работающий под мои запросы, чуток его подкорректировал, добавил код, который подсказали на форуме. В итоге макрос работает, но работает не совсем так, как надо. То есть, если в столбец поиска вставить данные для поиска "адидас" и "хома", то в результате работы макроса на лист "result" переносятся не те строки, в которых найдено значение.
Примерно понимаю, что нужно получить номер строки, в которой находится найденное значение и его перенести, но ума не приложу как это сделать в макросе.

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

UPD: попробовал сделать так:
Код
Set found_value = .Columns(1).Find(poisk.Cells(i, 1), LookIn:=xlValues, lookat:=xlWhole).Row

но добавление .Row дает ошибку в работе макроса.
Изменено: footballplayer - 25.10.2017 00:19:57
Добавление данных из Excel в таблицу Access макросом
 
Добрый вечер!

Возникла необходимость создания простой базы данных в Access, для передачи в нее данных из Excel.
Суть задачи заключается в следующем: макрос в VBA будет обрабатывать множество текстовых значений, которые повторяются (к примеру, стул, стол, тумба и т.д..)
Макрос будет в процессе обработки строк считать количество каждого из найденных наименований и и полученное количество каждого из наименований заносить в базу. А при следующей работе макроса по обработке текстовых значений, необходимо приплюсовать новое количество найденных наименований к уже имеющемуся раньше.
Поискав на форуме способы передачи их Excel в Access, нашел макрос, который заносит данные в таблицу в базу данных в соответствующие поля.
Но, если несколько раз исполнить данный макрос, он добавить данные не в одно и то же поле таблицы в Access, а создаст каждый раз новое поле.
Подскажите, пожалуйста, как можно изменить указанный ниже макрос так, чтобы он каждый раз приплюсовывал новое значение в одно и то же поле, суммируя каждый раз значения.

Спасибо!
Код
Sub ADD_MDB()   
Dim cn As ADODB.Connection   
Dim cmd As ADODB.Command   
Dim DBFullName As String   
DBFullName = ThisWorkbook.Path & "\" & "base.mdb"   
Set cn = New ADODB.Connection   
cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;Data Source=" & DBFullName & ""   
cn.Open   
  
Set cmd = New ADODB.Command   
  With cmd   
     .ActiveConnection = cn   
     .CommandText = "INSERT INTO TBL ( TBLname , TBLcount , TBLvalue ) VALUES (11111, '2222222', '33333333');"   
'TBL- Ваша таблица в скобках перечисляются Ваши поля в которые добавляются данные, во втрорых скобках (добавляемые значения)   
  End With   
cmd.Execute   
  cn.Close   
  Set cn = Nothing   
End Sub
Поиск ближайшей похожей строки без макроса
 
Доброго вечера, уважаемые знатоки экселя!

Прошу помочь в следующем вопросе.
Файл с примером приложил.
К примеру, у меня в ячейке "А2" есть строка: "Футбольный клуб Барселона".
Мне необходимо, чтобы при вставке в соседнюю ячейку похожего текста, похожий автоматически менялся на шаблонный. То есть, если я впишу с ошибкой "Футбольный клаб Барсилона", чтобы это предложение заменялось на "Футбольный клуб Барселона".

В процессе поиска решения данной задачи нашел несколько пользовательских функций, которые помогают сделать примерно то, что нужно. Но обнаружил один минус - очень сильно нагружается ОЗУ, хотя строк массива, в котором необходимо искать похожую искомой строку, не более 300.
Насколько я понял в ходе поиска, данную задачу можно решить при помощи ВПР, то есть, без макроса, что, как я понимаю, должно работать быстрее и с меньше загрузкой ОЗУ.

Подскажите, пожалуйста, можно ли решить данную задачу без макроса? Буду благодарен и за помощь с кодом, и за помощь со ссылкой на ресурс, где можно увидеть похожее решение.
Заранее спасибо!
Проверка на успешное исполнение .click на кнопке сайта в IE
 
Добрый день!
Помогите, пожалуйста, разобраться.
Есть макрос, который работает с сайтом, производит различные действия и нажимает кнопки.
Нажатие одной и той же кнопки на сайте периодически не срабатывает. Нажимается кнопка примерно так:
Код
dim collection_button
dim click_btn
Set collection_button = ie.document.getElementsByTagName("input")

for each click_btn in collection_button 
   if click_btn.getAttribute("class") = "button_class" Then
   click_btn.focus
   click_btn.click
   end if
exit for
Next click_btn






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

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

Есть написанный макрос, состоящий из нескольких макросов. Итоговый макрос составлен примерно так:

Код
Sub top_macro()

call macro_1
call macro_2
call macro_3
call macro_4


end sub

Сам макрос top_macro работает нормально, все макросы командой call вызываются, срабатывают.
Но возникла проблема в прерывании макроса при нахождении ошибки.

Мне необходимо прервать весь макрос top_macro, если в макросе macro_1 возникнет определенное условие. Это условие отлавливаю, вижу существование условия через debug.print, добавляю код EXIT SUB, но он срабатывает 1 раз из 3-4 запусков. То есть, остановки работы главного макроса не происходит и далее начинают выполняться macro_2, macro_3 и т.д.

Подскажите, пожалуйста, возможно, кодом EXIT SUB я прерываю работу только макроса, в котором этот код прописан ( то есть, macro_1) ?
Как сделать так, чтобы прерывался весь макрос top_macro?

Спасибо!
Вставка текста в веб форму
 
Здравствуйте!
Помогите, пожалуйста, в решении вопроса.
В процессе написания макроса, встретился с необходимостью вставки текста в веб форму. При чем необходимо именно вставить текст ( как будто он вставлен мышкой или с клавиатуры). Как я понимаю, это можно сделать при помощи метода .Copy и .Paste. У веб формы есть защита, которая не распознает вставленный при помощи такого кода текст:
Код
IE.document.getElementsByID("text").value = "12345"
и после исполнения такого кода, веб форма отображает статус, как незаполненной, хотя визуально в ней есть текст.
Вопрос, конечно, решается при помощи SendKeys, но очень не хотелось бы использовать этот метод в связи с его периодическими глюками.

Подскажите, пожалуйста, могу ли я каким-либо образом вставить в веб форму текст используя метод .Paste? Т.к., как я понимаю, он работает так, как будто текст был вставлен при помощи мыши или клавиатуры? С использованием .Copy .Paste в работе в Экселе проблем не возникает, а вот с веб формой такой трюк не проходит)

Спасибо!
Управление окном печати браузера IE
 
Здравствуйте!

Подскажите, пожалуйста, по вопросу управления браузером IE.
В IE, при нажатии на комбинации клавиш Ctrl+P открывается окно печати IE. Открыть его, соответственно, можно и через "Файл - Печать".
Вопрос в следующем: можно ли как-нибудь при помощи VBA управлять окном печати IE? Интересует не само его открытие, а именно управление уже открытым окном печати. Возможно, у данного окна есть какие-то свойства, за которые можно зацепиться и управлять им?
Проверка getElementsByTagName на существование на веб-странице
 
Добрый день!

Хочу написать условие, которое будет циклично проверять существование определенного тега на веб-странице при помощи getElementsByTagName и после того, как тег появится и будет найден, будет продолжать работу макроса.
Но у меня возникла сложность - не понимаю, как можно проверить существование тега. Читал про свойство getElementsByTagName, но так и не понял что оно возвращает в итоге. Точнее, оно возвращает коллекцию указанных тегов, но как можно проверить на существование определенного тега на странице?
Изменено: footballplayer - 23.08.2017 23:27:58
Вывод информации об ошибоках макроса, если они произошли
 
Доброй ночи!

Прошу помощи в следующем вопросе.
Есть макрос, который выполняет определенны действия. Мне необходимо во время работы макроса производить различные проверки при помощи if...else или case select, но выводить сообщение об ошибках  необходимо общее, в конце макроса, при помощи msgbox.
К примеру, в процессе работы макроса происходят проверки и ошибки, в случае их наличия, заносятся в переменные a,d,c,d,e и т.д.
В конце макроса вывожу ошибки примерно так
Код
msgbox a & b & c & d & e 
и т.д.

Подскажите, пожалуйста, как сделать так, чтобы msgbox выводил содержимое переменной только если в нее занесена информация об ошибке?
Выявление нового открытого окна браузера IE
 
Добрый день!

Прошу помочь в вопросе взаимодействия браузера с макросом.
Исполнение макроса происходит при уже открытом браузере, то есть, макрос запускается из книги Эксель, а браузер уже открыт заранее на нужном сайте. Открыто строго только одно окно браузера.
В ходе исполнения макроса происходит заполнение веб форм, нажатие кнопок типа submit и др. На последнем этапе макроса нажимается кнопка на сайте, которая приводит к открытию нового отдельного окна браузера (не вкладки, а именно окна). Новое окно открывается с задержкой в 2-5 секунд
Вопрос: можно ли каким-либо образом перехватить момент, когда в конце исполнения макроса открывается еще одно окно браузера, чтобы уже на него отправить команду?

На ум пришел вариант с паузой в исполнении макроса и уже после паузы проверить на количество открытых окон браузера, но проблема в том, что новое окно браузера может открыться с различной задержкой  - может 2 секунды, а может и 5, возможно, даже и больше. В связи с этим, пауза периодически может давать сбой или нужно будет ставить слишком большой интервал паузы.

Перед исполнением макроса, открытый браузер перехватываю при помощи следующего кода:
Код
Const sApplicationName As String = "Internet Explorer"
    Dim oShellWindows As New SHDocVw.ShellWindows
    Dim oIE As SHDocVw.WebBrowser
    Dim bFlag As Boolean
    If oShellWindows.Count = 0 Then
        MsgBox "IE не открыт!", vbCritical
        Exit Sub
    End If
    For Each oIE In oShellWindows
        If oIE.Application = sApplicationName Then
            bFlag = True
            oIE.document.Focus
            Exit For
        End If
    Next oIE
    If bFlag = False Then
        MsgBox "IE не открыт!", vbCritical
        Exit Sub
    End If


Спасибо!
Изменено: footballplayer - 13.08.2017 14:39:36
Активация окна IE сразу после запуска макроса
 
Добрый день!

Подскажите, пожалуйста, как можно сделать так, чтобы после запуска макроса из Excel, сразу же разворачивалось окно браузера IE?
Браузер - IE 11.


Команда
Код
 ie.visible = true
или
Код
 ie.activate
 - не работают.

Работаю с уже открытым браузером IE. Перехватываю его в списке открытых по следующему коду:
Код
    Const sApplicationName As String = "Internet Explorer"
 
    'ShellWindows - 
  Internet Explorer.
    
    Dim oShellWindows As New SHDocVw.ShellWindows
    
    Dim oIE As SHDocVw.WebBrowser
    Dim bFlag As Boolean
    
    
    If oShellWindows.Count = 0 Then
        MsgBox "IE не открыт!", vbCritical
        Exit Sub
    End If
    
    '
    For Each oIE In oShellWindows
        If oIE.Application = sApplicationName Then
            
            bFlag = True
            oIE.Visible = True
            
          
            Exit For
        End If
    Next oIE
    
   
    If bFlag = False Then
        MsgBox "IE не открыт", vbCritical
        Exit Sub
    End If
Изменено: footballplayer - 12.08.2017 15:23:48
Эмуляция нажатия клавиши клавиатуры в веб-форме
 
Доброй ночи!

Возможно, в названии темы описал вопрос не очень точно.
Ситуация следующая: есть сайт с множеством веб-форм. Данные веб-формы управляются скриптами javascript.
Написал макрос для заполнения веб-форм текстом их книги Эксель. Все работает, данные в формы вставляются. Но далее возникает проблема: веб-формы не проходят проверку на заполнение и показываются так, как будто в них ничего не записано, хотя, по факту, данные в формы вставлены и их видно.
Видимо, это особенность скрипта js.
Экспериментируя выяснил, что после отработки макроса и вставки данных в форму, данные в форме проходят проверку на корректность есть, к примеру, добавить пробел в тексту в форме. И второй способ - вставка любого текста (даже пробела) в дополнению к существующему тексту в форме. То есть, должно произойти действие именно от клавиатуры или мышки, вставку текста макросом в формы - веб-формы сайта видеть  не хотят.

Пытался добавить в веб-форму к тексту лишний пробел и потом убрать его при помощи команды SendKeys "{BACKSPACE}", но этот вариант не работает. Возможно, потому что использую команды getElementsByTagName и getElementsByClassName. Возможно, SendKeys с этими командами не работает.

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

Спасибо!
Выбор дочернего HTML-элемента
 
Добрый вечер!

Помогите, пожалуйста, понять суть следующего вопроса)
Ответ искал в различных поисковых запросах, но найти понятный для уровня моих знаний в VBA ответа не удалось. Прошу заранее не ругать)

В качестве примера привожу код ниже:
Код
<ul class="menu">
<li class="12345">ааа</li>
<li class="12345">ббб</li>
<li class="12345">ввв</li>
</ul>


Как получить доступ к любому из className в примере я понимаю, через getElementsByClassName. Но не получается понять то, как я могу получить доступ к дочернему элементу тега <ul> -  к тегу <li> через className. То есть, как получить className "12345", указывая, что он должен принадлежать именно к classname "menu"?

Другими словами, можно ли в VBA сделать примерно так:

Код
ie.Document.getElementsByClassName("menu")(0).getElementsByClassName("12345")(0).Click

Спасибо!

Вставка текста в браузер
 
Добрый день!

Прошу сильно не ругать за, возможно, простой вопрос :-)

Пишу небольшой скрипт на вставку данных из книги Эксель в формы в браузер. Опыт в этом есть, если производить вставку данных в браузер через свойство getElementsByID. Но в данном конкретном случае на сайте теги не имеют ID, у них есть только классы и, собственно, названия тегов.
Тут пришла мысль воспользоваться свойством getElementsByClassName и уже получив нужный класс веб-формы, добавлять в нее текст из книги Эксель.
Но тут возникли трудности - макрос никак не реагирует на свойство getElementsByClassName. Не выдает ни ошибки, ни какого-либо действия.
Подключил библиотеку Microsoft HTML Object Library, но не помогает, ничего не происходит.
Так же, знаю, что можно получить нужную веб-форму через свойство getElementByTagName  и номер тега в дереве, но нигде не нашел описания того, как вычислить номер нужного тега в дереве.

Помогите, пожалуйста, понять суть решения вопроса. Понемногу учусь VBA, знаю некоторые вещи, но в данном вопросе самому, видимо, не разобраться.
Спасибо!
Подсчет макросом (аналог "СЧЕТЕСЛИ") количества ячеек содержащих определенное значение
 
Здравствуйте!

Подскажите, пожалуйста, есть ли в VBA аналог функции "СЧЕТЕСЛИ"?
Есть следующая необходимость. В Эксель, через диалоговое окно "InputBox", вводится определенное число. Далее необходимо перебрать диапазон ячеек и проверить сколько в данном диапазоне ячеек, содержащих число большее, чем введенное через "InputBox".
Как провести описанный подсчет при помощи "СЧЕТЕСЛИ" понимаю, все получается. Но проблема в том, что необходимо содержимое книги Эксель сравнить с числом, ввиденным в "InputBox" и вывести количество ячеек, содержащих число с большим значением, чем введенное. Этого, как я понимаю, "СЧЕТЕСЛИ" не умеет и необходимо обращаться к макросу.

Подскажите, пожалуйста, каким инструментом можно произвести указанное сравнение и вывод количества ячеек с нужным значением?

Спасибо!
Ошибка в макросе при закрытии книги
 
Добрый день!

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

В файле с примером есть кнопка, при нажатии на которую выбирается файл и из него в активную книгу копируется определенный диапазон. После этого книга, из которой копировались данные, закрывается. Простая по сути конструкция, копирование проходит корректно, но в момент закрытия книги методом .Close происходит ошибка с кодом Subscript out of range.
Подскажите, пожалуйста, возможно в макросе ошибка?
Макрос для подсчета количества непустых и ненулевых ячеек в диапазоне
 
Добрый день!

В поиске поиске ответа на вопрос не нашел. Подскажите, пожалуйста, в какую сторону смотреть.

Есть написанный макрос. После его выполнения необходимо подсчитать количество ненулевых и непустых ячеек в столбце.
Поискав информацию по данному вопросу, нашел инструмент CountA, который возвращается количество непустых ячеек в диапазоне. Можно ли как-либо доработать данную функцию, чтобы была возможность вывода количества непустых и ненулевых ячеек в диапазоне? Интересует именно выполнение макросом.
Буду благодарен за направление в сторону необходимого инструмента. В VBA небольшие знания есть, попробую разобраться)

Спасибо!
Страницы: 1 2 След.
Наверх