ERRO AO EXPORTAR PARA O EXCEL PELA 2ª VEZ

FFABIOG 14/09/2015 13:57:07
#451385
Senhores,

Criei um comando para exportar para o Excel a minha tabela “rs”.
Até ai está tudo certo, funcionou perfeitamente.

Porem ao clicar pela 2ª vez no botão gera o erro abaixo.

run-time error [ô]1004[ô] method [ô]range[ô] of object[ô]_global[ô] failed

Segue o código.
Private Sub cmd_excel_Click()

Dim FILTRO As String

connectdb

If cbc_for.Text <> [Ô][Ô] Then
FILTRO = FILTRO & [Ô]and FOR = [ô][Ô] & cbc_for.Text & [Ô][ô][Ô]
End If

rs.Open [Ô]select DATA_V,FOR from CAD_CP WHERE 1=1 [Ô] & FILTRO & [Ô]order by cod asc[Ô], db, 3, 3

Set EApp = CreateObject([Ô]excel.application[Ô])
Set EwkB = EApp.Workbooks.Add
Set EwkS = EwkB.Sheets(1)

EApp.Application.Visible = True

Range([Ô]B5[Ô]).CopyFromRecordset rs

Set rs = Nothing
db.Close: Set db = Nothing

End Sub


Em anexo imagem do mensagem de erro.
TUNUSAT 14/09/2015 16:08:05
#451392
FFABIOG,

Veja isso:

=================================================================================
http://stackoverflow.com/questions/12174723/run-time-error-1004-method-range-of-object-global-failed
Run-time error [ô]1004[ô] : Method [ô]Range[ô] of object[ô]_Global[ô] failed

When you reference Range like that it[ô]s called an unqualified reference because you don[ô]t specifically say which sheet the range is on. Unqualified references are handled by the [Ô]_Global[Ô] object that determines which object you[ô]re referring to and that depends on where your code is.

If you[ô]re in a standard module, unqualified Range will refer to Activesheet. If you[ô]re in a sheet[ô]s class module, unqualified Range will refer to that sheet.

inputTemplateContent is a variable that contains a reference to a range, probably a named range. If you look at the RefersTo property of that named range, it likely points to a sheet other than the Activesheet at the time the code executes.

The best way to fix this is to avoid unqualified Range references by specifying the sheet. Like
With ThisWorkbook.Worksheets([Ô]Template[Ô])
.Range(inputTemplateHeader).Value = NO_ENTRY
.Range(inputTemplateContent).Value = NO_ENTRY
End With


Adjust the workbook and worksheet references to fit your particular situation.
=================================================================================

[][ô]s,
Tunusat.
CHDSSANTOS 16/09/2015 08:56:19
#451446
Resposta escolhida
FFABIOG,

Apenas como sugestão, não seria melhor gerar um arquivo do tipo CSV?
Estes arquivos são associados diretamente ao Excel por padrão e seu código não precisaria [Ô]setar[Ô] o aplicativo Excel, seria basicamente o mesmo cuidado que você teria para gerar um TXT, mantendo, é claro, o padrão de dados do CSV separado por ponto e virgula.

Acho que seria algo mais ou menos assim:

Dim TextoLinha As String
Dim iArq As Long

iArq = FreeFile
Open Diretorio & [Ô]\NOME_ARQUIVO.csv[Ô] For Output As iArq


rs.Open [Ô]select DATA_V, FOR from CAD_CP where 1=1 [Ô] & FILTRO & [Ô]order by cod asc[Ô], db, 3, 3

While Not rs.EOF
TextoLinha = [Ô][Ô][Ô][Ô] & rs(0) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(1) & [Ô][Ô][Ô][Ô]
Print #iArq, TextoLinha
rs.MoveNext
Wend

Close #iArq

Set rs = Nothing
db.Close: Set db = Nothing

Nota: talvez seja necessário alguns ajustes no código... sempre me perco no uso das aspas... paciência ai... rsrsrs
FFABIOG 16/09/2015 18:23:51
#451474
CHDSSANTOS

