Notifications
Clear all

Contar quantidades de registros do BD Excel x Excel

12 Posts
1 Usuários
0 Reactions
2,707 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Colegas, não sou muito bom em instrução sql, e tentando aprimorar um modelo que estou desenvolvendo me deparei com uma questão que nas pesquisas que fiz, acreditem, não consegui solucionar, encontrei muita coisa para Access mas excel x excel muito pouco, é o seguinte :

Tenho em um Arquivo de Nome Localidades.xls,
uma aba de nome Registros com diversas Colunas com Rotulos e uma das colunas com o Rotulo Bairro que contem vários bairros e se repetem,

o que gostaria é retornar a quantidade de cada Bairro:

A coluna em questão :
Bairro => Rotulo da Coluna
Centro
Af Pena
Centro
Centro
Cruzeiro
Costeira
Cruzeiro

O Resultado seria :
Centro = 3
Af Pena = 1
Cruzeiro = 2
Costeira = 1

Procurei seguir a dica no Tópico abaixo, não sei se é devido ser construida para uso em Access eu não consegui adaptar.
Lembrando que em um form realizo a filtragem normalmente abrindo o BD, mas para contagem não consegui a instrução certa.

Contar quantidades de registros do banco de dados
viewtopic.php?f=10&t=897

Dim sTotal As String

Dim rsCount As ADODB.Recordset
'Esta linhada erro 91 "a variavel do objeto ou variavel do bloco With não foi definada
rsCount.Open "Select Count(Bairro) from [Registros$] where Bairro = 'Centro'"
msgbox "O Total de Regsitros é " & rst(0)

sTotal = "Select Count(Bairro) from [Registros$] where Bairro = 'Centro'"
msgbox "O Total de Regsitros é " & sTotal

Pensei em desconsiderar esta implementação que não é fundamental em meu projeto, mas não vou sossegar se ao menos não souber o que está errado, espero ter conseguido explicar, se for preciso monto um exemplo reduzido e anexo.

[]s

 
Postado : 29/04/2012 5:46 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite!!

Mauro, quem sou eu para poder te ajudar (sem conhecimento Excel e VBA etc).

Mas enquanto as outras feras não responde, eu prefiro que poste um modelo...

att

 
Postado : 29/04/2012 6:23 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bom dia!!
Mauro, tente assim...

Dim rsCount As ADODB.Recordset
'Veja essa linha a baixo e junte ao restante
Set rsCount = CreateObject("ADODB.RecordSet")
 
Postado : 30/04/2012 5:44 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Permitam-me...

Tenho um relatório que é +/- assim:
No ComboBox14 seleciono o Setor, constante em uma coluna do BD, com base no setor definido busca na coluna Atividade os valores distintos em ordem alfabetica e depois conta a quantidade carregando para um ListView, veja:

Sub Atividades()
Me.lblTotal2.Caption = "000"
Dim Db As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim Rs2 As New ADODB.Recordset
Dim sql, SQL2,  MeuStr, MeuStr2
    With Db
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "BaseDados.mdb"
        .Open
    End With
    
    sql = sql & "SELECT DISTINCT Atividade FROM dados WHERE Setor = '" & Me.ComboBox14.Text & "'"

    With Rs
        .ActiveConnection = Db
        .Open sql, Db, adOpenDynamic, _
              adLockBatchOptimistic
    End With
'###########################################################################
   'FORMATANDO O LISTVIEW
    'CRIANDO OS CABEÇALHOS
    Me.ListView1.ListItems.Clear
    Me.ListView1.ColumnHeaders.Clear
    Me.ListView1.View = lvwReport
    Me.ListView1.Gridlines = True
    Me.ListView1.ColumnHeaders.Add , , Me.ComboBox14 '"Nome" '1
    Me.ListView1.ColumnHeaders.Add , , "Total" '2
    
    'DEFININDO A LARGURA DAS COLUNAS
    Me.ListView1.ColumnHeaders(1).Width = 200 '1
    Me.ListView1.ColumnHeaders(2).Width = 40 '2
    
 
    Me.ListView1.FullRowSelect = True
