Usuário com melhor resposta
Ajuda com Recordset

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/terça-feira, 9 de novembro de 2010 12:14