Sim, às vezes nos é solicitado desenvolver uma solução no MS Excel que devia ser desenvolvida no MS Access. Precisamos desenvolver um formulários para dataentry, um ambiente para o armazenamento dos dados.
Imaginemos termos uma planilha com dados de Fornecedor e outra planilha de Produto. Como faríamos para trazer os produtos de um determinado fornecedor?
Todo o processo precisaria ser feito via código, um loop varrendo os produtos e identificando o fornecedor e copiando o resultado para outro lugar. Ou através do uso de fórmula, que dependendo da massa de dados pode se tornar inviável.
E se fosse possível fazer um SELECT com JOIN? Ficaria bem mais fácil certo?
Se seguíssemos um modelo de desenvolvimento padrão, o nosso código ficaria mais organizado. Precisamos de um segundo arquivo MS Excel pra ser o nosso banco de dados. Nada é perfeito, só é possível executar SELECT e INSERT. Os comandos de UPDATE e DELETE a gente improvisa.
Segue abaixo algumas funções que auxiliam no trabalho com o Excel como banco de dados. E certamente para outras versões do Excel devemos alterar a string de conexão.
Function ConectaXL() As Boolean'*****************************************'Nome: ConectaXL'Autor: Rafael Gomes dos Santos'Data: 04/05/2010'Descrição: Conexão ADO com planilha Excel (só consulta)'Revisão: 04/05/2010'*****************************************Let ConectaXL = TrueOn Error GoTo erro1:With cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & xlDB & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";".OpenEnd Witherro1:If Err.Number <> 0 ThenLet ConectaXL = FalseEnd IfEnd Function
'*****************************************Function DesconectaXL() As Boolean'*****************************************'Nome: DesconectaXL'Autor: Rafael Gomes dos Santos'Data: 04/05/2010'Descrição: Desconecta ADO com planilha Excel'Revisão: 04/05/2010'*****************************************On Error GoTo erro1:Let DesconectaXL = Truecn.CloseSet cn = Nothingerro1:If Err.Number <> 0 ThenLet DesconectaXL = FalseEnd IfEnd FunctionFunction ConectaXLAtualizavel() As Boolean'*****************************************'Nome: ConectaXLAtualizavel'Autor: Rafael Gomes dos Santos'Data: 04/05/2010'Descrição: Conexão ADO com planilha Excel (Permite INSERT)'Revisão: 04/05/2010'*****************************************Let ConectaXLAtualizavel = TrueOn Error GoTo erro1:With cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & xlDB & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";".OpenEnd Witherro1:If Err.Number <> 0 ThenConectaXLAtualizavel = FalseEnd IfEnd FunctionFunction ExcluiRegistro( _Tabela As String, _Campo As String, _Valor As String _) As Boolean
'Nome: ExcluiRegistro
'Autor: Rafael Gomes dos Santos
'Data: 04/05/2010
'Descrição: Exclui registro de tabela na planilha banco de dados
'Revisão: 04/05/2010
'*****************************************
Dim xl As New Excel.Application
Dim wkb As Workbook
Dim wsh As Worksheet
Dim c As Integer
Dim l As Integer
Let ExcluiRegistro = False
Set wkb = xl.Workbooks.Open(xlDB)
Set wsh = wkb.Worksheets(Tabela)
Let c = 1
Do While wsh.Cells(1, c) <> ""
If wsh.Cells(1, c) = Campo Then
Exit Do
End If
Let c = c + 1
Loop
If wsh.Cells(1, c) <> "" Then
Let l = 2
Do Until wsh.Cells(l, c) = ""
If wsh.Cells(l, c) = Valor Then
wsh.Cells(l, c).EntireRow.Delete
Let ExcluiRegistro = True
Exit Do
End If
Let l = l + 1
Loop
End If
Set wsh = Nothing
wkb.Close True
Set wkb = Nothing
xl.Quit
Set xl = Nothing
End FunctionFunction RegistroExiste( _Tabela As String, _Campo As String, _Valor As String, _Optional Tipo As String, _Optional Campo2 As String, _Optional Valor2 As String, _Optional Tipo2 As String, _Optional Campo3 As String, _Optional Valor3 As String, _Optional Tipo3 As String _) As Boolean'*****************************************'Nome: RegistroExiste'Autor: Rafael Gomes dos Santos'Data: 04/05/2010'Descrição: Retorna TRUE se o registro existir na planilha banco de dados. Limitado a 3 parâmetros.'Revisão: 04/05/2010'*****************************************Dim rs As New ADODB.RecordsetDim strSQL As StringRegistroExiste = FalseIf ConectaXLAtualizavel = False ThenMsgBox "Impossível conectar"Exit FunctionEnd Ifrs.ActiveConnection = cnLet strSQL = "SELECT * FROM [" & Tabela & "$] WHERE "If Tipo = "Number" ThenstrSQL = strSQL & Campo & " = " & ValorElsestrSQL = strSQL & Campo & " = '" & Valor & "'"End IfIf Campo2 <> "" ThenIf Tipo2 = "Number" ThenstrSQL = strSQL & " " & Campo2 & " = " & Valor2ElsestrSQL = strSQL & " " & Campo2 & " = '" & Valor2 & "'"End IfEnd IfIf Campo3 <> "" ThenIf Tipo3 = "Number" ThenstrSQL = strSQL & " " & Campo3 & " = " & Valor3ElsestrSQL = strSQL & " " & Campo3 & " = '" & Valor3 & "'"End IfEnd Ifrs.Source = strSQLrs.LockType = adLockPessimisticrs.OpenIf Not rs.EOF ThenRegistroExiste = TrueEnd IfIf DesconectaXL = False ThenMsgBox "Impossível desconectar"Exit FunctionEnd IfEnd FunctionFazendo um SELECT com JOIN na planilha Excel.If ConectaXL = False ThenMsgBox "Impossível conectar"Exit SubEnd IfLet rs.ActiveConnection = cnLet strsql = "SELECT [Jurado$].Nome,"Let strsql = strsql & " [Jurado$].Cargo,"Let strsql = strsql & " [Jurado$].Empresa,Let strsql = strsql & " [Jurado$].CargoJuri"Let strsql = strsql & " FROM [Jurado$]"Let strsql = strsql & " INNER JOIN [CargoJuri$]"Let strsql = strsql & " ON [Jurado$].CargoJuri = [CargoJuri$].Cargo"Let strsql = strsql & " WHERE [Jurado$].RegiaoJuri = 'LESTE/OESTE'"Let strsql = strsql & " ORDER BY [CargoJuri$].Ordem"Let rs.Source = strsqlLet rs.LockType = adLockPessimisticrs.OpenIf ConectaXLAtualizavel = False ThenMsgBox "Impossível conectar"Exit SubEnd IfLet rs.ActiveConnection = cnLet rs.Source = "SELECT * FROM [Inscritos$] WHERE" _& " Categoria = '" & Me.cmbCategoria & "'" _& " AND Regiao = '" & Me.cmdRegiao & "'" _& " AND Posicao = " & Me.txtPosicaoLet rs.LockType = adLockPessimisticrs.OpenIf Not rs.EOF Thenrs.MoveFirstLet rs("Categoria") = Me.cmbCategoriaLet rs("Regiao") = Me.cmdRegiaoLet rs("Duracao") = Me.txtDuracaoLet rs("Posicao") = Me.txtPosicaoLet rs("Titulo") = Me.txtTitulors.Updaters.CloseSet rs = NothingEnd IfIf DesconectaXL = False ThenMsgBox "Não foi possível se desconectar do Banco de Dados. por favor reinicie o sistema."Exit SubEnd If
Referência: SistemaEmVBA.com
Deixe os seus comentários! Envie este artigo, divulgue este link na sua rede social...
Tags: VBA, Excel, Icon, ícones, Conditional, Formatting,