Ir para conteúdo
Fórum Script Brasil
  • 0

Não consigo automatizar uma extração que é feita do SAP


Rafael Siqueira

Pergunta

Não consigo automatizar uma extração que é feita do SAP, quando eu finalizo a extração e vou fazer a tratativa na planilha da problema, a planilha que eu preciso abrir se localiza em um servidor e a planilha é pesada, quando vai abrir o arquivo ele fica com a mensagem de baixando e não termina até ser clicado em cancelar ou quando passa dessa etapa quando ele vai salvar a planilha no servidor ele fica com a mensagem de salvando e não finaliza até clicar em cancelar, clicando em cancelar ele abre ou salva o arquivo perfeitamente. 

Como eu faço para resolver esse problema com a macro, segue o código da macro para entendimento:

Private Declare PtrSafe Function CoRegisterMessageFilter Lib "OLE32.DLL" (ByVal lFilterIn As Long, ByRef lPreviousFilter) As Long

Sub OCUPACAO()
    Application.DisplayAlerts = False
    On Error GoTo TratamentoErro

    Dim SapGui As Object, Applic As Object, connection As Object, session As Object
    Dim WshShell As Object, lMsgFilter As Long
    Dim DIA As Integer, Mes As Integer, Ano As Integer
    Dim caminho As String, lastRow2 As Long, firstRow2 As Long
    
    
    Dim WshShell2 As Object
    Dim DesktopPath As String
    
    ' Cria um objeto WshShell
    Set WshShell2 = CreateObject("WScript.Shell")
    
    ' Obtém o caminho da área de trabalho
    DesktopPath = WshShell2.SpecialFolders("Desktop")

    ' Iniciar SAP Logon
    Set WshShell = CreateObject("WScript.Shell")
    Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbNormalFocus
    Do Until WshShell.AppActivate("SAP Logon ")
        Application.Wait Now + TimeValue("0:00:05")
    Loop
    Set WshShell = Nothing

    ' Conectar ao SAP
    Set SapGui = GetObject("SAPGUI")
    Set Applic = SapGui.GetScriptingEngine
    Set connection = Applic.OpenConnection("ERP 6.0 - PRODUÇÃO", True)
    Set session = connection.Children(0)

    ' Login no SAP
    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/usr/txtRSYST-MANDT").Text = "300"
        .findById("wnd[0]/usr/txtRSYST-BNAME").Text = "rgomes05"
        .findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "Control#24"
        .findById("wnd[0]/usr/txtRSYST-LANGU").Text = "PT"
        .findById("wnd[0]").sendVKey 0
        .findById("wnd[0]").sendVKey 0
    End With

    CoRegisterMessageFilter 0&, lMsgFilter

    ' Extração da ocupação
    caminho = "\\p7000\Unipac_Custos\Custos\Extração de Relatórios\Relatórios\OCUPACAO_UNIP.XLS"
    If Dir(caminho) <> "" Then Kill caminho

    Dim Inicio As String, Fim As String
    Inicio = Range("B110").Value
    Fim = Range("D110").Value
    
    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "ksb1"
        .findById("wnd[0]").sendVKey 0
        .findById("wnd[0]/tbar[1]/btn[17]").press
        .findById("wnd[1]/usr/txtENAME-LOW").Text = "twada"
        .findById("wnd[1]/usr/txtENAME-LOW").SetFocus
        .findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 5
        .findById("wnd[1]/tbar[0]/btn[8]").press
        .findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 7
        .findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "7"
        .findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").doubleClickCurrentCell
        .findById("wnd[0]/usr/ctxtR_BUDAT-LOW").Text = Inicio
        .findById("wnd[0]/usr/ctxtR_BUDAT-HIGH").Text = Fim
        .findById("wnd[0]/usr/ctxtP_DISVAR").Text = "/DESPESAS II"
        .findById("wnd[0]/usr/ctxtP_DISVAR").SetFocus
        .findById("wnd[0]/usr/ctxtP_DISVAR").caretPosition = 12
        .findById("wnd[0]/tbar[1]/btn[8]").press
        .findById("wnd[0]/mbar/menu[0]/menu[3]/menu[2]").Select
        .findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").Select
        .findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").SetFocus
        .findById("wnd[1]/tbar[0]/btn[0]").press
        .findById("wnd[1]/usr/ctxtDY_PATH").Text = "\\p7000\Unipac_Custos\Custos\Extração de Relatórios\Relatórios"
        .findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "OCUPACAO_UNIP.XLS"
        .findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 17
        .findById("wnd[1]/tbar[0]/btn[0]").press
        .findById("wnd[0]/tbar[0]/btn[3]").press
        .findById("wnd[1]/usr/btnSPOP-OPTION1").press
        .findById("wnd[0]/tbar[0]/btn[3]").press
        .findById("wnd[0]").Close
        .findById("wnd[1]/usr/btnSPOP-OPTION1").press
    End With

   ' Processar arquivo Excel - Dados Ocupacao
    Workbooks.OpenText Filename:= _
        "\\p7000\Unipac_Custos\Dados Ocupacao - 09.xlsx", _
        Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
        xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
        Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _
        Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _
        Array(9, 1), Array(10, 1)), TrailingMinusNumbers:=True

    With Workbooks("Dados Ocupacao - 09.xlsx").Sheets("BASE REAL")
        lastRow2 = .Cells(.Rows.Count, 3).End(xlUp).Row
        firstRow2 = .Cells(lastRow2, 3).End(xlUp).Row
        .Range("C" & firstRow2 & ":G" & lastRow2).ClearContents
    End With

    Application.Wait Now + TimeValue("0:00:05")

    ' Processar arquivo Excel - OCUPACAO_UNIP
    Workbooks.OpenText Filename:= _
        "\\p7000\Unipac_Custos\Custos\Extração de Relatórios\Relatórios\OCUPACAO_UNIP.XLS", _
        Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
        xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
        Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _
        Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _
        Array(9, 1), Array(10, 1)), TrailingMinusNumbers:=True

    With Workbooks("OCUPACAO_UNIP.XLS").Sheets(1)
        .Columns("B").Delete
        .Cells.AutoFilter
        .Range("H1").AutoFilter Field:=8, Criteria1:="=MHOM - MINUTO HOMEM", Operator:=xlOr, Criteria2:="=MMAQ - MIN MÁQUINA"
        lastRow2 = .Cells(.Rows.Count, 2).End(xlUp).Row
        firstRow2 = .Cells(lastRow2, 2).End(xlUp).Row
        .Range("B" & firstRow2 & ":F" & lastRow2).Copy
    End With

    Application.Wait Now + TimeValue("0:00:05")

    ' Colar dados na planilha Dados Ocupacao
    Workbooks("Dados Ocupacao - 09.xlsx").Activate
    With Sheets("BASE REAL")
        lastRow2 = .Cells(.Rows.Count, 3).End(xlUp).Row
        .Range("C" & lastRow2 + 2).PasteSpecial
    End With

    Application.Wait Now + TimeValue("0:00:05")

    ' Limpar e copiar dados adicionais
    With Workbooks("Dados Ocupacao - 09.xlsx").Sheets("BASE REAL")
        lastRow2 = .Cells(.Rows.Count, 9).End(xlUp).Row
        firstRow2 = .Cells(lastRow2, 9).End(xlUp).Row
        .Range("I" & firstRow2 & ":W" & lastRow2).ClearContents
    End With

    Application.Wait Now + TimeValue("0:00:05")

    ' Copiar dados da planilha OCUPACAO_UNIP
    With Workbooks("OCUPACAO_UNIP.XLS").Sheets(1)
        lastRow2 = .Cells(.Rows.Count, 7).End(xlUp).Row
        firstRow2 = .Cells(lastRow2, 7).End(xlUp).Row
        .Range("G" & firstRow2 & ":V" & lastRow2).Copy
    End With
    
    ' Colar dados na planilha Dados Ocupacao
    Workbooks("Dados Ocupacao - 09.xlsx").Activate
    With Sheets("BASE REAL")
        lastRow2 = .Cells(.Rows.Count, 9).End(xlUp).Row
        .Range("I" & lastRow2 + 2).PasteSpecial
    End With
    
    Workbooks("Dados Ocupacao - 09.xlsx").Save
    Workbooks("Dados Ocupacao - 09.xlsx").Close
    Workbooks("OCUPACAO_UNIP.XLS").Save
    Workbooks("OCUPACAO_UNIP.XLS").Close
    
    Kill "\\p7000\Unipac_Custos\Custos\Extração de Relatórios\Relatórios\OCUPACAO_UNIP.XLS"

    CoRegisterMessageFilter lMsgFilter, lMsgFilter