'#######################################################
    
    Do Until Rs.EOF
    '##################################################
    Dim itens As ListItem
    
    'PREENCHENDO O LISTVIEW
        Set itens = Me.ListView1.ListItems.Add(, , Rs("Atividade"))
'#############################################################################
    
    SQL2 = "SELECT COUNT(Atividade) AS TOTAL FROM [dados] WHERE Atividade = '" & Rs("Atividade") & "' AND Setor ='" & Me.ComboBox14.Value & "';"
    
    With Rs2
        .ActiveConnection = Db
        .Open SQL2, Db, adOpenDynamic, _
              adLockBatchOptimistic
    End With
    
        
    If IsNull(Rs2("TOTAL")) Then
    itens.SubItems(1) = 0
    Else
    itens.SubItems(1) = Format(Rs2("TOTAL"), "000")
    End If
  '###########################################################
    
    Rs.MoveNext
    Rs2.Close
    Loop
     Set Rs = Nothing
     Set Rs2 = Nothing
Me.lblTotal2.Caption = Format(ListView1.ListItems.Count, "000")
     Call SomarItens
    ListView1.ListItems(ListView1.ListItems.Count).ForeColor = RGB(46, 55, 254)
    ListView1.ListItems(ListView1.ListItems.Count).Bold = True
End Sub

Mostra um resumo que acho que consigo adaptar, uso Excel + Access. A lógica é a mesma.

 
Postado : 30/04/2012 11:32 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Primeiramente gostaria de chamar a atenção do Mauro por não ter colocado um anexo exemplo para adaptação. :lol: :lol:

Brincadeiras a parte, veja se o anexo resolve...

 
Postado : 30/04/2012 1:06 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Em tempo...

Se quiser preencher diretamente no controle ListView como anunciei.

Private Sub CommandButton1_Click()
Dim Db As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim Rs2 As New ADODB.Recordset

Dim sql, SQL2, Variavel, MeuStr, MeuStr2
Plan2.Range("A2:B100").ClearContents
    With Db
        .Provider = "Microsoft.JET.OLEDB.4.0"
        .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 8.0;"
        .Open
    End With
    
    sql = "SELECT distinct Bairro FROM [Registros$] ;"

    With Rs
        .ActiveConnection = Db
        .Open sql, Db, adOpenDynamic, _
              adLockBatchOptimistic
    End With
'###########################################################################
   'FORMATANDO O LISTVIEW
    'CRIANDO OS CABEÇALHOS
    Me.ListView1.ListItems.Clear
    Me.ListView1.ColumnHeaders.Clear
    Me.ListView1.View = lvwReport
    Me.ListView1.Gridlines = True
    Me.ListView1.ColumnHeaders.Add , , "Bairro" '1
    Me.ListView1.ColumnHeaders.Add , , "Total" '2
    
    'DEFININDO A LARGURA DAS COLUNAS
    Me.ListView1.ColumnHeaders(1).Width = 50 '1
    Me.ListView1.ColumnHeaders(2).Width = 40 '2
    

    Me.ListView1.FullRowSelect = True
'#######################################################

    
    Do Until Rs.EOF
    '##################################################
    Dim itens As ListItem
    
    'PREENCHENDO O LISTVIEW
        Set itens = Me.ListView1.ListItems.Add(, , Rs("Bairro"))
'#############################################################################
    
    SQL2 = "SELECT COUNT(Bairro) AS TOTAL FROM [Registros$] WHERE Bairro = '" & Rs("Bairro") & "';"
  
    With Rs2
        .ActiveConnection = Db
        .Open SQL2, Db, adOpenDynamic, _
              adLockBatchOptimistic
    End With
    
       ' MsgBox Rs("Bairro") & " = " & Rs2("TOTAL")
    If IsNull(Rs2("TOTAL")) Then
    itens.SubItems(1) = 0
    Else
    itens.SubItems(1) = Format(Rs2("TOTAL"), "000")
    End If
    
    Rs.MoveNext
    Rs2.Close
    Loop
    

End Sub
 
Postado : 30/04/2012 2:55 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Alexandre e José desculpem não ter respondido ainda, o dia hoje foi bem corrido, cheguei agora pouco do serviço, e ainda tenho de levantar as 3 da matina para dar apoio a minha equipe no evento do dia do trabalhador.
Não cheguei a postar um anexo porque não deu tempo de montar uma adaptação reduzida do meu modelo, e achei que daria para entender o que pretendo, que é somente contar a quantidade de bairros, uma vez que já utilizo o recordset seria só adaptação para contagem.
De qualquer forma agradeço as ajudas, e se der, amanhã testo as dicas, e independente do resutado monto um modelo e anexo.

[]s

 
Postado : 30/04/2012 8:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite!!

Mauro, quem sou eu para poder te ajudar (sem conhecimento Excel e VBA etc).

Mas enquanto as outras feras não responde, eu prefiro que poste um modelo...

att

Ale, não pense assim, ninguem pode dizer que sabe tudo e muitas vezes o pouco que sabem ajudam muito aos que precisam.
Depois, podemos nos identificar mais com algumas áreas, e necessitamos daqueles que teem experiência ou conhecimento em outras.

Em uma olhada rápida, acrdito que com as dicas ira resolver o meu impasse, mas acrodei a pouco e vou sair para a labuta novamente, se der amanhã faço os testes e posto o resultado.

Gratos amigos.

[]s

 
Postado : 01/05/2012 3:59 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Tentando contribuir

Sub conecta()
'Declaração das variaveis
    Dim Cabecalho As Boolean, szConnect As String, szSQL As String, SourcePath As Variant, Arquivo As String
    Dim rsCon As ADODB.Connection, rsData As ADODB.Recordset
'Informa o Nome do arquivo de dados
    Arquivo = "Localidades.xls"
'Informa o caminho do arquivo de dados
    SourcePath = ThisWorkbook.Path 'ou c:....
'Verifica qual aplicação existente (OK til 2010) e monta conexao
        If Val(Application.Version) < 12 Then
            szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & SourcePath & Arquivo & ";" & _
                        "Extended Properties=""Excel 8.0;HDR=Yes"";"
        Else
            szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                        "Data Source=" & SourcePath & Arquivo & ";" & _
                        "Extended Properties=""Excel 12.0;HDR=Yes"";"
        End If

Set rsCon = New ADODB.Connection
Set rsData = New ADODB.Recordset
'Abre a concexão
    rsCon.Open szConnect

'Total de registros unicos em uma coluna
    szSQL = "Select Count(br1) as Qtde from(Select Distinct(Bairro) as Br1 from [Registros$]);" 'where Bairro = 'Centro');"
rsData.Open szSQL, rsCon ', 0, 1, 1
    MsgBox "O Total de Registros unicos em Bairro é " & rsData(0)
'fecha recordset
    rsData.Close

'Total de registros por nome unico
    szSQL = "Select Bairro, Count(Bairro) from [Registros$] GROUP BY Bairro Having (Bairro='Centro');"
    rsData.Open szSQL, rsCon ', 0, 1, 1
MsgBox "O Total de Registros no Centro é " & rsData(0) & " - " & rsData(1)
'fecha recordset
    rsData.Close

'Retorno qtde repetida de registros
    szSQL = "Select Bairro, Count(Bairro) from [Registros$] GROUP BY Bairro;"
    rsData.Open szSQL, rsCon ', 0, 1, 1
Do Until rsData.EOF
MsgBox "O Total de Registros é " & rsData(0) & " - " & rsData(1)
rsData.MoveNext
Loop

'fecha recordset
    rsData.Close
'fecha conexão
    rsCon.Close
End Sub
 
Postado : 02/05/2012 12:40 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Grande Rei,

