Notifications
Clear all

[Resolvido] output para um arquivo texto

15 Posts
4 Usuários
2 Reactions
2,784 Visualizações
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

bom dia. uma explicação básica: estou fazendo um script que faz uso de uma matriz   linha(1), linha(2), pelo fato que eu preciso jogar as linhas numa ordem fixa num arquixo xml. enfim, se a janela de verificação imediata funcionasse sem limite, eu não precisaria disso, pois, no lugar de

linha(10) = "" e

For n = 1 To 516
Worksheets("xml").Cells(n, 1).Value = linha(n)

eu colocaria

debug.print  

e copiaria as linhas direto da janela de verificação para colar no arquivo. porque é muito cansativo manipular tantas variáveis e mudar o número dentro delas. uma linha nova tem que alterar o número de todas as outras variáveis posteriores (n + 1)

porém, a janela de verificação tem um limite de 200 linhas a serem mostradas.

pois bem, tem alguma forma de eu escrever no script apenas

"

 

e o script escrever essas linhas, na ordem, num arquivo txt?

na verdade, não adiantaria só copiar e colar as linhas, teria que substituir o comando debug.print, ou então eu perderia os loops que possuo. Ex:

For y = 13 To 17
If Worksheets("espelho").Cells(y, 5).Value <> 0 Then
Debug.Print "linha(" & x & ") = <pcoItem>"
x = x + 1
Debug.Print "linha(" & x & ") = "; "<numSeqItem>" & i & "</numSeqItem>"
x = x + 1

 

 
Postado : 10/09/2020 11:50 am
(@jvalq)
Posts: 5
Active Member
 

Boa tarde!

Adaptei o seu código para exportar para um arquivo xml:

Sub ExportarXML()
Dim Arquivo As String
Dim y As Long
Dim x As Long
Dim i As Long

Arquivo = "E:\Teste.xml"
Open Arquivo For Output As #1

For y = 13 To 17
If Worksheets("espelho").Cells(y, 5).Value <> 0 Then
Print #1, "linha(" & x & ") = <pcoItem>"
x = x + 1
Print #1, "linha(" & x & ") = "; "<numSeqItem>" & i & "</numSeqItem>"
x = x + 1
End If
Next
Close
End Sub

Abraço

 
Postado : 10/09/2020 2:49 pm
cimerio reacted
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

deu certo.

por enquanto, muito obrigado.

 
Postado : 10/09/2020 3:30 pm
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

jvalq, amigos, funcionou mas não tudo.

o codigo só escreve 291 linhas. na metade desta última, ele paralisa.

realmente, é muito código, mas xml é assim mesmo.

meu cabeçalho está assim

'Dim f As Long
Dim file As String
Dim x
f = FreeFile
'file = "C:\macro\Testes"
Open file For Output As #f

eu mudei Dim f As Long para LongPtr e continuou o problema. tirei a declaração f e continou o limite de 291 linhas.
o que posso fazer?
 
Postado : 11/09/2020 11:38 am
(@jvalq)
Posts: 5
Active Member
 

Boa tarde!

Freefile: Retorna um inteiro que representa o próximo número de arquivo disponível para uso pela instrução Open.

FreeFile [(rangenumber)]

O argumento opcional rangenumber é uma Variant que especifica o intervalo a partir do qual o próximo número de arquivo livre deve ser retornado. Especifique 0 (padrão) para retornar um número de arquivo no intervalo 1–255, inclusive. Especifique 1 para retornar um número de arquivo no intervalo 256–511. 

Fonte: https://docs.microsoft.com/pt-br/office/vba/language/reference/user-interface-help/freefile-function

Freefile se refere a um número de arquivo e, no caso eu coloquei #1 direto no código por que pensei que a saída era de UM arquivo XML.

A linha, no código que enviei, é a variável "x" que declarei como Long ( intervalo de -2.147.483.648 a 2.147.483.647).

 

Abraço

 
Postado : 11/09/2020 12:12 pm
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

jvalq eu não entendi muito o que isso quer dizer.

a saída é só um arquivo, é sempre o mesmo arquivo. mas ele só escreve 291 linhas dentro dele.

eu não sei porque o fórum cortou texto do meu primeiro post. isso atrapalhou a compreensão. 

tive que alterar os nomes das variáveis que voce sugeriu para adequar a certos padroes obrigatorios. talvez eu misturei exemplos sem saber.

deixa eu colocar como está o código neste momento, sem comentarios e variaveis não mais usadas:

Sub geraXml()


Dim f As LongPtr
Dim file As String
f = FreeFile
file = "C:\macro\Testes.xml"
Open file For Output As #f


