ADODB.CONNECTION - VB6
Bom dia!
Eu estou lendo uma planilha em Excel e jogando para um RecordSet. Até aqui tudo bem!
Quando executo o comando Conn.Open Trim(txtArquivo.Texto), onde o txtArquivo.Texto é o caminho e o nome do arquivo da planilha, este comando acaba abrindo a planilha em modo [Ô]Somente leitura[Ô], o que não quero, pois o usuário precisa ir no gerenciador de tarefa para finalizar está planilha.
Eu somente quero que leia a planilha e jogue para o recordSet, sem precisar abrir a mesma, pois estarei jogando esses dados da Planilha em uma Grid.
Se alguém souber como faço isso
Segue o código que estou utilizando:
Private Sub ProcessarPlanilha()
On Error GoTo MostrarErro
Processando = True
Aguarde Me, fraAguarde, True
Dim RS As New ADODB.Recordset [ô]cria o ponteiro
Dim strSQL As String [ô]variavel para o sql
Dim Conn As New ADODB.Connection
Dim i As Long
Dim Excel As Object
Dim xlw As Object
Set Excel = CreateObject([Ô]Excel.Application[Ô])
OcorreuErro = False
[ô]Abrir o arquivo do Excel em memória
Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))
[ô]verificação se ja existe uma conexão
If Conn.State = 0 Then [ô]se nao existir cria
Conn.Provider = [Ô]Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0[Ô]
Conn.Open Trim(txtArquivo.Texto) [ô]Momento em que abre a planilha como somente leitura
End If
[ô]seta o comando em sql
strSQL = [Ô]SELECT * FROM [Baixas$][Ô]
[ô]prepara o recordset para executar a leitura
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.CursorLocation = adUseClient
[ô]executa o comando sql
RS.Open strSQL, Conn
RS.ActiveConnection = Nothing
If Not xlw Is Nothing Then xlw.Close False
[ô]Excel.ActiveWorkbook.Close
Excel.quit
Set xlw = Nothing
Set Excel = Nothing
Set Conn = Nothing
[ô]verifica se existi algum registro na tabela
If RS.RecordCount = 0 Then
MsgBox [Ô]Não existe dados a serem importados![Ô], vbExclamation, [Ô]Atenção[Ô]
Else
If ValidaColunasGridRS(vsfgListaTitulos, RS) Then
[ô]Joga aqui o RS para uma Grid
End If
End If
Set RS = Nothing
Aguarde Me, fraAguarde, False
Processando = False
vsfgListaTitulos.SetFocus
If OcorreuErro Then
[ô]Se ocorreu algum erro de validação Mostra para o usuário os erros
End If
On Error GoTo 0
Exit Sub
MostrarErro:
Set RS = Nothing
Set Conn = Nothing
Set xlw = Nothing
Set Excel = Nothing
Aguarde Me, fraAguarde, False
Processando = False
Dim CodigoErro As Long
CodigoErro = Err.Number
If Abs(CodigoErro) > 1000 Then
CodigoErro = &H10000 - (-CodigoErro Mod &H10000)
End If
If (CodigoErro = 16389) Then
MsgBox [Ô]Não foi encontrado uma planilha com o nome: Baixas![Ô], vbExclamation, [Ô]Importação Baixas Receber[Ô]
Else
Call MsgBox([Ô]Ocorreu erro no Sistema Direct. [Ô] _
& vbCrLf & [Ô]Método: ProcessarPlanilha[Ô] _
& vbCrLf & [Ô]Número do erro: [Ô] & Err.Number _
& vbCrLf & [Ô]Descricão do erro: [Ô] & Err.Description, vbCritical, [Ô]Sistema Direct[Ô])
End If
End Sub
Eu estou lendo uma planilha em Excel e jogando para um RecordSet. Até aqui tudo bem!
Quando executo o comando Conn.Open Trim(txtArquivo.Texto), onde o txtArquivo.Texto é o caminho e o nome do arquivo da planilha, este comando acaba abrindo a planilha em modo [Ô]Somente leitura[Ô], o que não quero, pois o usuário precisa ir no gerenciador de tarefa para finalizar está planilha.
Eu somente quero que leia a planilha e jogue para o recordSet, sem precisar abrir a mesma, pois estarei jogando esses dados da Planilha em uma Grid.
Se alguém souber como faço isso
Segue o código que estou utilizando:
Private Sub ProcessarPlanilha()
On Error GoTo MostrarErro
Processando = True
Aguarde Me, fraAguarde, True
Dim RS As New ADODB.Recordset [ô]cria o ponteiro
Dim strSQL As String [ô]variavel para o sql
Dim Conn As New ADODB.Connection
Dim i As Long
Dim Excel As Object
Dim xlw As Object
Set Excel = CreateObject([Ô]Excel.Application[Ô])
OcorreuErro = False
[ô]Abrir o arquivo do Excel em memória
Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))
[ô]verificação se ja existe uma conexão
If Conn.State = 0 Then [ô]se nao existir cria
Conn.Provider = [Ô]Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0[Ô]
Conn.Open Trim(txtArquivo.Texto) [ô]Momento em que abre a planilha como somente leitura
End If
[ô]seta o comando em sql
strSQL = [Ô]SELECT * FROM [Baixas$][Ô]
[ô]prepara o recordset para executar a leitura
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.CursorLocation = adUseClient
[ô]executa o comando sql
RS.Open strSQL, Conn
RS.ActiveConnection = Nothing
If Not xlw Is Nothing Then xlw.Close False
[ô]Excel.ActiveWorkbook.Close
Excel.quit
Set xlw = Nothing
Set Excel = Nothing
Set Conn = Nothing
[ô]verifica se existi algum registro na tabela
If RS.RecordCount = 0 Then
MsgBox [Ô]Não existe dados a serem importados![Ô], vbExclamation, [Ô]Atenção[Ô]
Else
If ValidaColunasGridRS(vsfgListaTitulos, RS) Then
[ô]Joga aqui o RS para uma Grid
End If
End If
Set RS = Nothing
Aguarde Me, fraAguarde, False
Processando = False
vsfgListaTitulos.SetFocus
If OcorreuErro Then
[ô]Se ocorreu algum erro de validação Mostra para o usuário os erros
End If
On Error GoTo 0
Exit Sub
MostrarErro:
Set RS = Nothing
Set Conn = Nothing
Set xlw = Nothing
Set Excel = Nothing
Aguarde Me, fraAguarde, False
Processando = False
Dim CodigoErro As Long
CodigoErro = Err.Number
If Abs(CodigoErro) > 1000 Then
CodigoErro = &H10000 - (-CodigoErro Mod &H10000)
End If
If (CodigoErro = 16389) Then
MsgBox [Ô]Não foi encontrado uma planilha com o nome: Baixas![Ô], vbExclamation, [Ô]Importação Baixas Receber[Ô]
Else
Call MsgBox([Ô]Ocorreu erro no Sistema Direct. [Ô] _
& vbCrLf & [Ô]Método: ProcessarPlanilha[Ô] _
& vbCrLf & [Ô]Número do erro: [Ô] & Err.Number _
& vbCrLf & [Ô]Descricão do erro: [Ô] & Err.Description, vbCritical, [Ô]Sistema Direct[Ô])
End If
End Sub
Cara, nunca trabalhei com Excel e ADO. Não sei se é natural nesse caso, sempre abrir como somente leitura. Podemos tentar setar a propriedade Mode do objeto Connection para Escrita e Leitura. Talvez dê certo.
A propriedade Mode:
Especifica as permissões da conexão.
Alguns dos valores mais habituais que podemos atribuir são:
1 Estabelece permissão só de Leitura
2 Estabelece permissão só de Escritura
3 Estabelece permissão de Leitura/Escritura
fonte:http://www.criarweb.com/artigos/objeto-connection-propriedades-e-metodos.html
Exemplo:
O trecho especÃfico ficaria assim:
A propriedade Mode:
Especifica as permissões da conexão.
Alguns dos valores mais habituais que podemos atribuir são:
1 Estabelece permissão só de Leitura
2 Estabelece permissão só de Escritura
3 Estabelece permissão de Leitura/Escritura
fonte:http://www.criarweb.com/artigos/objeto-connection-propriedades-e-metodos.html
Exemplo:
O trecho especÃfico ficaria assim:
[ô]verificação se ja existe uma conexão
If Conn.State = 0 Then [ô]se nao existir cria
Conn.Provider = [Ô]Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0[Ô]
Conn.Mode = 3
Conn.Open Trim(txtArquivo.Texto) [ô]Momento em que abre a planilha como somente leitura
End If
Ele abre em somente leitura porque antes de abrir com o ADO, você abre a planilha usando um objeto do excel, nessa linha:
Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))
Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))
Obrigado pelas ajudas, mas não deram certos.
O que reparei foi o seguinte agora, quando executo o comando [Ô]Conn.Open Trim(txtArquivo.Texto)[Ô] ele somente está abrindo a planilha se ja tiver uma planilha qualquer aberta (ou o excel aberto sem nenhuma planilha). Caso o excel já NÃO esteja sendo executando ao executar o comando a minha planilha não é aberta
O que reparei foi o seguinte agora, quando executo o comando [Ô]Conn.Open Trim(txtArquivo.Texto)[Ô] ele somente está abrindo a planilha se ja tiver uma planilha qualquer aberta (ou o excel aberto sem nenhuma planilha). Caso o excel já NÃO esteja sendo executando ao executar o comando a minha planilha não é aberta
é acho que o problema está aqui veja
tente isso
[ô]Abrir o arquivo do Excel em memória
Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))
[ô]verificação se ja existe uma conexão
If Conn.State = 0 Then [ô]se nao existir cria
Conn.Provider = [Ô]Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0[Ô]
Conn.Open Trim(txtArquivo.Texto) [ô]Momento em que abre a planilha como somente leitura
End If
tente isso
[ô]verificação se ja existe uma conexão
If Conn.State = 0 Then [ô]se nao existir cria
Conn.Provider = [Ô]Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0[Ô]
Conn.Open Trim(txtArquivo.Texto) [ô]Momento em que abre a planilha como somente leitura
Else
[ô]Abrir o arquivo do Excel em memória
Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))
End If
MARCELO-TREZE se eu não executar o comando [Ô]Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))[Ô] antes de [Ô]Coon.Open[Ô] o vb6 da Run-Timer-Error
então coloque dentro do if assim
If Conn.State = 0 Then [ô]se nao existir cria
Set xlw = Excel.Workbooks.Open(Trim(txtArquivo.Texto))
Conn.Provider = [Ô]Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0[Ô]
Conn.Open Trim(txtArquivo.Texto) [ô]Momento em que abre a planilha como somente leitura
End If
Tópico encerrado , respostas não são mais permitidas