Vídeo recomendado
https://youtu.be/diWPPPhW-9E

Desafio "Delimitar Aquivos"

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
salvador
Manda bem
Manda bem
Mensagens: 130
Registrado em: Qua Fev 12, 2014 8:01 am

Desafio "Delimitar Aquivos"

Mensagem por salvador »

Pessoal, bom dia!

Estou com um PROBLEMA aqui! Como criar uma macro para delimitar um arquivo txt onde as colunas desse arquivo podem aumentar ou diminuir.
Por exemplo;
1º TXT:
Código Encomenda 9039 9049 9059 Fornecedor Demanda N Linha
(Esse txt tem todas essas colunas)
Se todos os meus txt's tivessem a mesma quantidade de colunas seria perfeito, mas o problema é que podem haver mais colunas como as que estamos vendo acima com números.

2º TXT:
Código Encomenda 9039 9049 9059 9069 9072 9044 9045 Fornecedor Demanda N Linha

Aí já vai dar problema para delimitar!

Existe alguma forma de solucionar isso na macro! Pensei na hora de executar a macro aparecer um inputbox pedindo a quantidade de colunas e ele delimitar considerando essa variável, mas não saberia fazer. A macro que comecei a tentar fazer esta abaixo!

Se alguém puder me ajudar, fico-lhes imensamente grato!

Código: Selecionar todos

Sub Encs()


'Seleção dos arquivos
filenames = Application.GetOpenFilename(, , , , True)
counter = 1
k = 1
'ubound determina quantos arquivos serão selecionados
While counter <= UBound(filenames)

 
'Abre os arquivos selecionados
Workbooks.Open filenames(counter)



'Acertando o relatório do sistema
Application.ScreenUpdating = False

 
Workbooks.OpenText Filename:=filenames(counter), Origin:= _
        xlWindows, StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, _
        2), Array(17, 1), Array(76, 1), Array(89, 1), Array(108, 1), Array(126, 1), Array(147, 1), _
        Array(165, 1), Array(183, 1), Array(201, 1), Array(219, 1), Array(237, 1), Array(243, 1), _
        Array(244, 1), Array(247, 1), Array(264, 1), Array(281, 1), Array(298, 1), Array(315, 1), _
        Array(332, 1), Array(349, 1), Array(366, 1), Array(383, 1), Array(400, 1), Array(417, 1), _
        Array(434, 1), Array(451, 1), Array(468, 1), Array(485, 1), Array(502, 1), Array(519, 1), _
        Array(536, 1), Array(553, 1), Array(570, 1), Array(587, 1), Array(604, 1), Array(621, 1), _
        Array(638, 1), Array(655, 1), Array(672, 1), Array(689, 1), Array(706, 1), Array(723, 1), _
        Array(740, 1), Array(757, 1), Array(774, 1), Array(791, 1), Array(808, 1), Array(825, 1), _
        Array(842, 1), Array(859, 1), Array(876, 1), Array(893, 1), Array(910, 1), Array(927, 1), _
        Array(944, 1), Array(976, 1), Array(984, 1), Array(992, 1)), TrailingMinusNumbers:= _
        True

counter = counter + 1
 
  Wend


End Sub
O problema dessa macro é que sempre vai delimitar para 40 colunas de encomendas.... quando eu for rodar outro txt que a quantidade de colunas seja 10, não irá funcionar!

Obrigado


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: Desafio "Delimitar Aquivos"

Mensagem por Reinaldo »

Pode-se efetuar uma rotina para cada quatde de colunas no arquivo.
Então, sem muita analise, e levando em conta que a linha 1 do txt e o cabecalho, e que a separação dos titulos e é espaço.
Pode-se "ler" a quantidade de colunas e assim executar uma ou outra rotina.

Código: Selecionar todos

Sub Encs()
'Seleção dos arquivos
filenames = Application.GetOpenFilename(, , , , True)
counter = 1
k = 1
'ubound determina quantos arquivos serão selecionados
While counter <= UBound(filenames)

'Abre os arquivos selecionados
Workbooks.Open filenames(counter)

'Acertando o relatório do sistema
Application.ScreenUpdating = False

'abre o arquivo texto para leitura.
'Open "C:\Seu Caminho\importacao.txt" For Input As #1
Open filenames(counter) For Input As #1
Line Input #1, Texto 'lê uma linha
mArray = Split(Texto, " ") 'Separa em termos considerando espaço
If mArray < 10 Then
    Workbooks.OpenText Filename:=filenames(counter), Origin:= _
            xlWindows, StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, _
            2), Array(17, 1), Array(76, 1), Array(89, 1), Array(108, 1), Array(126, 1), Array(147, 1), _
            Array(165, 1), Array(183, 1), Array(201, 1), Array(219, 1), Array(237, 1), Array(243, 1), _
            Array(244, 1), Array(247, 1), Array(264, 1), Array(281, 1), Array(298, 1), Array(315, 1), _
            Array(332, 1), Array(349, 1), Array(366, 1), Array(383, 1), Array(400, 1), Array(417, 1), _
            Array(434, 1), Array(451, 1), Array(468, 1), Array(485, 1), Array(502, 1), Array(519, 1), _
            Array(536, 1), Array(553, 1), Array(570, 1), Array(587, 1), Array(604, 1), Array(621, 1), _
            Array(638, 1), Array(655, 1), Array(672, 1), Array(689, 1), Array(706, 1), Array(723, 1), _
            Array(740, 1), Array(757, 1), Array(774, 1), Array(791, 1), Array(808, 1), Array(825, 1), _
            Array(842, 1), Array(859, 1), Array(876, 1), Array(893, 1), Array(910, 1), Array(927, 1), _
            Array(944, 1), Array(976, 1), Array(984, 1), Array(992, 1)), TrailingMinusNumbers:= _
            True