Não tinha atentado para o fato dos dados estarem em outro arquivo, mas isso o Mauro tira de letra.

...Tenho em um Arquivo de Nome Localidades.xls

Não conhecia essa possibilidade de verificar a versão, mais uma que aprendi.

Obrigado.

 
Postado : 03/05/2012 12:09 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Com certeza Jose, o mestre Mauro dá aulas na conexão com outro arquivo.

Qto à versão, eu tambem não conhecia, e foi em minhas "andanças" na net; creio que no site OzGrid, porem não tenho certeza; que vi verificar qual a versão, e assim conectar com um "provider" atualizado.
Mas o enfoque da postagem, foi mais pela sintaxe do SQL, já que sua rotina atende perfeitamente o esperado.

 
Postado : 03/05/2012 1:48 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Reinaldo primeiramente grato pela denominação de "Mestre", mas ainda estou longe disto e como citei anteriormente, apesar de lidar com algumas conexões, este recurso em SQL ainda não é o meu forte, por isto solicitei ajuda.

bem interessante a rotina de se verificar a versão e montar a conexão, eu já conhecia as instruções basicas para se verificar a versão mas nunca precisei aliar a uma conexão, valeu pela dica.

Quanto a verificar a versão temos algumas opções, no google encontramos varias formas.

Sub VerificaVersaoExcel ()

If Application.Version = “12.0″ Then
MsgBox “A versão do Excel  é 2007.”
ElseIf Application.Version = “11.0″ Then
MsgBox “A versão do Excel  é 2003.”
ElseIf Application.Version = “8.0″ Then
MsgBox “A versão do Excel é 97.”
End If

End Sub 

Fazendo seu código funcionar em todas as versões de Microsoft Excel
http://www.tomasvasquez.com.br/artigos/ ... versao.htm

Vou deixar só estas, temos varias.

Agora quanto ao meu tópico, agradeço a todos, foi de grande valia, testei e todas me atenderam, e em uma analise mais criteriosa das instruções, para adaptar a rotina que eu ja utilizava, só precisei ajustar poucas instruções, acredito que esta rotina já é conhecida, e ficou da seguinte forma, assim que possível posto um modelo.

Private Sub PopulaBairros()
    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sql As String

    Set conn = New ADODB.Connection
    
    With conn
        .Provider = "Microsoft.JET.OLEDB.4.0"
        .ConnectionString = "Data Source=" & caminhoArquivoDados & ";Extended Properties=Excel 8.0;"
        .Open
    End With

    sql = "SELECT DISTINCT Bairro FROM [Realizados$]" 'Bairro

    Set rst = New ADODB.Recordset
    With rst
        .ActiveConnection = conn
        .Open sql, conn, adOpenDynamic, _
              adLockBatchOptimistic
    End With
    
    'Total de registros por nome unico
    sql = "Select Count(br1) as Qtde from(Select Distinct(Bairro) as Br1 from [Realizados$]);"
    rst.Close
    
    'Retorno qtde repetida de registros
    sql = "Select Bairro, Count(Bairro) from [Realizados$] GROUP BY Bairro;"
    rst.Open sql, conn ', 0, 1, 1
   
    lstBairros.ColumnCount = 2
    lstBairros.ColumnWidths = "3,5 cm;1 cm;"
    
    sCol = 0 'Coluna do ListBox
    
    'Prrenche o ListBox com 2 colunas com o Bairro e a qde de cada um
    Do While Not rst.EOF
        If Not IsNull(rst(0).Value) Then
            lstBairros.AddItem rst(0).Value 'Coluna 1
            lstBairros.List(sCol, 1) = rst(1) 'Coluna 2
            sCol = sCol + 1
        End If
        rst.MoveNext
    Loop

    ' Fecha o conjunto de registros.
    Set rst = Nothing
    ' Fecha a conexão.
    conn.Close

End Sub

Mais uma vez agradeço e até a próxima.

[]s

 
Postado : 03/05/2012 8:58 pm