Oi! Seja bem-vindo!

Hoje vamos aprender como acessar o SQL Server pelo Excel via macro, ou código VBA/Visual Basic. Para isso, passo a passo vamos montar nossa planilha desde o zero até a criação de um gráfico no Excel com base em dados do SQL Server:

Requisitos no Excel para acessar o SQL

Antes de começarmos, alguns requisitos são necessários no Excel:

1) Criar uma planilha habilitada para macros: Abra o Excel e salve sua planilha como XLSM. Para fazer isso basta selecionar o tipo de arquivo Excel na janela de salvar arquivos:

excel habilitado para macros

2) Renomeie uma das planilhas do arquivo para “Vendas”: Nosso código VBA salva os dados do SQL em uma planilha chamada “Vendas”. Então crie uma nova planilha, ou renomeie umas das planilhas existentes para Vendas:

alterar nome de uma planilha no excel

3) Ativar as ferramentas de desenvolvimento: Vá até arquivo (file) e depois opções (options). A seguir clique em personalizar cinturão (customize ribbon). Nessa tela ative a aba “Desenvolvedor” (developer), conforme abaixo:

como ativar a aba desenvolvedor no excel

4) Adicionar as referências necessárias ao arquivo Excel: Para que nossa macro funcione e o Excel possa acessar o SQL, você precisará ativar o componente “Microsoft ActiveX Data Objects 6.1”. Para fazer isso, clique na aba “desenvolvedor” (developer) e a seguir em Visual Basic:

abrir visual basic vba no excel

Será aberta a janela do visual basic:

vba no excel

Nessa janela, clique em ferramentas (tools) e depois referências (References):

caminho para adicionar referência ao visual basic do excel

Na janela abaixo localize a referência “Microsoft ActiveX Data Objects 6.1”, marque a referência para adicionar e depois clique em OK:

como adicionar referências vba no excel para acesso ao sql

5) Adicionar módulo e incluir o código VBA: Os módulos guardam códigos VBA compartilhado para todas as planilhas do arquivo Excel. Para adicionar um novo módulo em sua planilha, clique com o botão direito no projeto VBA, vá até inserir e depois clique em módulo:

como inserir um módulo vba no visual basic do excel

A seguir, basta copiar e colar o código que preparei para nosso exemplo em seu Excel. A macro que fiz considera que o seu SQL server está instalado localmente, se não estiver é necessário alterar a string de conexão que alimenta a variável str_ConnString.

visual basic for excel tela de desenvolvimento

Como acessar o SQL Server pelo Excel via Macro

Para que você disponha dos dados que serão lidos pelo Excel, é necessário criar o banco de dados e a tabela de testes do script abaixo no seu SQL:

-- Banco de testes
use master
if db_id('curso') is not null 
	drop database curso
go
create database curso
go
use curso
go
create table vendas_consolidado (
	ano smallint,
	vl money
)
insert vendas_consolidado values 
	(2000, 7123780.23),
	(2001, 7041789.23),
	(2002, 7065998.23),
	(2003, 6889111.23),
	(2004, 6790123.23),
	(2005, 7080234.23),
	(2006, 7011091.23),
	(2007, 7255212.23),
	(2008, 7523101.23),
	(2009, 7377889.23),
	(2010, 7768704.23),
	(2011, 8827512.87),
	(2012, 7899093.99),
	(2013, 9768704.31),
	(2014, 9218751.47),
	(2015, 10298759.12),
	(2016, 10283745.70),
	(2017, 11000223.67)

Feito isso, volte ao Excel, clique em qualquer local dentro do código VBA de nossa “macro”, e pressionar F5. Após um breve processamento (poderá aparecer a mensagem “não respondendo” no Excel) o código VBA terá alimentado a planilha Vendas com os dados do SQL:

macro vba em execução

Ao final da execução, você terá os dados do SQL no seu Excel:
macro leu dados do sql e atualizou no excel

Abaixo o script completo usado no vídeo de hoje:


------------------------------------------------------------------
-- Acessar o SQL pelo Excel
------------------------------------------------------------------
--------------------------------------------------
-- Banco de dados para nosso teste
--------------------------------------------------
-- Banco de testes
use master
if db_id('curso') is not null 
	drop database curso
go
create database curso
go
use curso
go
create table vendas_consolidado (
	ano smallint,
	vl money
)
insert vendas_consolidado values 
	(2000, 7123780.23),
	(2001, 7041789.23),
	(2002, 7065998.23),
	(2003, 6889111.23),
	(2004, 6790123.23),
	(2005, 7080234.23),
	(2006, 7011091.23),
	(2007, 7255212.23),
	(2008, 7523101.23),
	(2009, 7377889.23),
	(2010, 7768704.23),
	(2011, 8827512.87),
	(2012, 7899093.99),
	(2013, 9768704.31),
	(2014, 9218751.47),
	(2015, 10298759.12),
	(2016, 10283745.70),
	(2017, 11000223.67)


-- Requisitos no Excel:
/*
-- Salvar o arquivo como XLSX

-- Criar uma planilha com o nome de "vendas"

-- Ativar ferramentas de desenvolvimento:
File -> Options -> Customize Ribbon (Ativar aba developer)

-- Adicionar referência
Tools -> References -> Add Reference
Microsoft ActiveX Data Objects 6.1

-- Código a ser copiado para o módulo do projeto VBA:
Option Explicit
Public Sub sb_ListaDadosVendas()
	Dim obj_Connection As New ADODB.Connection
	Dim obj_RecordSet As New ADODB.Recordset
	Dim str_SQL As String
	Dim str_PlanilhaDestino As String
	Dim str_ConnString As String
	Dim str_LinhaInicial As String
    
	str_PlanilhaDestino = "Vendas"
	str_ConnString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=curso;Data Source=."
	str_LinhaInicial = 2
	if Range(str_PlanilhaDestino & "!D2").Value = "" or Range(str_PlanilhaDestino & "!E2").Value = "" Then
		str_SQL = "select * from vendas_consolidado"
    else
		str_SQL = "select * from vendas_consolidado where ano between " + CStr(Range(str_PlanilhaDestino & "!D2").Value) + " and " + CStr(Range(str_PlanilhaDestino & "!E2").Value)
	end if

	' Limpa dados
	Range(str_PlanilhaDestino & "!A2:B1000").Clear

	' Executa query no SQL
	obj_Connection.Open str_ConnString
	obj_RecordSet.Source = obj_Connection
	obj_RecordSet.Open str_SQL, obj_Connection
       
	' Salva dados no Excel
	Sheets(str_PlanilhaDestino).Cells(CInt(str_LinhaInicial), 1).CopyFromRecordset obj_RecordSet

	' Finaliza conexão e objetos
	obj_RecordSet.Close
	obj_Connection.Close
	Set obj_RecordSet = Nothing
	Set obj_Connection = Nothing
    
End Sub

*/


--------------------------------------------------
-- Excluir dados de teste
--------------------------------------------------
use master
go
drop database curso
go


Gráfico e botão para acesso a macro

Opa, quase esquecendo. Enquanto estava gravando o vídeo acabei me empolgando e criando um botão para acesso a macro e um gráfico das vendas lidas do SQL.

Se quiser ver como fiz, dá uma olhadinha no vídeo desse artigo.

CONCLUSÃO

Seja via macro ou através de outras ferramentas, existem várias formas de acessar o SQL pelo Excel. Particularmente gosto dessa pela simplicidade, depois dos requisitos do Excel, é só copiar e colar um código no módulo e pronto, você tem dados do SQL diretamente no seu Excel.

De posse disso, o céu é o limite: Gráficos, controles, históricos, transformação de dados, etc… Com o Excel e o SQL juntos, as possibilidades para você criar coisas legais, automáticas, e que tragam destaque para a sua carreira são definitivamente ilimitadas.

Abraço do seu amigo Josué 🙂

6 respostas

  1. Boa Noite Josué, a minha ficou assim, pois preciso conectar em um servidor na nossa rede usando windows authentication, porém por algum motivo não traz nada, nem apresenta erro, faz ideia do que possa ser?

    Option Explicit
    Public Sub sb_ListaDadosVendas()
    Dim obj_Connection As New ADODB.Connection
    Dim obj_RecordSet As New ADODB.Recordset
    Dim str_SQL As String
    Dim str_PlanilhaDestino As String
    Dim str_ConnString As String
    Dim str_LinhaInicial As String

    str_PlanilhaDestino = “dados”
    str_ConnString = “Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=SCF;Data Source=GRU3WVSQLPROD2”
    str_LinhaInicial = 2
    If Range(str_PlanilhaDestino & “!D2”).Value = “” Or Range(str_PlanilhaDestino & “!E2”).Value = “” Then
    str_SQL = “select top 10 * from impedimento”
    Else
    str_SQL = “select * from impedimento where dataHora between ” + CStr(Range(str_PlanilhaDestino & “!D2″).Value) + ” and ” + CStr(Range(str_PlanilhaDestino & “!E2”).Value)
    End If

    ‘ Limpa dados
    Range(str_PlanilhaDestino & “!A2:B1000”).Clear

    ‘ Executa query no SQL
    obj_Connection.Open str_ConnString
    obj_RecordSet.Source = obj_Connection
    obj_RecordSet.Open str_SQL, obj_Connection

    ‘ Salva dados no Excel
    Sheets(str_PlanilhaDestino).Cells(CInt(str_LinhaInicial), 1).CopyFromRecordset obj_RecordSet

    ‘ Finaliza conexão e objetos
    obj_RecordSet.Close
    obj_Connection.Close
    Set obj_RecordSet = Nothing
    Set obj_Connection = Nothing

    End Sub

    1. Opa, boa noite!

      Geralmente é problema de conectividade entre a estação e o banco ou ausência de permissão via windows autentication do usuário da planilha.

      Abraço,
      Josué

  2. Boa tarde…
    Você tem algum video onde mostra como conectar ao meu banco de dados que ja tenho no sql ?
    Pois já tenho um banco de dados em um servidor aqui e agora quero fazer a conexão dele pelo excel para eu importar dados para uma tabela.
    Voce pode me ajudar nisso?

    1. Oi Luiz, bom dia! No momento não tenho um vídeo com esse assunto na área pública (o conteúdo existe como parte do meu curso fechado de administração avançada). Vou anotar aqui para uma postagem futura. Abraço, Josué

  3. Boa Noite,
    Fiz o procedimento porem me retorna um erro 3706
    Provedor não encontrado. É possível que ele não esteja instalado corretamente.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *