locked
Ajuda com Recordset RRS feed

  • Pergunta

  • Bom dia Pessoal,

    Sou um curioso em VBA e estou caminhando em meus primeiros códigos e preciso de ajuda agora. Preciso gerar um relatório que terá por base uma outra planilha como BD, a idéia e extrair os dados com uma consulta SQL e preencher uma outra planilha que eu chamo de "mascara"... Com pesquisas aqui no próprio forum cheguei a construir um código usando RECORDSET que quase funcionou. Aparentemente ele abre a base, filtra os dados com a consulta, porém nao preenche os campos. Aparece uma mensagem, logo que o código chega na linha [oRs.MoveFirst] assim "Operaçao nao permitida quando o objeto está fechado"

    Como esse código que montei é na verdade um FRANKEINSTEIN de um monte de outros códigos acho que fiz alguma ____ e nao consigo identificar onde... Abaixo deixo o código na integra para que se alguem puder, de uma força, blz...

    Dim oConn As ADODB.Connection
    Dim oCmd As ADODB.Command
    Dim oRS As ADODB.Recordset
    Dim oConn2 As ADODB.Connection
    Dim oCmd2 As ADODB.Command
    Dim oRS2 As ADODB.Recordset
    Dim objExcel
    Dim objWorkBook
    Dim sREp As String
    Dim REPRESENTANTE As String
    Dim HoraInicial
    Dim horaFim
    Dim NOME As String
    Dim REGIAO
    Dim linha As Integer
    Dim coluna As Integer
     

    Public Sub MinhaConexao()

    HoraInicial = Time

    Set oConn = New ADODB.Connection
    oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                         "Data Source=M:\Planilhas\Mensais\2010\TOP 10\fev2010.xls;" & _
                         "Extended Properties=""Excel 8.0;HDR=Yes;"";"
                        

    ' cria o objecto command e define a conexao ativa
    Set oCmd = New ADODB.Command
    oCmd.ActiveConnection = oConn

    sREp = 2

    While sREp <> ""

           

            REPRESENTANTE = Plan1.Range("A" & sREp).Value
            NOME = Plan1.Range("B" & sREp).Value
            REGIAO = Plan1.Range("C" & sREp).Value
           
            Application.DisplayStatusBar = True
            Application.StatusBar = "O PROCESSO FOI INICIADO AS " & HoraInicial & " FORMATANDO O RELATÓRIO DO REPRESENTANTE: " & NOME
        
                 ' abre a planilha
            oCmd.CommandText = "SELECT * from [clientes$] WHERE CODIGO = " & "'" & REPRESENTANTE & "'"
           
            ' cria o recordset com os dados
            Set oRS = New ADODB.Recordset
            oRS.Open oCmd, , adOpenKeyset, adLockOptimistic
           
           
           
            Set objExcel = CreateObject("EXCEL.APPLICATION")
            Set objWorkBook = objExcel.Workbooks.Open("M:\Planilhas\Mensais\2010\TOP 10\Mascara.xls")
           
           
            'exibe os dados
            preenche_campos
           
            'IMPRIME OS RELATÓRIOS
            'objExcel.ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
                   
            objWorkBook.SaveAs ("M:\Planilhas\Mensais\2010\TOP 10\02_Fevereiro\" & REGIAO & " - " & NOME & ".xls")
            objWorkBook.Close True
           
                
            Set objWorkBook = Nothing
            Set objExcel = Nothing



        sREp = sREp + 1

    Wend


    horaFim = Time

    MsgBox "o processo iniciou as " & HoraInicial & vbCrLf & "e terminou as " & horaFim, vbInformation, "Fabrica de relatórios - Total Química"

    Application.DisplayStatusBar = False


    End Sub

    Private Sub preenche_campos()

    Dim iCount As Integer
    Dim oRS As ADODB.Recordset

     Set oRS = New ADODB.Recordset

     oRS.MoveFirst
     
     iCount = oRS.RecordCount
       
     iCount = 7
     

     
     Do Until oRS.EOF
       
       objExcel.Range("B1").Value = oRS(1) 'REPRESENTANTE
        objExcel.Range("B2").Value = oRS(2) 'REGIÃO
        objExcel.Range("I1").Value = oRS(3) 'GERENTE
        objExcel.Range("G2").Value = oRS(4) 'UF
        objExcel.Range("I2").Value = oRS(5) 'MICRO REGIÃO
        objExcel.Range("N2").Value = oRS(6) 'CANAL
        objExcel.Range("A" & iCount).Value = oRS(7) 'CLIENTE
        objExcel.Range("B" & iCount).Value = oRS(20) & " - " & oRS(21)     'CIDADE / UF
        objExcel.Range("C" & iCount).Value = oRS(8) 'JANEIRO
        objExcel.Range("D" & iCount).Value = oRS(9) 'FEVEREIRO
        'objExcel.Range("E" & iCount).Value = oRS(10) 'MARÇO
        'objExcel.Range("F" & iCount).Value = oRS(11) 'ABRIL
        'objExcel.Range("G" & iCount).Value = oRS(12) 'MAIO
        'objExcel.Range("H" & iCount).Value = oRS(13) 'JUNHO
        'objExcel.Range("I" & iCount).Value = oRS(14) 'JULHO
        'objExcel.Range("J" & iCount).Value = oRS(15) 'AGOSTO
        'objExcel.Range("K" & iCount).Value = oRS(16) 'SETEMBRO
        'objExcel.Range("L" & iCount).Value = oRS(17)  'OUTUBRO
        'objExcel.Range("M" & iCount).Value = oRS(18)  'NOVEMBRO
        'objExcel.Range("N" & iCount).Value = oRS(19)  'DEZEMBRO
       
        oRS.MoveNext
        iCount = iCount + 1
       
        oRS.MoveNext
        iCount = iCount + 1

    Loop

    Positivacao

    End Sub

    ***********

    Se alguem desejar eu mando as fontes de dados por email....

    Desde já agradeço.


    terça-feira, 9 de novembro de 2010 10:32

Respostas

  • Zanqueta,

    Na rotina preenche_campo você está abrindo um novo recordset e não está utilizando o recordset que foi aberto na rotina MinhaConexao.

    Tente remover as linhas:

    Dim oRS As ADODB.Recordset 

    Set oRS = New ADODB.Recordset

     


    Rafael Gomes dos Santos Consultor de Informática MCAS - Microsoft Certified Application Specialist rafael.gomes.santos@gmail.com https://sites.google.com/site/pfntec/
    • Marcado como Resposta Zanqueta quinta-feira, 18 de novembro de 2010 18:31
    • Não Marcado como Resposta Zanqueta quinta-feira, 18 de novembro de 2010 18:31
    • Marcado como Resposta Zanqueta quinta-feira, 18 de novembro de 2010 18:32
    terça-feira, 9 de novembro de 2010 12:14