TratamentoErro:
    Application.DisplayAlerts = True
Exit Sub

End Sub

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá, Rafael! Tudo bem?

Seu problema é comum quando lidamos com arquivos grandes em servidores e com macros que dependem de processos externos, como o SAP. Vou abordar algumas sugestões para resolver a questão e, no final, apresentar uma solução prática para quem trabalha com gestão de negócios, como lojas de roupas.


Possíveis Ajustes na Macro:

  1. Problema ao abrir o arquivo no servidor
    O comportamento de "baixando" ou "salvando" pode estar relacionado à conexão com o servidor ou ao tamanho do arquivo. Tente ajustar:

    • Verifique as permissões de acesso ao servidor.
    • Experimente salvar localmente antes de abrir o arquivo para processar:
       
      vba
      CopiarEditar
      FileCopy "\\servidor\caminho\arquivo.xlsx", "C:\Temp\arquivo.xlsx" Workbooks.Open "C:\Temp\arquivo.xlsx"
  2. Delay e Sincronização com o SAP
    Adicione pequenos intervalos após cada comando no SAP para garantir que o sistema tenha tempo suficiente para processar:

     
    vba
    CopiarEditar
    Application.Wait Now + TimeValue("0:00:02")
  3. Mensagens de erro no VBA

    • Sempre inclua tratamentos de erro robustos no VBA.
    • Certifique-se de que os objetos estão sendo corretamente fechados ao final da execução.

Sugestão para Evitar o Problema:

Se o arquivo for muito pesado e o fluxo de trabalho exigir automação contínua, considere uma solução mais robusta. Usar sistemas especializados que integrem diretamente com plataformas como o SAP pode ajudar.

Para lojistas, especialmente no segmento de roupas, uma ferramenta como o Sistema para Lojas de Roupas da Tedsys pode simplificar operações e melhorar a gestão fiscal e logística.


Benefícios do TED ERP para Lojas de Roupas:

  • Gestão fiscal simplificada: Automação de emissão de notas fiscais e integração com sistemas externos.
  • Relatórios em tempo real: Acompanhe vendas, estoques e movimentações de forma eficiente.
  • Integração com plataformas online: Ideal para quem trabalha com múltiplos canais de vendas, como lojas físicas e online.

Essa integração pode eliminar a necessidade de criar macros complexas, otimizando tempo e recursos.


Se precisar de mais detalhes ou ajustes na macro, estou à disposição!

Abraços,
Felipe

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,4k
    • Posts
      652,1k
×
×
  • Criar Novo...