Este post foi originalmente publicado em https://officevbavsto.blogspot.com/2011/05/excel-sql-inserindo-dados-em-outra.html.

Certa vez, me perguntaram se era possível inserir dados em outra planilha do Excel sem ter que abri-la. Após um pouco de pesquisa, encontrei um método para poder inserir dados em uma planilha através de comandos SQL.

Usarei a seguinte planilha como base de dados:

O código é simples, na verdade, todo o segredo está na instrução SQL que você executa. O interessante é que podemos fazer de duas forma: a primeira preenche os dados de uma planilha existente e a segunda cria uma nova planilha dentro de uma pasta de trabalho.

Lembrando apenas que para poder usar o código de exemplo desta planilha você precisa adicionar referência ao Microsoft ActiveX Objects 2.1.

Crie uma planilha nova

Sub consulta_excel()
 

	Dim cn As ADODB.Connection

	Dim cnString As String

	Dim sqlString As String


	Set cn = New ADODB.Connection


	cnString = "Provider=Microsoft.Jet.OLEDB.4.0;"

	cnString = cnString & "Data Source=H:\MyExcel.xls;"

	cnString = cnString & "Extended Properties=Excel 8.0;"


	cn.ConnectionString = cnString


	sqlString = "SELECT * INTO [Sheet1] "

	sqlString = sqlString & "IN '' [Excel 8.0;Database=H:\NEWMyExcel.xls] "

	sqlString = sqlString & "FROM [Cotacoes$A2:D100]"

	 
	cn.Open

	cn.Execute sqlString, adExecuteNoRecords

	cn.Close

	 
	Set cn = Nothing

 
End Sub
  • SELECT * INTO [Sheet1] - É importante que a planilha informada entre os colchetes não exista na pasta de trabalho onde você irá inserir os dados, caso contrário isto gerará um erro. No exemplo acima, "Sheet1" não pode existir na pasta de trabalho "NEWMyExcel.xls".
Mensagem de erro quando a planilha já existe (SELECT * INTO [Sheet1])
  • "IN '' [Excel 8.0;Database=H:\NEWMyExcel.xls] " - Note que existem duas asplas simples, é importante mantê-las, caso contrário ocorrerá um erro. Aqui eu especifiquei qual a pasta de trabalho destino ("H:\NEWMyExcel.xls").
Mensagem de erro quando se omite as 2 aspas simples

Existem mais duas outras maneiras de se inserir os dados criando uma nova planilha.

[...]
sqlString = "SELECT * INTO "

sqlString = sqlString & "[Excel 8.0;Database=H:\NEWMyExcel.xls].[Sheet1] "

sqlString = sqlString & "FROM [Cotacoes$A2:D100]"
[...]

Ao invés de usar o argumento "IN" como no exemplo anterior, apenas indico o caminho da pasta de trabalho e o nome da nova planilha que criarei ("H:\NEWMyExcel.xls].[Sheet2]"). Lembrando que esta planilha não pode existir na pasta de trabalho.

[...]
sqlString = "SELECT * INTO [Sheet1] "

sqlString = sqlString & "IN 'H:\NEWMyExcel.xls' 'Excel 8.0;' "

sqlString = sqlString & "FROM [Cotacoes$A2:D100]"
[...]

O exemplo acima é a terceira maneira de executar, não tenho muito a dizer sobre ele, senão que produz o mesmo resultado que os dois anteriores.

Atualize uma planilha existente

Agora, e se você não quer criar uma nova planilha, mas acrescentar dados a uma já existente?

[...]

sqlString = "INSERT INTO [Sheet1$] "

sqlString = sqlString & "IN '' [Excel 8.0;Database=H:\NEWMyExcel.xls] "

sqlString = sqlString & "SELECT * FROM [Cotacoes$A2:D100]"

[...]

Sempre mantenha as 2 aspas simples ('') na instrução SQL.

Outra forma:

[...]

sqlString = "INSERT INTO [Sheet1$] "
sqlString = sqlString & "IN 'H:\NEWMyExcel.xls' 'Excel 8.0;' "
sqlString = sqlString & "SELECT * FROM [Cotacoes$A2:D100]"

[...]

Fonte: http://support.microsoft.com/kb/295646/EN-US

Créditos

Photo by Hitarth Jadhav from Pexels