Notifications
Clear all

Dificuldades com SQL no Excel

18 Posts
2 Usuários
0 Reactions
3,347 Visualizações
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa noite, Srs.

Encontrei um código na internet onde parcialmente esta funcionando, meu combos estão preenchendo normalmente, mas meu SQL para preencher os TextBox não esta funcionando aparece o seguinte erro:

Gostaria da ajuda dos senhores, ou até mesmo indicações para poder sanar a duvida.

Arquivo que estou utilizando como teste é esse aqui:

 
Postado : 14/11/2014 8:44 pm
(@rlm)
Posts: 0
New Member
 

Teste

 
Postado : 15/11/2014 7:48 am
(@trindade)
Posts: 0
New Member
Topic starter
 

Teste

Bom dia rlm.

Obrigado por sua resposta e por organizar/montar o código, comparei o código que eu realizei um Ctrl + C e Ctrl + V em meu projeto mas não teve muito sucesso... Rsrs !!
O código ficou exatamente da forma que preciso, seleciono os dois ComboBox e realizo o preenchimento dos demais campos.

Peço desculpas pela minha ignorância, se possível poderia me explicar essa linha:

Sql = "SELECT * FROM [BANCO_DADOS$] where Mes_Ano = #" & vMesAno & "# and Matricula = " & vMatricula & ";"

A minha tabela esta entre "[BANCO_DADOS$]" colchetes e com cifrão e meu primeiro critério do where com " # " tralha, e aproveitando gostaria sabe se é possível fazer Sum ou Count ?

Desde já suo grato por sua ajuda, onde todas e qualquer ideia sempre é bem vinda !

 
Postado : 16/11/2014 9:06 am
(@rlm)
Posts: 0
New Member
 

O Colchete e cifrão são requisitos para conexão Ado com Banco. Em SQL uma string data para consulta/manutenção em um campo data requer que seja enviada entre "#".
Em programação, diria que tudo é possível, pode demorar mais ou menos dependendo da sua complexidade; então é possível somar (Sum) e/ou Contar (Count).

 
Postado : 16/11/2014 9:54 am
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa tarde, rlm.

Obrigado pela rápida resposta, se eu utilizar o convert( variavel , 103) irá funcionar dentro do VBA em vez do format(variável, "m/d/yyyy"), vou procurar artigo sobre conexão ADO, fico grato se tiver algum artigo para indicar pois achei mais limpo o código utilizando SQL dentro do VBA, a escrita fica mais extensa mais o código mais claro.

 
Postado : 16/11/2014 2:28 pm
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa noite, Srs.

Eu tentei realizar algumas alterações no código mas não tive muito sucesso e gostaria de ajuda dos senhores.

A exibição no ComboBox esta aparecendo distinto conforme preciso mas gostaria de poder manipular a exibição dentro do combo.

Exemplo:

    "MM/YYYY" - JAN/2014
    "MMM" : JAN
    "YYYY" : 2014[/list:u:3jj8wt4w]

     
Postado : 23/11/2014 6:35 pm
(@rlm)
Posts: 0
New Member
 

A "manipulação" da exibição pode ser obtida alterando na rotina que carrega os dados do combo (CarregaCategorias), o trecho conforme abaixo:

For Each Value In Area
     ComboBoxMesAno.AddItem Format(CDate(Value), "mmm-yyyy")
Next Value

Contudo essa modificação acarretará também em modificações em vários outros trechos do código
Por exemplo:
na rotina CarregaProdutos:

If .Cells(linha, colunaCategoria).Value = CDate(Categoria) Then
 
Postado : 24/11/2014 8:11 am
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa tarde. rlm.

Obrigado pela ajuda na formatação da exibição, mas agora estou com outro problema.

Aplicação esta disponível aqui em nossas conversas esta dando erro são eles:

Quando coloco para depurar vai pra essa linha

Andei olhando alguns post na internet mas não adiantou de nada até mesmo esse aqui
http://www.tomasvasquez.com.br/forum/viewtopic.php?f=5&t=1060

Mas sem sucesso !!!

 
Postado : 24/11/2014 11:44 am
(@rlm)
Posts: 0
New Member
 

O provedor oledb 4.0 está presente em aplicativos com office anterior à versão 2007.
Provavelmente está tentando utilizar em maquinas que possuem versão superior.
Então a rotina de conexão ao banco pode ser +/- assim
nota: Não considerei a alteração da exibição da data no combo

Private Sub Consultar()
Dim vMesAno As String, vMatricula As String, sPath As String
Dim sConn As String, SourcePath As String
Dim Comd As New ADODB.Connection
Dim rst As New ADODB.Recordset

'ComboBoxMesAno.SetFocus
vMesAno = Format(ComboBoxMesAno.Text, "m/d/yyyy")
    
'ComboBoxMatricula.SetFocus
vMatricula = ComboBoxMatricula.Text

'Caminho e nome do arquivo de dados
SourcePath = ThisWorkbook.FullName

If Trim(vMesAno) = "" And Trim(vMatricula) = "" Then
    MsgBox ("Preencha o campo Mes/Ano ou Matricula")
