Можно ли загрузить файл CSV с помощью макроса Excel, чтобы нажать кнопку загрузки? - PullRequest
1 голос
/ 25 января 2020

Я хочу написать макрос в Excel, который будет загружать CSV из веб-приложения, которое я использую для своей работы. В пользовательском интерфейсе веб-приложения вы нажимаете кнопку, чтобы открыть меню, а затем нажимаете кнопку загрузки во всплывающем меню.

Я написал макрос, который должен открыть Inte rnet Окно проводника, затем нажмите кнопку загрузки, чтобы загрузить файл CSV, который я хочу загрузить. Я пока не смог заставить его работать: он открывает браузер на нужной мне веб-странице, но не загружает CSV.

Я получил ниже HTML с помощью "Inspect Element «(Я вырезал части, которые не были актуальны). Обратите внимание на кнопку загрузки в конце.

    <body style="overflow: hidden; padding-right: 8px;">
            <div role="presentation" class="MuiPopover-root" ... left: 0px;">
                    <div class="MuiPaper-root MuiMenu-paper MuiPaper-elevation8 MuiPopover-paper
                            MuiPaper-rounded"… transform-origin: 0px 26px;">
                    <ul class="MuiList-root MuiMenu-list MuiList-padding" role="menu" tabindex="-1">
                    ...
                    <a download="FileName.csv" class="downloadLinkButton" target="_self" href="blob:https://exampleURL.com/abcdefg1234">
                            <li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button"
                             tabindex="-1" role="menuitem" aria-disabled="false">Export to CSV</li>
                    </a>

Это код, который я написал, но он не работает:

    Dim objIE As InternetExplorer 'special object variable representing the IE browser
    Dim aEle As HTMLLinkElement 'special object variable for an <a> (link) element

    'initiating a new instance of Internet Explorer and asigning it to objIE
    Set objIE = New InternetExplorerMedium

    'make IE browser visible (False would allow IE to run in the background)
    objIE.Visible = True

    'navigate IE to this web page
    objIE.navigate "exampleURL.com"


    Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop

    Set elements = objIE.Document.getElementsByTagName("a")

    For Each ele In elements
        If (ele.className = "downloadLinkButton") Then
            ele.Click
            Exit For
        End If
    Next ele

Как я уже говорил, этот макрос не Нет ошибки, он просто открывает браузер на нужную мне веб-страницу.

У кого-нибудь есть советы, как мне автоматизировать эту загрузку? Я не очень знаком с тем, как работают URL-адреса BLOB-объектов, но я думаю, что URL-адрес загрузки изменяется. (URL-адреса, которые у меня есть в коде / HTML, явно не являются реальными URL-адресами.)

Спасибо!

Редактировать: Ниже HTML для кнопки, которую нужно нажать развернуть меню, содержащее опцию «Экспорт в CSV». Важная часть начинается в <button class="MuiButtonBase-root MuiIconButton-root"

<div class="MuiGrid-root MuiGrid-item MuiGrid-grid-xs-8">
        <div class="MuiGrid-root MuiGrid-container MuiGrid-direction-xs-column MuiGrid-align-items-xs-flex-end">
                <div class="icon-container">
                        <span class="lastupdated-container…</span>
                         …
                        <button class="MuiButtonBase-root MuiIconButton-root" tabindex="0" type="button" id="card-view-more" aria-label="More">
                                <span class="MuiIconButton-label">
                                        <span class="material-icons MuiIcon-root" aria-hidden="true">more_vert</span>
                                </span>
                        </button>
                </div>
        </div>
</div>

1 Ответ

1 голос
/ 25 января 2020

Прежде всего: Используйте всегда строка Опция Явная в качестве первой строки в каждом кодовом модуле !

Секунда: Вам не нужен l oop, чтобы найти ссылку для скачивания. Вы можете использовать Set elements = obj IE .Document.getElementsByClassName ("downloadLinkButton") (0) , чтобы получить ссылку напрямую, если это единственная ссылка с этим классом CSS в документе.

Третье: Возможно, странице требуется больше времени для полной загрузки, поскольку есть информация, которая также должна загружаться. Тогда тебе нужен небольшой перерыв. Вы можете сделать это с помощью Application.Wait

Четвертый: Если показанная строка вызывает ошибку, я думаю, что вы не работаете с всплывающим окном html код ссылки.

Попробуйте:

Option Explicit

Sub DownloadCSV()

Dim objIE As InternetExplorer 'special object variable representing the IE browser
'Dim aEle As HTMLLinkElement 'special object variable for an <a> (link) element
Dim elements As Object

  'initiating a new instance of Internet Explorer and asigning it to objIE
  Set objIE = New InternetExplorerMedium

  'make IE browser visible (False would allow IE to run in the background)
  objIE.Visible = True

  'navigate IE to this web page
  objIE.navigate "exampleURL.com"

  Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop
  'Break for 5 seconds to looad more data if needed
  Application.Wait (Now + TimeSerial(0, 0, 5))

  Set elements = objIE.Document.getElementsByClassName("downloadLinkButton")(0)

  'Check whether the variable elements contains a HTML element
  'with the CSS class "downloadLinkButton"
  If Not elements Is Nothing Then
    'Wanted element found
    elements.Click
  Else
    'Wanted element not found
    MsgBox "There is no Element with the CSS class 'downloadLinkButton' in the used HTML document"
  End If
End Sub

Я не знаю, что это за всплывающее окно на вашем сайте. Но здесь вы можете посмотреть, как такие проблемы можно решить с помощью страниц, генерирующих код, HTML событий и (я думаю, вам это понадобится) SendKeys (): Как использовать Excel vba для нажатия на интерактивный диалог всплывающее окно?

Если вы получили загруженную ссылку, вы также можете использовать функцию API URLDownloadToFile () вместо click и SendKeys (). SendKeys () в большинстве случаев является действительно плохим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...