Else
'.......
End If
    counter = counter + 1
Wend
End Sub


salvador
Manda bem
Manda bem
Mensagens: 130
Registrado em: Qua Fev 12, 2014 8:01 am

Re: Desafio "Delimitar Aquivos"

Mensagem por salvador »

Obrigado pela Ajuda Rmarco!

Mas não deu certo. Acho que por não ser apenas uma espaço!

Vide cabeçalho do meu TXT

Componente Descricao Componente Qtde Comp. Estoq Fisico Saldo Dis 07 Saldo Fis 07b Saldo Dis 07b Saldo Dep600 Saldo Dep400 Saldo Dep500 Saldo Dep100 Un T F 15621 Desenho

Esse é o que tem menos colunas... a diferença entre os demais é que pode aumentar o numero de encomendas a partir da coluna 15621!

O problema é que o delimitador espaço talvez não seja a melhor opção!

Complicado essa macro! Mas me resolveria uma rotina absurda minha aqui. Imagina ficar abrindo esses arquivos o dia todos, delimitando, excluindo colunas, etc...

Ah... se o comando contar quantas colunas tem e depois eu criar uma condição para cada, sendo que o máximo pode ser 40 colunas, será que não resolveria!

Difícil né/

Se ainda puder ajudar, fico-lhe grato!


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: Desafio "Delimitar Aquivos"

Mensagem por Reinaldo »

Bem pela linha do cabeçalho aparentemente alguns titulos são duplos. Mas acredito que a linha de dados não são duplas. Então conte a segunda (ou terceira linha).
Assim talvez de melhor resultado.
Seria
algo assim( segunda linha):

Código: Selecionar todos

Sub Encs()
Dim Texto As String
Dim Counter As Long, cLin As Long
Dim mArray
'Seleção dos arquivos
filenames = Application.GetOpenFilename(, , , , True)
Counter = 1
'ubound determina quantos arquivos serão selecionados
While Counter <= UBound(filenames)
    Application.ScreenUpdating = False
    'abre o arquivo texto para leitura.
    'Open "C:\Seu Caminho\importacao.txt" For Input As #1
    Open filenames(Counter) For Input As #1
    cLin = 1
    Do While Not EOF(1)
        Line Input #1, Texto 'lê uma linha
        If cLin = 2 Then
            mArray = Split(Texto, "-") 'Separa em termos considerando espaço
            GoTo Aqui
        End If
    cLin = cLin + 1
    Loop
Aqui:
    Close #1
MsgBox UBound(mArray)
    If UBound(mArray) < 10 Then
        Workbooks.OpenText Filename:=filenames(Counter), Origin:= _
                    xlWindows, StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, _
                    2), Array(17, 1), Array(76, 1), Array(89, 1), Array(108, 1), Array(126, 1), Array(147, 1), _
                    Array(165, 1), Array(183, 1), Array(201, 1), Array(219, 1), Array(237, 1), Array(243, 1), _
                    Array(244, 1), Array(247, 1), Array(264, 1), Array(281, 1), Array(298, 1), Array(315, 1), _
                    Array(332, 1), Array(349, 1), Array(366, 1), Array(383, 1), Array(400, 1), Array(417, 1), _
                    Array(434, 1), Array(451, 1), Array(468, 1), Array(485, 1), Array(502, 1), Array(519, 1), _
                    Array(536, 1), Array(553, 1), Array(570, 1), Array(587, 1), Array(604, 1), Array(621, 1), _
                    Array(638, 1), Array(655, 1), Array(672, 1), Array(689, 1), Array(706, 1), Array(723, 1), _
                    Array(740, 1), Array(757, 1), Array(774, 1), Array(791, 1), Array(808, 1), Array(825, 1), _
                    Array(842, 1), Array(859, 1), Array(876, 1), Array(893, 1), Array(910, 1), Array(927, 1), _
                    Array(944, 1), Array(976, 1), Array(984, 1), Array(992, 1)), TrailingMinusNumbers:= _
                    True
    Else
        '.......
    End If
    Counter = Counter + 1
Wend
End Sub
Tambem se quiser/puder envie/post modelos de seus txt (altere dados para fictícios se necessário) , ficará mais fácil enxergar uma possivel solução


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


salvador
Manda bem
Manda bem
Mensagens: 130
Registrado em: Qua Fev 12, 2014 8:01 am

Re: Desafio "Delimitar Aquivos"

Mensagem por salvador »

Rmarco, bom dia!

Você poderia enviar seu e-mail para eu lhe enviar dois exemplos de TXT's!

Por aqui não consigo fazer os posts!

Aguardo


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: Desafio "Delimitar Aquivos"

Mensagem por Reinaldo »

mandei o email em MP


salvador
Manda bem
Manda bem
Mensagens: 130
Registrado em: Qua Fev 12, 2014 8:01 am

Re: Desafio "Delimitar Aquivos"

Mensagem por salvador »

Enviei no seu e-mail!
Obrigado


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: Desafio "Delimitar Aquivos"

Mensagem por Reinaldo »

Tentarei responder até amanha


salvador
Manda bem
Manda bem
Mensagens: 130
Registrado em: Qua Fev 12, 2014 8:01 am

Re: Desafio "Delimitar Aquivos"

Mensagem por salvador »

RMarco, bom dia!

Conseguiu ver os TXT's?

Obrigado


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: Desafio "Delimitar Aquivos"

Mensagem por Reinaldo »

Vi, porem é um pouco diferente do esperado, estou "vendo" ainda um padrão/maneira.
Apenas vai demorar um pouco mais; principalmente porque fica intercalado com outros "assuntos" que vou levando.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder