none
Executar VBA no Excel a partir de uma VBA no Word RRS feed

  • Pergunta

  • Olá pessoal!

    Criei um Documento no Word, chamado Documento.docx e criei uma macro conforme abaixo:

    Sub Macro1()
        Selection.Copy
          Dim XL As Object
          Set XL = CreateObject("Excel.Application")
          XL.Workbooks.Open "C:\temp\Plan1.xlsm"
          'XL.Run "MacroEx"
    End Sub

    Criei uma planilha Excel chamada Plan1.xlsm (com macro). E criei uma macro (MacroEx) para preencher somente as colunas A e B da planilha, conforme abaixo:

    Sub MacroEx()

        Application.ScreenUpdating = False
        Dim rLastA As Long
        Dim lin As Long
        Dim col As Long
        lin = 1
        col = 1

    'Encontra a última linha em branco na Coluna A
        With Sheets("Plan1")
            rLastA = .Cells(.Rows.Count, "A").End(xlUp).Row
        End With
        
        

    'Busca as celulas a serem preenchidas
        If Cells(rLastA, 1) <> "" And Cells(rLastA, 2) <> "" Then
            rLastA = rLastA + 1
        End If

        msgbox "Linha: " & rLastA

        If Cells(rLastA, 1) <> "" And Cells(rLastA, 2) = "" Then
            Cells(rLastA, 2).Select
            ActiveSheet.Paste
        End If
        If Cells(rLastA, 1) = "" And Cells(rLastA, 2) = "" Then
            Cells(rLastA, 1).Select
            ActiveSheet.Paste
            Cells(rLastA, 2).Select
            Selection.Cells.Value = ""
        End If

    End Sub

    A macro em Excel funciona bem quando executo dentro do Excel. Mas quando faço a chamado de dentro do Word, não funciona.

    Eu quero que ao selecionar algumas palavras no documento, depois dê CTRL C para enviar à memória, a macro do Word chame a macro do Excel para posicionar o que está em memória, dentro da planilha Excel, seguindo as instruções da Macro do Excel.

    Alguém poderia me dar uma luz?

    Abraços e obrigado,

    Sidney Basto

    sbasto@gmail.com

    domingo, 26 de outubro de 2014 13:55

Respostas

  • Poderia postar o código final que está usando?

    Não vejo problema na sua macro. Tente melhorar algumas coisas:

    Sub Macro1()
      Dim oExcel As Object
      Dim wb As Object
      
      On Error Resume Next
      Set oExcel = GetObject(, "Excel.Application")
      If oExcel Is Nothing Then Set oExcel = CreateObject("Excel.Application")
      On Error GoTo 0
      If oExcel Is Nothing Then
        MsgBox "Não foi possível inicializar o Excel.", vbCritical
        Exit Sub
      End If
      
      oExcel.DisplayAlerts = False
      oExcel.Workbooks.Open "C:\temp\Plan1.xlsm"
      oExcel.DisplayAlerts = True
      Selection.Copy
      oExcel.Run "MacroEx"
      wb.Close SaveChanges:=False
    End Sub
    

    E:

    Sub MacroEx()
      Dim lCol As Long
      Dim lLast As Long
      Dim lRow As Long
      Dim ws As Excel.Worksheet
      
      lRow = 1
      lCol = 1
      
      Set ws = ThisWorkbook.Worksheets("Plan1")
      'Encontra a última lRowha em branco na Coluna A
      With ws
        lLast = .Cells(.Rows.Count, "A").End(xlUp).Row
        
        'Busca as celulas a serem preenchidas
        If .Cells(lLast, 1) <> "" And .Cells(lLast, 2) <> "" Then
          lLast = lLast + 1
        End If
        
        MsgBox "Linha: " & lLast
        If .Cells(lLast, 1) <> "" And .Cells(lLast, 2) = "" Then
          .Cells(lLast, 2).Select
          ActiveSheet.Paste
        End If
        If .Cells(lLast, 1) = "" And .Cells(lLast, 2) = "" Then
          .Cells(lLast, 1).Select
          ActiveSheet.Paste
          .Cells(lLast, 2) = ""
        End If
      End With
    End Sub
    


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 29 de outubro de 2014 19:51
    Moderador

Todas as Respostas

  • Boa noite Sidney.

    Não testei seu código, mas olhando parece que o erro deve estar na instanciação do Excel. Você precisa se certificar que o Excel não está em execução antes de instanciá-lo, para garantir um correto funcionamento.

    Sugiro uma leitura rápida de: http://www.ambienteoffice.com.br/officevba/boas_praticas_para_instanciacao_de_aplicacoes/

    Espero que ajude.


    Filipe Magno

    • Sugerido como Resposta Roberto_Santos segunda-feira, 27 de outubro de 2014 18:30
    segunda-feira, 27 de outubro de 2014 02:01
  • Caro Filipe, bom dia,

    Fiz a leitura sugerida e consegui acertar os problemas. Está funcionando.

    Valeu! Muito obrigado.

    Abraços,

    Sidney

    segunda-feira, 27 de outubro de 2014 13:53
  • Poderia postar o código final que está usando?

    Não vejo problema na sua macro. Tente melhorar algumas coisas:

    Sub Macro1()
      Dim oExcel As Object
      Dim wb As Object
      
      On Error Resume Next
      Set oExcel = GetObject(, "Excel.Application")
      If oExcel Is Nothing Then Set oExcel = CreateObject("Excel.Application")
      On Error GoTo 0
      If oExcel Is Nothing Then
        MsgBox "Não foi possível inicializar o Excel.", vbCritical
        Exit Sub
      End If
      
      oExcel.DisplayAlerts = False
      oExcel.Workbooks.Open "C:\temp\Plan1.xlsm"
      oExcel.DisplayAlerts = True
      Selection.Copy
      oExcel.Run "MacroEx"
      wb.Close SaveChanges:=False
    End Sub
    

    E:

    Sub MacroEx()
      Dim lCol As Long
      Dim lLast As Long
      Dim lRow As Long
      Dim ws As Excel.Worksheet
      
      lRow = 1
      lCol = 1
      
      Set ws = ThisWorkbook.Worksheets("Plan1")
      'Encontra a última lRowha em branco na Coluna A
      With ws
        lLast = .Cells(.Rows.Count, "A").End(xlUp).Row
        
        'Busca as celulas a serem preenchidas
        If .Cells(lLast, 1) <> "" And .Cells(lLast, 2) <> "" Then
          lLast = lLast + 1
        End If
        
        MsgBox "Linha: " & lLast
        If .Cells(lLast, 1) <> "" And .Cells(lLast, 2) = "" Then
          .Cells(lLast, 2).Select
          ActiveSheet.Paste
        End If
        If .Cells(lLast, 1) = "" And .Cells(lLast, 2) = "" Then
          .Cells(lLast, 1).Select
          ActiveSheet.Paste
          .Cells(lLast, 2) = ""
        End If
      End With
    End Sub
    


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 29 de outubro de 2014 19:51
    Moderador