Parâmetros de string de conexão para fontes de dados do Excel
No artigo anterior, discuti como podemos tratar arquivos de texto e Excel como se fossem um banco de dados usando DAO e como podemos abri-los sem vincular. Como eles não usam drivers ODBC, sua cadeia de conexão será formatada de forma bem diferente do que você pode estar acostumado a ver para uma cadeia de conexão ODBC. Há uma escassez de documentação sobre os parâmetros da cadeia de conexão do Excel. Este é o melhor esforço para cobrir algumas das lacunas e discutir as ramificações dos parâmetros.
Parâmetros de string de conexão do Excel
Embora tenhamos 3 “tipos” de fonte de dados diferentes:
Excel 8.0
:arquivos xls 97-2003Excel 12.0
:arquivos xlsbExcel 12.0 Xml
:arquivos xlsx
Todos eles usam os mesmos parâmetros.
Segue a lista de parâmetros:
HDR
parâmetro:linha de cabeçalho
YES
:A primeira linha é o cabeçalho e deve se tornar os nomes das colunas para a “tabela”/”conjunto de registros”NO
:A primeira linha não é tratada de forma diferente e é apenas um dado. Todos os nomes de coluna serão nomeados “FN” onde “N” é um número começando com 1 IMEX
parâmetro:comportamento de importação/exportação
Isso rege como os tipos de dados da coluna devem ser definidos, com base no conteúdo:
1
:se a coluna contiver tipos de dados diferentes, trate-a como uma string. Caso contrário, corresponda a coluna ao melhor tipo de dados.2
:sempre corresponda a coluna a um determinado tipo de dados com base na amostra. Isso pode causar um erro na leitura quando lemos uma linha que contém dados que não correspondem ao tipo de dados esperado. ACCDB
parâmetro:indica que o Access está usando o formato de arquivo ACCDB?
Por padrão, sempre é definido ACCDB=YES em um formato de arquivo accdb. No entanto, omitir ou defini-lo como NÃO parece não fazer nada. É um pouco de mistério. Se alguém puder compartilhar qual efeito esse parâmetro, poste em comentário e atualizarei o blog.
BANCO DE DADOS:Caminho para a pasta de trabalho do Excel
O parâmetro deve conter um caminho totalmente qualificado, incluindo o nome da pasta de trabalho.
String de conexão mínima de trabalho
Observe que o DATABASE é o único parâmetro obrigatório além da palavra-chave de origem do tipo de dados. Portanto, uma string de conexão mínima de trabalho pode ser:
Excel 8.0;DATABASE=C:\Links\Products.xls
Especificando folha ou intervalo na string de conexão
No exemplo anterior, você viu que uma planilha representava um arquivo “
DAO.TableDef
“. No entanto, planilhas não são a única coisa que pode ser um “Tabledef
“. Se a planilha do Excel contiver um intervalo nomeado, o intervalo nomeado será relatado como um “Tabledef
" também. Além disso, podemos “consultar” um bloco arbitrário na planilha usando o endereço da célula. Por exemplo:Dim db As DAO.Database Dim rs As DAO.Recordset Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx") Set rs = db.OpenRecordsset("Sheet$1A1:A3") Debug.Print rs.Name, rs.Fields.Count
É importante observar que os endereços das células não podem exceder o intervalo usado da planilha. Por exemplo, o
Products.xlsx
só tem conteúdo em A1:B3, o que significa que se você abrir um conjunto de registros usando Sheet1$A1:D5, você ainda obterá apenas 2 para contagem de campos e 3 para contagem de registros. As colunas/linhas em branco extras são simplesmente ignoradas. Por outro lado, se você sujou uma célula em algum lugar fora do A1:B3
, o UsedRange
da planilha será agora maior e a consulta incluirá colunas e linhas em branco. Portanto, esses são nomes válidos para usar em uma consulta em um “banco de dados” do Excel:
Sheet1$
– Todo o intervalo usado de uma planilha.Sheet1$A1:B4
– Apenas 2 colunas e 3 linhas (sem contar cabeçalho), desde que o conteúdo seja preenchido. Caso contrário, as colunas ou linhas podem ser menores do que o solicitado.ProductsRange
– o intervalo nomeado com esse nome.
Acho muito melhor usar intervalos nomeados onde for prático, pois isso garante que você não esteja codificando os endereços em seu código, especialmente se o intervalo for movido devido ao usuário inserir novas colunas ou linhas, mas não alterando o conteúdo do intervalo nomeado . No entanto, nem sempre é prático, especialmente se você estiver recebendo planilhas de terceiros e, portanto, não tiver controle sobre seu conteúdo ou formatos. Nesse caso, escrever uma consulta SQL também pode funcionar.
Consultando a fonte de dados do Excel
Suponha que não podemos controlar o formato e não queremos confiar no endereço absoluto, embora estejamos confiantes de que certas colunas e linhas estarão de fato presentes. Nessa situação, o melhor a fazer é consultar. Aqui está um exemplo que seleciona apenas uma linha:
Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx") Dim rs As DAO.Recordset Set rs = db.OpenRecordset("SELECT d.[Count] FROM [Sheet1$] AS d WHERE d.[Products] = 'Bananas';") Debug.Print rs.Fields(0).Value
Espero que você possa ver que isso é muito mais fácil do que iterar em cada linha para descobrir qual delas tem “Bananas” e depois ler a coluna à direita para obter a contagem. Nesse caso, a consulta supera a automatização do Excel.
Conclusão
Você viu que o DAO torna muito fácil para nós trabalhar com a fonte de dados do Excel e fingir como se fosse uma fonte de dados relacional e usar nossa linguagem de consulta favorita e objetos DAO familiares em vez de escrever um monte de código VBA automatizando o Excel para encontrar o dados que queremos. Os parâmetros da cadeia de conexão são bastante diretos e, desde que você tenha o caminho, é bom vincular ou abrir uma planilha do Excel.
No próximo artigo, veremos os parâmetros de conexão do arquivo de texto.