Como automatizar o Microsoft Excel a partir do Visual Basic

Resumo

Este artigo demonstra como criar e manipular o Excel através da Automatização a partir do Visual Basic.

Mais Informações

Existem duas formas de controlar um servidor de automatização: através da encadernação tardia ou de encadernação antecipada. Com a encadernação tardia, os métodos só são vinculados quando é executado e o servidor de automatização é declarado como Object. Com o encadernação antecipada, a sua aplicação sabe, no momento, o tipo exato de objeto com o qual vai comunicar e pode declarar os objetos como um tipo específico. Este exemplo utiliza encadernação antecipada, que é considerada melhor na maioria dos casos porque tem um melhor desempenho e uma melhor segurança.

Para vincular antecipadamente a um servidor de Automatização, tem de definir uma referência para a biblioteca de tipo do servidor. No Visual Basic, isto é feito através da caixa de diálogo Referências que se encontra na caixa de diálogo Projeto | Menu Referências. Para este exemplo, terá de adicionar uma referência à biblioteca de tipos do Excel antes de poder executar o código. Consulte os passos abaixo sobre como adicionar a referência.

Criar a Amostra de Automatização

  1. Inicia o Visual Basic e crie um novo projeto EXE Padrão. O formulário1 é criado por predefinição.

  2. Clique emProjeto e, em seguida, clique em Referências. É exibidaa caixa de diálogo Referências. Percorra a lista até encontrar a biblioteca de objetos do Microsoft Excel e, em seguida, selecione o item para adicionar uma referência ao Excel. Se a biblioteca de objetos correta para a sua versão do Excel não aparecer na lista, certifique-se de que tem a sua versão do Excel corretamente instalada.

    Notas

    • Se estiver a automatizar o Microsoft Office Excel 2007, a biblioteca de tipos aparece como Biblioteca de Objetos do Microsoft Excel 12.0 na lista Referências.
    • Se estiver a automatizar o Microsoft Office Excel 2003, a biblioteca de tipos aparece como Biblioteca de Objetos do Microsoft Excel 11.0 na lista Referências.
    • Se estiver a automatizar o Microsoft Excel 2002, a biblioteca de tipos aparece como Biblioteca de Objetos do Microsoft Excel 10.0 na lista Referências
    • Se estiver a automatizar o Microsoft Excel 2000, a biblioteca de tipos aparece como Biblioteca de Objetos do Microsoft Excel 9.0 na lista Referências .
    • Se estiver a automatizar o Microsoft Excel 97, a biblioteca de tipos aparece como Biblioteca de Objetos do Microsoft Excel 8.0 na lista de Referências
  3. Clique em OK para fechar a caixa de diálogo Referências.

  4. Adicionar um BotãoDe Comando ao Formulário1.

  5. Na janela de código do Formulário1, insira o seguinte código:

    Option Explicit
    
    Private Sub Command1_Click()
       Dim oXL As Excel.Application
       Dim oWB As Excel.Workbook
       Dim oSheet As Excel.Worksheet
       Dim oRng As Excel.Range
    
    'On Error GoTo Err_Handler
    
    ' Start Excel and get Application object.
       Set oXL = CreateObject("Excel.Application")
       oXL.Visible = True
    
    ' Get a new workbook.
       Set oWB = oXL.Workbooks.Add
       Set oSheet = oWB.ActiveSheet
    
    ' Add table headers going cell by cell.
       oSheet.Cells(1, 1).Value = "First Name"
       oSheet.Cells(1, 2).Value = "Last Name"
       oSheet.Cells(1, 3).Value = "Full Name"
       oSheet.Cells(1, 4).Value = "Salary"
    
    ' Format A1:D1 as bold, vertical alignment = center.
       With oSheet.Range("A1", "D1")
          .Font.Bold = True
          .VerticalAlignment = xlVAlignCenter
       End With
    
    ' Create an array to set multiple values at once.
       Dim saNames(5, 2) As String
       saNames(0, 0) = "John"
       saNames(0, 1) = "Smith"
       saNames(1, 0) = "Tom"
       saNames(1, 1) = "Brown"
       saNames(2, 0) = "Sue"
       saNames(2, 1) = "Thomas"
       saNames(3, 0) = "Jane"
    
    saNames(3, 1) = "Jones"
       saNames(4, 0) = "Adam"
       saNames(4, 1) = "Johnson"
    
    ' Fill A2:B6 with an array of values (First and Last Names).
       oSheet.Range("A2", "B6").Value = saNames
    
    ' Fill C2:C6 with a relative formula (=A2 & " " & B2).
       Set oRng = oSheet.Range("C2", "C6")
       oRng.Formula = "=A2 & "" "" & B2"
    
    ' Fill D2:D6 with a formula(=RAND()*100000) and apply format.
       Set oRng = oSheet.Range("D2", "D6")
       oRng.Formula = "=RAND()*100000"
       oRng.NumberFormat = "$0.00"
    
    ' AutoFit columns A:D.
       Set oRng = oSheet.Range("A1", "D1")
       oRng.EntireColumn.AutoFit
    
    ' Manipulate a variable number of columns for Quarterly Sales Data.
       Call DisplayQuarterlySales(oSheet)
    
    ' Make sure Excel is visible and give the user control
     ' of Microsoft Excel's lifetime.
       oXL.Visible = True
       oXL.UserControl = True
    
    ' Make sure you release object references.
       Set oRng = Nothing
       Set oSheet = Nothing
       Set oWB = Nothing
       Set oXL = Nothing
    
    Exit Sub
    Err_Handler:
       MsgBox Err.Description, vbCritical, "Error: " & Err.Number
    End Sub
    
    Private Sub DisplayQuarterlySales(oWS As Excel.Worksheet)
       Dim oResizeRange As Excel.Range
       Dim oChart As Excel.Chart
       Dim iNumQtrs As Integer
       Dim sMsg As String
       Dim iRet As Integer
    
    ' Determine how many quarters to display data for.
       For iNumQtrs = 4 To 2 Step -1
          sMsg = "Enter sales data for" & Str(iNumQtrs) & " quarter(s)?"
          iRet = MsgBox(sMsg, vbYesNo Or vbQuestion _
             Or vbMsgBoxSetForeground, "Quarterly Sales")
          If iRet = vbYes Then Exit For
       Next iNumQtrs
    
    sMsg = "Displaying data for" & Str(iNumQtrs) & " quarter(s)."
       MsgBox sMsg, vbMsgBoxSetForeground, "Quarterly Sales"
    
    ' Starting at E1, fill headers for the number of columns selected.
       Set oResizeRange = oWS.Range("E1", "E1").Resize(ColumnSize:=iNumQtrs)
    
    oResizeRange.Formula = "=""Q"" & COLUMN()-4 & CHAR(10) & ""Sales"""
    
    ' Change the Orientation and WrapText properties for the headers.
       oResizeRange.Orientation = 38
       oResizeRange.WrapText = True
    
    ' Fill the interior color of the headers.
       oResizeRange.Interior.ColorIndex = 36
    
    ' Fill the columns with a formula and apply a number format.
       Set oResizeRange = oWS.Range("E2", "E6").Resize(ColumnSize:=iNumQtrs)
       oResizeRange.Formula = "=RAND()*100"
       oResizeRange.NumberFormat = "$0.00"
    
    ' Apply borders to the Sales data and headers.
       Set oResizeRange = oWS.Range("E1", "E6").Resize(ColumnSize:=iNumQtrs)
       oResizeRange.Borders.Weight = xlThin
    
    ' Add a Totals formula for the sales data and apply a border.
       Set oResizeRange = oWS.Range("E8", "E8").Resize(ColumnSize:=iNumQtrs)
       oResizeRange.Formula = "=SUM(E2:E6)"
       With oResizeRange.Borders(xlEdgeBottom)
          .LineStyle = xlDouble
          .Weight = xlThick
       End With
    
    ' Add a Chart for the selected data
       Set oResizeRange = oWS.Range("E2:E6").Resize(ColumnSize:=iNumQtrs)
       Set oChart = oWS.Parent.Charts.Add
       With oChart
          .ChartWizard oResizeRange, xl3DColumn, , xlColumns
          .SeriesCollection(1).XValues = oWS.Range("A2", "A6")
             For iRet = 1 To iNumQtrs
                .SeriesCollection(iRet).Name = "=""Q" & Str(iRet) & """"
             Next iRet
          .Location xlLocationAsObject, oWS.Name
       End With
    
    ' Move the chart so as not to cover your data.
       With oWS.Shapes("Chart 1")
          .Top = oWS.Rows(10).Top
          .Left = oWS.Columns(2).Left
    
    End With
    
    ' Free any references.
       Set oChart = Nothing
       Set oResizeRange = Nothing
    
    End Sub
    
    
  6. Prima F5 para executar o projeto.