Я перебираю список csv-файлов с веб-сайта, с которого я хочу открыть и извлечь данные. Причина, по которой я использую VBA, заключается в том, что конкретные файлы, которые мне нужно открывать, меняются день ото дня, и эти ссылки на конкретные файлы доступны только в режиме Excel. Вторая причина в том, что я уже сделал подобное приложение для очистки в vba, поэтому у меня уже была половина кода.
Конечный пользователь приложения не нуждается в чистом или быстром коде, просто он работает, потому что проверка этих файлов вручную теперь составляет ежедневную рутинную работу по 2 часа в день.
Пока что я уже зашел на сайт, где хранятся файлы secondairy (у этого сайта нет API, поэтому я его очищаю), и я открываю эти файлы, позволяя коду нажимать кнопки. Затем код нажимает кнопку экспорта, которая открывает диалоговое окно для
open, save (dropdown), cancel
Я просто хочу открыть и извлечь данные, а затем закрыть, поэтому я использую код из VBA Internet Explorer Automation - Как выбрать «Открыть» при загрузке файла . Такое ощущение, что мой код содержит ошибки в этой части ...
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
Dim ie As InternetExplorer
Dim h As LongPtr
Function Download()
Dim o As IUIAutomation
Dim e As IUIAutomationElement
Set o = New CUIAutomation
h = ie.Hwnd
h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
If h = 0 Then Exit Function
Set e = o.ElementFromHandle(ByVal h)
Dim iCnd As IUIAutomationCondition
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "Open")
Dim Button As IUIAutomationElement
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke
End Function
перед тем, как вызвать эту функцию, я проверяю количество рабочих книг и заставляю Excel ждать до 20 секунд, пока не откроется другая рабочая книга. Я делаю это с помощью этого кода
xnum1 = Application.Workbooks.Count
Download
t = Now
tStop = t + TimeValue("00:00:20") 'Adjust the TimeValue as needed "hh:mm:ss"
Do Until t = tStop Or Application.Workbooks.Count > xnuml
DoEvents
t = Now
Loop
Однако, похоже, что даже с таким временем ожидания Excel не хочет открывать файл во время каждого цикла. Если я запускаю его шаг за шагом, он открывает файл, а когда я запускаю его самостоятельно, он не запускается.
После загрузки файла я экспортирую данные в основной файл и затем закрываю его, используя Application.DisplayAlerts , чтобы убедиться, что никакое диалоговое окно не препятствует закрытию файла. Но из-за ошибок в коде при загрузке у меня были случаи, когда файл открывался слишком поздно, а затем не закрывался, и поскольку у них у всех одинаковое имя файла, я сделал дополнительный safegaurd в основном коде:
xnum1 = Application.Workbooks.Count
For y = 1 To xnum1
If Left(Application.Workbooks(y).Name, 10) = "export.csv" Then
Application.Workbooks(y).Close
End If
Next
Я не могу понять, почему Excel не открывает файлы должным образом, а затем закрывает их правильно ... Кажется, что код просто запускается, переходит в режим ошибок, потому что файл не открылся во втором запуске , хотя сам код не дает никакой ошибки, даже когда я перехожу через него.
Мой инстинкт говорит мне, что в этой функции загрузки лежит проблема, но я не могу указать, как ее исправить ...
Я также пытался использовать sendkeys% {O}, ярлык для открытия, но файл также не открывался. Когда я вручную нажимаю alt + O, он открывает файл ...
Есть предложения?