Olá, estou desenvolvendo um pequeno aplicativo com o access no qual estou importando dados de uma planilha no excel. Essa planilha está buscando dados de um tabela na internet, em uma página protegida por senha, então utilizando um código no excel eu resgato esses dados da internet e preencho a planilha. Em seguida através do access eu abro o excel, executo o macro, atualizo os dados, fecho o excel e então executo a importação desses dados para um tabela no access.
O código é funcional e satisfatório para a minha necessidade.
Eu gostaria de ajuda para solucionar o seguinte problema.
Quando eu abro o excel via access e executo o código, o meu access fica congelado e não consigo rodar nada nele. Eu adoraria que nesse período em que o excel está aberto e navegando na internet para resgatar meus dados um formulário de carregamento com uma barra de progresso aparecesse. (já fiz um bem simples com uma barra de progresso no timer mesmo, o que já seria o suficiente) Porém quando esse código começa e o formulário de carregamento é aberto ele não atualizada a barra de progresso, e antes de qualquer coisa o código já acabou de ser executado e o formulário de loading não teve sua utilidade.
Como eu faço para que o access não fique congelado ou o formulário de progresso funcione normalmente nesse período?
Vale ressaltar que sou bem inexperiente, e esse aplicativo tem a finalidade de aprendizado e de uso nos negócios da família.
Por isso peço desculpas se o código estiver mal estruturado ou confuso.
Obrigado.
Código no Access: (Ao abrir o meu formulário inicial esse módulo é executado)
Código no Excel, primeiro para verificar se há conexão com a internet:
Código no Excel, se houver conexão com a internet então abrirá a internet e efetuará o login:
Código no Excel, antes de sair do sub anterior. Imprimir os dados para a planilha:
O código é funcional e satisfatório para a minha necessidade.
Eu gostaria de ajuda para solucionar o seguinte problema.
Quando eu abro o excel via access e executo o código, o meu access fica congelado e não consigo rodar nada nele. Eu adoraria que nesse período em que o excel está aberto e navegando na internet para resgatar meus dados um formulário de carregamento com uma barra de progresso aparecesse. (já fiz um bem simples com uma barra de progresso no timer mesmo, o que já seria o suficiente) Porém quando esse código começa e o formulário de carregamento é aberto ele não atualizada a barra de progresso, e antes de qualquer coisa o código já acabou de ser executado e o formulário de loading não teve sua utilidade.
Como eu faço para que o access não fique congelado ou o formulário de progresso funcione normalmente nesse período?
Vale ressaltar que sou bem inexperiente, e esse aplicativo tem a finalidade de aprendizado e de uso nos negócios da família.
Por isso peço desculpas se o código estiver mal estruturado ou confuso.
Obrigado.
Código no Access: (Ao abrir o meu formulário inicial esse módulo é executado)
- Código:
Sub RunExcelMacro()
Dim xl As Object
'Step 1: Start Excel, then open the target workbook.
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open ("C:\...\Planilha.xlsm")
'Step 2: Make Excel visible
xl.Visible = False
'Step 3: Run the target macro
xl.Run "isInternetAvailable"
'Step 4: Close and save the workbook, then close Excel
xl.ActiveWorkbook.Close (True)
xl.Quit
'Step 5: Memory Clean up.
Set xl = Nothing
DoCmd.RunSavedImportExport ("DadosExcel")
End Sub
Código no Excel, primeiro para verificar se há conexão com a internet:
- Código:
'Standard Module code, like: Module1!
Public Declare Function InternetGetConnectedState _
Lib "wininet.dll" (lpdwFlags As Long, _
ByVal dwReserved As Long) As Boolean
Function IEAvailable() As Boolean
'Standard Module code, like: Module1!
Dim IEStat As Long
IEAvailable = (InternetGetConnectedState(IEStat, 0&) <> 0)
End Function
Sub isInternetAvailable()
'Standard Module code, like: Module1!
If IEAvailable = False Then
'Range("A1").Value = "..."
Exit Sub
Else
If IEAvailable = True Then Call BrowseToSite
End If
End Sub
Código no Excel, se houver conexão com a internet então abrirá a internet e efetuará o login:
- Código:
Sub BrowseToSite()
On Error GoTo erro:
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLInputLogin As MSHTML.IHTMLElement
Dim HTMLInputSenha As MSHTML.IHTMLElement
Dim HTMLGo As MSHTML.IHTMLElement
Dim HTMLAreas As MSHTML.IHTMLElementCollection
Dim HTMLArea As MSHTML.IHTMLElement
Dim HTMLSair As MSHTML.IHTMLElement
IE.Visible = False
IE.Navigate "Linkocultado, para garantir que o usuário esteja desconectado"
Do While IE.ReadyState <> READYSTATE_COMPLETE
Loop
IE.Navigate "Linkocultado"
Do While IE.ReadyState <> READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.Document
Set HTMLInputLogin = HTMLDoc.getElementById("login")
HTMLInputLogin.Value = "Loginocultado"
Set HTMLInputSenha = HTMLDoc.getElementById("senha")
HTMLInputSenha.Value = "Senhaocultada"
Set HTMLGo = HTMLDoc.getElementById("image")
HTMLGo.Click
Do While IE.ReadyState <> READYSTATE_COMPLETE
Loop
Set HTMLAreas = HTMLDoc.getElementsByTagName("area")
For Each HTMLArea In HTMLAreas
If HTMLArea.getAttribute("coords") = "4,3,108,16" And HTMLArea.getAttribute("href") = "Linkocultado" Then
HTMLArea.Click
Exit For
End If
Next HTMLArea
ProcessHTMLPage HTMLDoc
IE.Navigate "linkocultado, para efetuar o logout"
IE.Quit
Set IE = Nothing
Exit Sub
Código no Excel, antes de sair do sub anterior. Imprimir os dados para a planilha:
- Código:
Sub ProcessHTMLPage(HTMLPage As MSHTML.HTMLDocument)
Dim HTMLTabela As MSHTML.IHTMLElement
Dim HTMLTabelas As MSHTML.IHTMLElementCollection
Dim HTMLLinha As MSHTML.IHTMLElement
Dim HTMLTitulo As MSHTML.IHTMLElement
Dim NLinha As Long, NCol As Integer
Set HTMLTabelas = HTMLPage.getElementsByTagName("table")
For Each HTMLTabela In HTMLTabelas
If HTMLTabela.getAttribute("width") = "100%" Then
Worksheets("Planilhaocultada").Activate
Range("A1").Value = Now
Exit For
End If
NLinha = 1
For Each HTMLLinha In HTMLTabela.getElementsByTagName("td")
If HTMLLinha.getAttribute("colspan") = "7" And HTMLLinha.innerText Like "Filtroocultado" Then
NCol = 1
NLinha = NLinha + 1
Cells(NLinha, NCol) = HTMLLinha.innerText
End If
If HTMLLinha.innerText <> "" And HTMLLinha.getAttribute("width") = "16%" Then
NCol = 1
NLinha = NLinha + 1
Cells(NLinha, NCol) = HTMLLinha.innerText
End If
If HTMLLinha.innerText <> "" And HTMLLinha.getAttribute("width") = "12%" Then
NCol = NCol + 1
Cells(NLinha, NCol) = HTMLLinha.innerText
End If
Next HTMLLinha
Next HTMLTabela
Exit Sub
End Sub