Função VBA para bus...
 
Notifications
Clear all

Função VBA para busca no SQL Server

7 Posts
3 Usuários
0 Reactions
1,593 Visualizações
(@jhoe1205)
Posts: 5
Active Member
Topic starter
 

Bom dia senhores, estou começando minha participação no fórum hoje.

Tenho uma planilha de Excel que busca em um banco SQL Server, os dados das contas telefônicas, montei uma função VBA mas esta está apresentando o seguinte erro:
"Erro em tempo de execução '9'"
"Subscrito fora do intervalo" e aponta a linha "With Worksheets("Importar").ListObjects(1)" no código mostrado a baixo.

Sub ImportaTarifador()
    
    Dim sql, DataI, DataF As String
    
    Dim Conexao As ADODB.Connection
    Set Conexao = New ADODB.Connection
    DiaI = Right(Names("DiaInicial").Value, Len(Names("DiaInicial").Value) - 1)
    DiaF = Right(Names("DiaFinal").Value, Len(Names("DiaFinal").Value) - 1)
    
    DataI = DiaI & "/" & Range("E4").Value & "/" & Range("h4").Value
    
    If Range("E4").Value = 12 Then
        DataF = 1 & "/" & DiaF & "/" & Range("h4").Value + 1
    Else
        DataF = DiaF & "/" & Range("e4").Value + 1 & "/" & Range("h4").Value
    End If
    
    sql = "SELECT L.datahora, L.ramal, L.nrodisc, L.durminutos, L.DURSEGUNDOS,    L.VALORCUSTO, R.CODCENCUS AS SETOR  FROM TARLIGACOES L INNER JOIN TARCADRAMAL R ON L.RAMAL = R.RAMAL WHERE L.datahora BETWEEN '?Inicial' AND    '?Final 23:59:59' GROUP BY L.datahora, L.ramal, L.nrodisc, L.durminutos, L.DURSEGUNDOS, L.VALORCUSTO, R.CODCENCUS ORDER BY L.DATAHORA, L.RAMAL"
    'sql = "SELECT L.datahora, L.ramal, L.nrodisc, cast(L.durminutos AS varchar(3))    + ':' + cast(L.DURSEGUNDOS AS varchar(3)) AS DURACAO,    L.VALORCUSTO, R.CODCENCUS AS SETOR  FROM dah.TARLIGACOES L INNER JOIN DAH.TARCADRAMAL R ON L.RAMAL = R.RAMAL WHERE L.datahora BETWEEN '4/11/2007' AND    '5/10/2007 23:59:59' GROUP BY L.datahora, L.ramal, L.nrodisc, L.durminutos, L.DURSEGUNDOS, L.VALORCUSTO, R.CODCENCUS ORDER BY L.DATAHORA, L.RAMAL"
    
    sql = Replace(sql, "?Inicial", DataI)
    sql = Replace(sql, "?Final", DataF)
    
    Debug.Print sql
        
    With Worksheets("Importar").ListObjects(1)
        .ShowTotals = False
        .Range.AutoFilter Field:=1
        .Range.AutoFilter Field:=2
        .Range.AutoFilter Field:=3
        .Range.AutoFilter Field:=4
        .Range.AutoFilter Field:=5
        .Range.AutoFilter Field:=6
        .Range.AutoFilter Field:=7
        
        If .ListRows.Count > 0 Then
            .DataBodyRange.Delete
        End If
        
    End With
    
    With Conexao
        '.Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=XXX; Password=XXX;Initial Catalog=windes4;Data Source=SRV-DB1;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=WKSFIN01;Use Encryption for Data=False;Tag with column collation when possible=False"
        .Open
        Set Rs = .Execute(sql)
        Worksheets("Importar").Range("B8").CopyFromRecordset Rs
    End With
    
     If Worksheets("Importar").ListObjects(1).ListRows.Count > 0 Then
         With Worksheets("Importar").ListObjects(1).DataBodyRange
            .Columns(1).NumberFormat = "dd/mm/yy hh:mm;@"
            .Columns(1).HorizontalAlignment = xlCenter
            .Columns(2).NumberFormat = "#,##0_);(#,##0)"
            .Columns(2).HorizontalAlignment = xlCenter
            .Columns(4).HorizontalAlignment = xlCenter
            .Columns(9).NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""??_);_(@_)"
            .Columns(7).Replace _
                    What:="1", Replacement:="2570", _
                    SearchOrder:=xlByColumns, LookAt:=xlWhole
                    
            .Columns(8).FormulaR1C1 = _
                "=IF(RC[-1]<>"""",VLOOKUP(RC[-1],Centros,3,FALSE),"""")"
        End With
        
        Worksheets("Importar").ListObjects(1).ShowTotals = True
        
    End If
    
    Set Rs = Nothing
    Conexao.Close
    Set Conexao = Nothing

End Sub

Já fiz diversos testes, como mudar a string de conexão do banco, mudar o nome da planilha mudar o usuário de conexão dentre várias outras mas nada funcionou.

Agradeço imensamente a quem puder ajudar.

 
Postado : 07/05/2014 6:44 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

jhoe1205,

Bom Dia!

Você já verificou se o nome da aba "Importar" está escrito corretamente conforme está no código (sem espaços em branco, iniciando com maiúscula, etc)? Esse é um erro característico desse tipo de situação...

A priori fica meio difícil saber exatamente o que possa ser sem ter os dados. Para melhor ajudar, compacte seus arquivos, ou um exemplo (BD e Excel) com ZIP e anexe o mesmo aqui. Assim temos condição de depurar e descobrir o erro.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 07/05/2014 7:20 am
(@jhoe1205)
Posts: 5
Active Member
Topic starter
 

Bom dia Wagner Morel, obrigado pela resposta.

Sim esta foi uma das tentativas. Quanto a enviar os arquivos a planilha é bem possível enviar, mas a base fica um pouco complicado por se tratarem de informações de clientes.

De qualquer forma estou enviando a planilha que estou usando para ver se alguém tem uma luz pra me passar.

Dados que eu acho que são úteis:

SQL Server 2008
Microsoft Office 2003

Forte abraço e desde já agradeço a todos

 
Postado : 07/05/2014 8:23 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Considerando que o Erro informado é na referencia à planilha e, creio eu que, ao referir planilha utilizando "ListObjects" algumas propriedades ficam, digamos, nulas.
Experimente utilizar assim: With Worksheets("Importar").Sheets(1)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/05/2014 8:47 am
(@jhoe1205)
Posts: 5
Active Member
Topic starter
 

Ola Reinaldo, obrigado pela resposta.

Com esta sintaxe o erro apresentado é "Erro em tempo de execução '438' " "O objeto não aceita esta propriedade ou método"

Obrigado desde já mestre

 
Postado : 07/05/2014 9:04 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

jhoe1205,

Se não der certo a dica do Reinaldo e se for anexar os arquivos, faça um pequeno exemplo da base de dados com dados fictícios.

Se ajudar, você pode dar uma olhada no tópico abaixo, onde coloquei uma conexão simples, via ADO, com BD feito em Access, que faz consulta a dados de tabelas distintas.

viewtopic.php?f=21&t=9273&p=48628&hilit=Access#p48628

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 07/05/2014 9:05 am
(@jhoe1205)
Posts: 5
Active Member
Topic starter
 

Wagner Morel, mais uma vez obrigado e parabéns pelo exemplo.

Entendi a forma de conexão e como faz a consulta no banco, inclusive é uma conexão ADO que estou usando para fazer a importação dos dados, oque acontece no meu caso é que ela não está trazendo os dados para a planilha em função de algum erro no código que escrevi.

Já tentei usuários de banco diferentes, outras sintaxes de conexão e pesquisa, já tentei refazer a tabela do zero e já testei a consulta SQL direto no server.

Está tudo funcionando a contento, porém o erro persiste. Vou fazer uma amostra da base a anexá-la aqui.

Obrigado a todos

 
Postado : 07/05/2014 9:30 am