Print #f, "<?xml version='1.0' encoding='UTF-8'?>"
Print #f, "<sb:header>"
Print #f, "<sb:dataGeracao>" & Date & "</sb:dataGeracao>"
Print #f, "<sb:sequencialGeracao>1</sb:sequencialGeracao>"
Print #f, "<sb:anoReferencia>" & Year(Date) & "</sb:anoReferencia>"
rint #f, "</sb:header>"
Print #f, "<sb:detalhes>"
Print #f, "<sb:detalhe>"
Print #f, "<dadosBasicos>"
Print #f, "<dtEmis>" & Format(Date, "yyyy-mm-dd") & "</dtEmis>"
Print #f, "<docOrigem>"
Print #f, "<numDocOrigem>f1</numDocOrigem>"
Print #f, "</dadosBasicos>"
i = 1
For y = 13 To 17
If Worksheets("espelho").Cells(y, 5).Value <> 0 Then
Print #f, "<pcoItem>"
Print #f, "<numSeqItem>" & i & "</numSeqItem>"
Print #f, "<vlr>" & Replace(Replace(Worksheets("espelho").Cells(y, 5), ".", ""), ",", ".") & "</vlr>"
Print #f, "</pcoItem>"
i = i + 1
End If
Next

Print #f, "</pco>"

...

...

End Sub

 

O problema é que só aparecem 291 saídas de Print #f no arquivo

 
Postado : 12/09/2020 9:47 am
(@anderson)
Posts: 203
Reputable Member
 

Por que só vai de 13 a 17?

Anexe a planilha.

Em 90% dos casos em que não se anexa o arquivo, ocorrem mal-entendidos, gerando perda de tempo de ambos os lados.

 
Postado : 12/09/2020 10:28 am
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

não posso porque tem vários dados pessoais, como cpf e outros.

mas creio que não haja nada no restante da planilha que bloqueie a saída. ela pára no meio de um loop, o que me leva a crer que seja realmente limite de caracteres

<relPcoItem>
<numSeqPai>1</numSeqPai>
<numSeqItem>2</numSeqItem>
<vlr>5020.3</vlr>
</relPcoItem>
<relPcoItem>
<numSeqPai>1</numSeqPai>
<numSeqItem>3</numSeqItem>
<vlr>87.92</vlr>
</relPcoItem>
<relPcoIt

fim do arquivo 

 

 
Postado : 12/09/2020 10:48 am
(@anderson)
Posts: 203
Reputable Member
 

Por que só vai de 13 a 17?

Sem a planilha, duvido que alguém consiga ajudar.

Você tem a opção de colocar dados fictícios.

Fica a seu critério. Boa sorte.

Este post foi modificado 4 anos atrás 3 vezes por Anderson

Em 90% dos casos em que não se anexa o arquivo, ocorrem mal-entendidos, gerando perda de tempo de ambos os lados.

 
Postado : 12/09/2020 10:53 am
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

pessoal, descobri o problema. vcs vao achar até dificil de acreditar.

todas as linhas são escritas quando eu aperto o botão de parar a macro (formato de quadrado).

até eu fazer isso, nunca é escrito todo o código, é como se ficasse em segundo plano, reescrevendo, não sei. eu pus o arquivo no one drive e lá aparece sempre carregando.

quando eu aperto o botão de parar macro, o restante das linhas é inserido no arquivo e pára de sincronizar o onedrive.

algum comando para que a macro pare automaticamente depois da última instrução?

 
Postado : 16/09/2020 3:10 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

@cimerio, por acaso vc não estaria deixando o arquivo aberto (com a instrução Open), esquecendo-se de fechar no final (usando o Close)? Não vi vc usando Close em seu trecho de código (veja que o colega @jvalq usou em sua primeira resposta).

Isso pode facilmente corromper o(s) arquivo(s), semelhante a remover um pendrive quando ainda está sendo acessado.

Até mesmo quando está depurando seu código, executando linha-a-linha, sempre execute a linha onde está a instrução Close (ou digite Close na Janela Imediata e dê Enter).

O ideal mesmo, em minha opinião, seria lançar todas as linhas primeiro numa String e só então abrir o arquivo, "printar" a String agora totalmente preenchida e fechar logo em seguida, ficando o menor tempo possível com o arquivo aberto.

Outro detalhe: evite usar os tipos de dados LongPtr e também LongLong para variáveis que não estejam relacionadas a ponteiros e identificadores. Eles foram concebidos apenas para compatibilizar códigos entre as versões 32 e 64 bits e não para uso em variáveis ordinárias (internamente o LongPtr é convertido para Long, portanto não há vantagem em seu uso):

"Note

LongPtr is not a true data type because it transforms to a Long in 32-bit environments, or a LongLong in 64-bit environments. Using LongPtr enables writing portable code that can run in both 32-bit and 64-bit environments. Use LongPtr for pointers and handles."

Fonte: Microsoft Docs - LongPtr Data Type

Então nesse quesito e também pelo fato de vc trabalhar sempre só com um arquivo por vez, sugiro nem usar FreeFile e sim usar o algarismo #1 direto, pois assim acusaria erro caso vc tentasse abrir um arquivo já aberto com o mesmo número (abrir sem fechar).

