MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


2 participantes

    Access congelando ao executar código no excel

    avatar
    rafa_zus15
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Anónimo
    Mensagens : 1
    Registrado : 10/02/2018

    Access congelando ao executar código no excel Empty Access congelando ao executar código no excel

    Mensagem  rafa_zus15 10/2/2018, 15:47

    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:

    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
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 8449
    Registrado : 05/11/2009

    Access congelando ao executar código no excel Empty Re: Access congelando ao executar código no excel

    Mensagem  Alexandre Neves 10/3/2018, 15:22

    Boa tarde e bem-vindo ao fórum
    Onde quiser que o código actualize ou execute outro trabalho da fila coloque a instrução DoEvents


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

      Data/hora atual: 19/4/2024, 10:51