Else
    If Val(Application.Version) < 12 Then
        sConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & SourcePath & Arquivo & ";" & _
                "Extended Properties=""Excel 8.0;HDR=Yes"";"
    Else
        sConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & SourcePath & Arquivo & ";" & _
                "Extended Properties=""Excel 12.0 macro;HDR=Yes"";"
    End If
    
    Set Comd = New ADODB.Connection
    Set rst = New ADODB.Recordset
    Comd.Open sConn
    
    Sql = "SELECT * FROM [BANCO_DADOS$] where Mes_Ano = #" & vMesAno & "# and Matricula = " & vMatricula & ";"
    rst.Open Sql, Comd

    If rst.EOF And rst.BOF Then
        MsgBox ("não Há registo com os parametros inseridos" & vbCrLf & _
                "Mes_Ano = " & Format(CDate(vMesAno), "mmm/yyyy") & vbCrLf & _
                "NifCliente = " & vMatricula)
    Else
        With rst
            'TextBoxNomeConsumidor.SetFocus
            TextBoxNomeConsumidor.Text = Empty & !Nome_do_Consumidor 'o empty serve para eliminar o erro se o valor for nulo.
                    
            'TextBoxHidrometro.SetFocus
            TextBoxHidrometro.Text = Empty & !Hidrometro ' senão utilizassemos o comando With seria assim « txtContactoCliente.Text = Empty & rst!ContactoCliente»
                    
            'TextBoxDataLeituraAnterior.SetFocus
            TextBoxDataLeituraAnterior.Text = Empty & !Data_Leitura_Anterior
                    
            'TextBoxLeituraAnterior.SetFocus
            TextBoxLeituraAnterior.Text = Empty & !Leitura_Anterior
        End With
    End If
    Comd.Cancel
    Set rst = Nothing
    Set Comd = Nothing
End If
End Sub
 
Postado : 24/11/2014 3:13 pm
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa noite, rlm.

Mais uma vez muito obrigado por dispor e ver meu arquivo e pela ajuda.
Testei aplicação em alguns computadores e funcionou perfeito.
Vou continuar desenvolvendo aplicação e assim que pronto posto aqui no fórum.

 
Postado : 24/11/2014 9:49 pm
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa tarde, Alexandre.

Realizei uma alteração na exibição do ComboBox do " Mês / Ano " para exibir no formato "JAN/2013" esta carregando normal todos os Meses e a Matricula de Acordo com o ComboBox " Mes / Ano " dependendo do mês selecionado da erro, exemplo o mês de fevereiro quando vou consultar esta apresentando o seguinte erro:

Depois do erro ele direciona para a seguinte linha:

Arquivo:

Gostaria mais uma vez se sua ajuda.

 
Postado : 25/11/2014 2:06 pm
(@rlm)
Posts: 0
New Member
 

A "manipulação" da exibição pode ser obtida alterando na rotina que carrega os dados do combo (CarregaCategorias), o trecho conforme abaixo:

For Each Value In Area
     ComboBoxMesAno.AddItem Format(CDate(Value), "mmm-yyyy")
Next Value

Contudo essa modificação acarretará também em modificações em vários outros trechos do código
Por exemplo:
na rotina CarregaProdutos:

If .Cells(linha, colunaCategoria).Value = CDate(Categoria) Then

a variavel VmesAno é mais uma que precisa ser tratada

 
Postado : 25/11/2014 2:13 pm
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa tarde, rlm.

Essa Variável já esta tratada

'ComboBoxMesAno.SetFocus
vMesAno = Format(ComboBoxMesAno.Text, "MMM/YYYY")
 
Postado : 25/11/2014 2:18 pm
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa noite, rlm.

Consegui contornar o erro da seguinte forma:

Declarei as variáveis:

Dim vMes As String, vMatricula As String, vAno As String

Recebendo os valores:

vMes = Format(ComboBoxMesAno.Text, "MM")

vAno = Format(ComboBoxMesAno.Text, "YYYY")
    
vMatricula = ComboBoxMatricula.Text

E por fim acrescentei mais um critério no meu where:

Sql = "SELECT * FROM [BANCO_DADOS$] where Month(Mes_Ano) = " & vMes & " and year(Mes_Ano) = " & vAno & " and Matricula = " & vMatricula & ";"

A principal não esta apresentando erro, mas vou realizar novos teste.

 
Postado : 25/11/2014 9:22 pm
(@rlm)
Posts: 0
New Member
 

Como disse, é preciso tratar o texto da combo.
Ao utilizar

'ComboBoxMesAno.SetFocus
vMesAno = Format(ComboBoxMesAno.Text, "MMM/YYYY")

O retorno será Fev/2013 (supondo que tenha selecionado Fev/2013
Porem o Banco de dados espera 01/02/2013
Então o tratamento seria:

vMesAno = Format(CDate(ComboBoxMesAno.Text), "mm/dd/yyyy")

Porque mm/dd/yyyy --> SQL/VBA interpreta melhor a data no padrão americano

 
Postado : 25/11/2014 9:36 pm
Página 1 / 2