Sua macro ficaria mais ou menos assim:

Sub geraXml()
  Dim strXml As String, i As Long, y As Long
  strXml = ""
  strXml = strXml & ""
  strXml = strXml & "" & Date & ""
  strXml = strXml & "1"
  strXml = strXml & "" & Year(Date) & ""
  strXml = strXml & ""
  strXml = strXml & ""
  strXml = strXml & ""
  strXml = strXml & ""
  strXml = strXml & "" & Format(Date, "yyyy-mm-dd") & ""
  strXml = strXml & ""
  strXml = strXml & "f1"
  strXml = strXml & ""
  i = 1
  For y = 13 To 17
    If Worksheets("espelho").Cells(y, 5).Value <> 0 Then
      strXml = strXml & ""
      strXml = strXml & "" & i & ""
      strXml = strXml & "" & Replace(Replace(Worksheets("espelho").Cells(y, 5), ".", ""), ",", ".") & ""
      strXml = strXml & ""
      i = i + 1
    End If
  Next
  strXml = strXml & ""
 'strXml = strXml & ...
 'strXml = strXml & ...
  Open "C:\macro\Testes.xml" For Output As #1
    Print #1, strXml
  Close #1
End Sub
 

 
Postado : 17/09/2020 11:13 am
cimerio reacted
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

edsonbr, eu realmente tinha esquecido de colocar o Close.

agora coloquei, veremos se resolve. aparentemente sim.

na tentativa pra resolver o problema, eu tinha tirado as variaveis, incluindo o freefile.

e usando o Open file For Output As #1, somente

depois vou tentar esse metodo de jogar tudo numa string, primeiro.

 

no momento, um erro premente é que, mesmo com a instrução Close, se eu apertar F5 de novo, aparece o erro abaixo e tenho que apertar Stop (Redefinir). Isso independente do arquivo ser aberto ou não.

Erro em tempo de execução 55.   O arquivo já foi aberto.           

eu tambem tive usar a extensão .txt. não funciona salvar direto num arquvo Xml porque nosso sistema acusa 

XML da área de dados com codificação diferente de UTF-8

 

 
Postado : 18/09/2020 10:51 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 
Postado por: @cimerio

...mesmo com a instrução Close, se eu apertar F5 de novo, aparece o erro ... independente do arquivo ser aberto ou não.

Se é o erro 55 é porque o arquivo necessariamente está aberto. O código tem que passar, obrigatoriamente, pela linha do Close. Ou, como dito anteriormente, fechar manualmente via janela de Verificação Imediata (CTRL + G) digitando Close dando Enter (tente fazer isso quando dá o erro e continuando a execução do código).

Provavelmente isso está ocorrendo enquanto vc depura o código. Dependendo de como está seu modelo, vc poderia, enquanto não conclui seu projeto, desviar o fluxo quando ocorre erro colocando no início do código:

 On Error GoTo Fechar

E antes do final:

Fechar:
  Close
  Resume
End Sub
Postado por: @cimerio

eu tambem tive usar a extensão .txt. não funciona salvar direto num arquvo Xml porque nosso sistema acusa 

Após fechar o arquivo txt, vc pode renomeá-lo pelo próprio VBA:

Name "C:\macro\Testes.txt" As "C:\macro\Testes.xml"

 

 
Postado : 18/09/2020 11:48 am
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 

agora funcionou, eu estava pondo o Close de forma errada, usando variável.

obrigado, por enquanto.

 
Postado : 19/09/2020 9:54 am
(@cimerio)
Posts: 47
Trusted Member
Topic starter
 
Postado por: @edsonbr
Postado por: @cimerio

...mesmo com a instrução Close, se eu apertar F5 de novo, aparece o erro ... independente do arquivo ser aberto ou não.

Se é o erro 55 é porque o arquivo necessariamente está aberto. O código tem que passar, obrigatoriamente, pela linha do Close. Ou, como dito anteriormente, fechar manualmente via janela de Verificação Imediata (CTRL + G) digitando Close dando Enter (tente fazer isso quando dá o erro e continuando a execução do código).

Provavelmente isso está ocorrendo enquanto vc depura o código. Dependendo de como está seu modelo, vc poderia, enquanto não conclui seu projeto, desviar o fluxo quando ocorre erro colocando no início do código:

 On Error GoTo Fechar

E antes do final:

Fechar:
  Close
  Resume
End Sub
Postado por: @cimerio

eu tambem tive usar a extensão .txt. não funciona salvar direto num arquvo Xml porque nosso sistema acusa 

Após fechar o arquivo txt, vc pode renomeá-lo pelo próprio VBA:

Name "C:\macro\Testes.txt" As "C:\macro\Testes.xml"

 

infelizmente, não funciona. o arquivo renomeado ainda é acusado como um arquivo que não é utf-8 pelo sistema

 
Postado : 29/12/2020 2:31 pm