Está gerando erro ao abrir o caminho do csv
CHDSSANTOS 17/09/2015 07:29:10
#451484
FFABIOG,

Desculpe, não informei que na linha:
Open Diretorio & [Ô]\NOME_ARQUIVO.csv[Ô] For Output As iArq
a palavra [Ô]Diretorio[Ô] é uma string que deve receber o caminho de onde salvar o arquivo.

Fiz uma simulação aqui e funcionou normal, segue meu código... adapta para vc e tenta de novo:

---------------------------------------------------------------------------------------------------------------------------------------
Dim TextoLinha As String
Dim iArq As Long
iArq = FreeFile


SQL = [Ô]SELECT dataregistro, horaregistro FROM Tbl1[Ô]
ExecutaComandoSQL [ô]sub de execução da instrução SQL

Open Environ([Ô]UserProFile[Ô]) & [Ô]\Desktop\NOME_ARQUIVO.csv[Ô] For Output As iArq

While Not rs.EOF
TextoLinha = [Ô][Ô][Ô][Ô] & rs(0) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(1) & [Ô][Ô][Ô][Ô]
Print #iArq, TextoLinha
rs.MoveNext
Wend

Close #iArq

FechaBanco [ô]sub para fechar a conexão

---------------------------------------------------------------------------------------------------------------------------------------
FFABIOG 17/09/2015 10:14:36
#451493
CHDSSANTOS


Adaptei o seu código ao meu e funcionou perfeitamente.
O bom seria mesmo exportar para o Excel, assim poderei fazer algumas formatações.

Eu consigo fazer essa mesma exportação só que para o Excel?

Se não for possível, como fazer algumas formatações, tais como: nome do fornecedor, nº do pedido....
Quero deixar nas primeiras linhas essas informações

Segue o código

If Me.txt_data_I.Text <> [Ô][Ô] Then
If Not IsDate(Me.txt_data_I.Text) Then
MsgBox [Ô]Data de inicial inválida.[Ô], vbCritical, [Ô]ATENÇÃO[Ô]
Me.txt_data_I.Text = [Ô][Ô]
Me.txt_data_I.SetFocus
Exit Sub
End If
End If

If Me.txt_data_F.Text <> [Ô][Ô] Then
If Not IsDate(Me.txt_data_F.Text) Then
MsgBox [Ô]Data de final inválida.[Ô], vbCritical, [Ô]ATENÇÃO[Ô]
Me.txt_data_F.Text = [Ô][Ô]
Me.txt_data_F.SetFocus
Exit Sub
End If
End If

Dim FILTRO As String
Dim Item As ListItem
Me.lbl_lista.ListItems.Clear
connectdb

If Me.opt_ven.value = True Then
If txt_data_I.Text <> [Ô][Ô] Then
FILTRO = FILTRO & [Ô] and DATA_V >= #[Ô] & Format(Me.txt_data_I.Text, [Ô]mm/dd/yyyy[Ô]) & [Ô]#[Ô]
End If

If txt_data_F.Text <> [Ô][Ô] Then
FILTRO = FILTRO & [Ô] and DATA_V <= #[Ô] & Format(Me.txt_data_F.Text, [Ô]mm/dd/yyyy[Ô]) & [Ô]#[Ô]
End If
Else
If txt_data_I.Text <> [Ô][Ô] Then
FILTRO = FILTRO & [Ô] and DATA_PGTO >= #[Ô] & Format(Me.txt_data_I.Text, [Ô]mm/dd/yyyy[Ô]) & [Ô]#[Ô]
End If

If txt_data_F.Text <> [Ô][Ô] Then
FILTRO = FILTRO & [Ô] and DATA_PGTO <= #[Ô] & Format(Me.txt_data_F.Text, [Ô]mm/dd/yyyy[Ô]) & [Ô]#[Ô]
End If
End If

If cbc_cli.Text <> [Ô][Ô] Then
FILTRO = FILTRO & [Ô]and CLI = [ô][Ô] & cbc_cli.Text & [Ô][ô][Ô]
End If


If Me.opt_nao_pg.value = True Then
FILTRO = FILTRO & [Ô] and BAN IS NULL or BAN=[ô][ô][Ô]
End If

If Me.opt_pago.value = True Then
FILTRO = FILTRO & [Ô] and BAN<>[ô][ô][Ô]
End If


If Me.opt_ven.value = True Then
rs.Open [Ô]select * from CAD_CR WHERE 1=1 [Ô] & FILTRO & [Ô]order by DATA_V asc,cod asc[Ô], db, 3, 3
Else
rs.Open [Ô]select * from CAD_CR WHERE 1=1 [Ô] & FILTRO & [Ô]order by DATA_PGTO asc,cod asc[Ô], db, 3, 3
End If


[ô] EXPORTAÇÃO PARA O EXCEL
Dim TextoLinha As String
Dim iArq As Long
iArq = FreeFile


Open Environ([Ô]UserProFile[Ô]) & [Ô]\Desktop\pedido.csv[Ô] For Output As iArq

While Not rs.EOF
TextoLinha = [Ô][Ô][Ô][Ô] & rs(0) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(3) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(4) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(5) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(7) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(8) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(11) & [Ô][Ô][Ô][Ô]
Print #iArq, TextoLinha
rs.MoveNext
Wend

Close #iArq

Set rs = Nothing
db.Close: Set db = Nothing
PEGUDO 17/09/2015 10:35:36
#451495
Cara,
Muitos destes problemas com o Excel ocorrem pelo fato de que o VB não fecha o Excel completamente.
Tem muitos anos que eu não trabalho mais com VB6, mas a lógica é esta:

1. Antes de abrir o Excel, o programa faz um loop entre os processos em segundo plano da máquina;
2. Caso encontrasse algum arquivo com proccessName igual a Excel, entra no loop;
3. Se a janela principal deste processo estiver vazia, então Kill() o processo. (Obs. Se o processo estiver com sua janela principal vazia, significa que este processo você pode deletar porque é um processo do seu próprio programa).

Você pode fazer o teste e abrir um arquivo Excel, deixá-lo aberto e rodar o seu programa. Você verá que o seu programa não vai fechar o arquivo Excel porque quando você abre um arquivo Excel, ele é aberto com um nome qualquer, tipo [Ô]Pasta1[Ô], [Ô]Pasta1 - Microsoft Excel[Ô], etc.

Espero ter ajudado.
CHDSSANTOS 17/09/2015 10:54:15
#451497

FFABIOG,

Acredito que neste formato até seja possível salvar o arquivo com a extensão *.xls e em vez de separar as informações por ponto e virgula separar por tabulação (vbtab), mas nunca fiz isso e não posso te afirmar que funcionaria e o quanto isso seria confiável.

Para colocar o cabeçalho de uma maneira simples você pode apenas replicar a linha que roda no while com os nomes de cada campo antes de entrar no loop.


Open Environ([Ô]UserProFile[Ô]) & [Ô]\Desktop\pedido.csv[Ô] For Output As iArq

TextoLinha = [Ô][Ô][Ô][Ô] & [Ô]Coluna 0[Ô] & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & [Ô]Coluna 3[Ô] & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & [Ô]Coluna 4[Ô] & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & [Ô]Coluna 5[Ô] & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & [Ô]Coluna 7[Ô] & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & [Ô]Coluna 8[Ô] & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & [Ô]Coluna 11[Ô] & [Ô][Ô][Ô][Ô]
Print #iArq, TextoLinha

While Not rs.EOF
TextoLinha = [Ô][Ô][Ô][Ô] & rs(0) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(3) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(4) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(5) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(7) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(8) & [Ô][Ô][Ô][Ô] & [Ô];[Ô][Ô][Ô] & rs(11) & [Ô][Ô][Ô][Ô]
Print #iArq, TextoLinha
rs.MoveNext
Wend

Close #iArq
Tópico encerrado , respostas não são mais permitidas