Notifications
Clear all

2 Problemas - Formatação e rodar o VBA em multiplos arquivos

6 Posts
2 Usuários
0 Reactions
1,543 Visualizações
(@rukhron)
Posts: 29
Eminent Member
Topic starter
 

Olá, em primeiro lugar bom dia a todos.
Estou desenvolvendo um codigo VBA pela primeira vez, e não sou familiar com a Syntax ainda, por conta disto estou precisando de alguma ajuda.

1º Problema: Formatação
Eu acertei fazer o programa para salvar minha planilha em um arquivo TXT e consegui programa-lo para dar a quantidade de espaços que preciso. Mas estou com um problema para formatar os números.
As celulas com valor tipo número não estão vindo na formatação desejada de duas casas decimais (#,00), não sei qual comando posso usar para ele pegar o número na celula neste formato.
É preciso que a forma de resolução seja compativel com concatenar, pois o número resgatado da célula será concatenado em uma grande linha de texto a ser impresa no arquivo txt.

2º Problema: Multiplos arquivos xls
Este programa VBA não será utilizado por mim, mas por uma terceira pessoa sem conhecimento VBA. Também existe o problema de que haverão varios arquivos xls para usar o programa. Então eu preciso fazer o programa de forma que esta pessoa possa usar para criar em qualquer número de arquivos do excel sem precisar ela mesma estar implementando nada. Apenas apertando botões pre-definidos sem que seja necessario conhecimento da parte dela (além claro de um básico de como operar excel que nem chega ao nível de saber implementar funções na planilha).

Desde já obrigado pela sua atenção.

 
Postado : 31/10/2012 8:07 am
(@rukhron)
Posts: 29
Eminent Member
Topic starter
 

Estou realmente precisando disto então deixa eu explicar um pouco com o código tambem. Para ver se facilita para vocês.
Primeiramente eu gostaria de agradecer ao fórum pois este código foi desenvolvido tomando algumas coisas que eu encontrei aqui como base de aprendizado.
Lembrando que este é meu primeiro VBA e eu ainda não estou muito familiar com a Syntax, por isto eu ainda tenho algumas dúvidas - se for possivel explicar um pouquinho o que são as coisas ajuda muito :oops:
Abaixo o código que eu tenho até então:

Sub GeraTxt()

'Identifica o caminho onde está e será salvo exemplo: C:Desktop
Caminho = ThisWorkbook.Path & Application.PathSeparator
'Determina o nome do arquivo a ser salvo
arquivo = "Exportado_Excel_para_Txt.txt"
'"abre" o arquivo txt para gravação dos dados
Open Caminho & arquivo For Output As #1
'tudo acima funciona muito bem, mas gostaria que o usuario tivesse que passar por um Form antes onde ele teria que informar quão o arquivo do excel de onde serão retirado os dados e o nome que ele deseja dar para o arquivo tipo txt


'Posiciona-se na planilha de onde os dados serão adquiridos (parcialmente funcionando)
Worksheets("plan1").Activate 'funciona bem, mas eu não tenho controle do nome da worksheets, se fosse possivel uma forma que funcionasse sem precisar que ela se chame "plan1" seria util, caso não seja poderia contarnar isto de outra forma que não fosse pelo programa em si.
Range("A3").Select
'Linha de inicio dos dados ( a 1 são os cabecalhos)
linha = 3
'Inicio do loop, executa ate´linha vazia.
Do Until IsEmpty(ActiveCell.Offset(1, 0))
'Preparação dos campos a serem exportados,
        AuxCompr = Len(Cells(linha, 1))
        AuxInput = Cells(linha, 1)
                Do Until AuxCompr = 16
                        AuxInput = AuxInput & " "
                        AuxCompr = Len(AuxInput)
                    If AuxCompr = 16 Then Exit Do
                Loop
        Dados = AuxInput
        Dados = Dados & Cells(linha, 2)
        Dados = Dados & Cells(linha, 3)
        Dados = Dados & Cells(linha, 4)
        AuxCompr = Len(Cells(linha, 5))
        AuxInput = Cells(linha, 5) 'parte ruim: Cells (linha,5) esta em numeros - preciso que os dados sejam resgatados com 2 algarismos decimais (#,00)
                Do Until AuxCompr = 15
                        AuxInput = " " & AuxInput
                        AuxCompr = Len(AuxInput)
                    If AuxCompr = 15 Then Exit Do
                Loop
        Dados = Dados & AuxInput 'parte ruim: Cells (linha,6) esta em numeros - preciso que os dados sejam resgatados com 2 algarismos decimais (#,00)
        AuxCompr = Len(Cells(linha, 6))
        AuxInput = Cells(linha, 6)
                Do Until AuxCompr = 15
                        AuxInput = " " & AuxInput
                        AuxCompr = Len(AuxInput)
                    If AuxCompr = 15 Then Exit Do
                Loop
        Dados = Dados & AuxInput 'parte ruim: Cells (linha,7) esta em numeros - preciso que os dados sejam resgatados com 2 algarismos decimais (#,00)
        AuxCompr = Len(Cells(linha, 7))
        AuxInput = Cells(linha, 7)
                Do Until AuxCompr = 15
                        AuxInput = " " & AuxInput
                        AuxCompr = Len(AuxInput)
                    If AuxCompr = 15 Then Exit Do
                Loop
        Dados = Dados & AuxInput & "N"
        
'Grava o valor em Dados no arquivo txt - Funciona corretamente
    Print #1, Dados
    linha = linha + 1
    If Cells(linha, 1) = Empty Then Exit Do
Loop
'fecha o arquivo txt - Funciona corretamente
Close #1


End Sub

Pois bem.
Eu preciso que o usuario abra um programinha e este programinha peça que ele informe qual o arquivo excel que ele quer converter (podendo também ter que informar o nome da planilha de onde virão os dados para resolver o problema que eu citei na linha 12 do codigo) e qual o nome que ele deseja dar para o arquivo convertido (eu quero evitar auto-gerado para o usuário ter mais controle).
Este programinha vai encontrar o arquivo excel informado e realizar o código acima (claro, com as modificações necessárias para funcionar perfeito) para criar um arquivo do tipo txt com a formatação que eu preciso que ele crie (que já está quase toda funcinando, como eu disse no código).

Eu pensei em estruturar também de forma que ele ficasse assim:
Tem uma pasta no computador da pessoa onde encontra-se o programa.
Dentro desta pasta ficariam
O Programa (que pode ser uma planilha excel com o macro/vba necessario)
Uma Pasta onde o usuario colocaria os arquivos do Excel (assim o programa já era feito para procurar só dentro dela)
Uma Pasta onde Seriam salvos os arquivo do tipo .txt (assim o programa já seria feito para gravar tudo ali)
Eu achei que esta seria uma forma bem simples de funcionar por que eu só precisaria instruir ao usuario que ele teria que:
1 - colocar o arquivo excel na pasta apropriada
2 - rodar o programa (informando o nome do arquivo excel apenas e não seu endereço completo)
3 - ir na pasta apropriada para encontrar seu .txt

 
Postado : 31/10/2012 10:24 am
(@rukhron)
Posts: 29
Eminent Member
Topic starter
 

Eu encontrei como formatar o número da maneira que eu queria.
Não conhecia a function Format (X, Y), mas agora que achei ela resolveu meu problema.

Continuo com o problema de ter que por isto para funcionar em multiplas pastas. Eu não posso pegar pasta excel por pasta excel para colocar este codigo na pasta. Outra pessoa vai usar o código e ela que vai ter acesso as pastas excel. Por conta disto eu preciso de uma forma de fazer com que ela possa usar este macro (é assim que eu deveria chamar?) em quantas e quais pasta excel ela quiser.
Como que eu posso resolver este problema?
Tem como eu criar uma pasta excel com este macro que iria acessar OUTRA pasta excel (a escolha do usuario) e copiar os dados para o txt?
Eu já fiz toda a parte de copiar os dados para o .txt, mas não sei como faria para acessar uma outra planilha. Na verdade eu malmente sei como fazer para o usuario escolher a planilha.

 
Postado : 31/10/2012 2:15 pm
(@rukhron)
Posts: 29
Eminent Member
Topic starter
 

Estou realmente com problemas nisto aqui... e precisando terminar logo também

Close #1
Close #2
'Identifica o caminho onde está e será salvo exemplo: C:Desktop
Caminho = ThisWorkbook.Path & Application.PathSeparator

Open Range("B1") & Application.PathSeparator & Range("B2") For Input As #2
[b]Workbooks(Range("B2")).Activate[/b] 'linha do erro

'Posiciona-se na 1ª planilha do arquivo excel que eu quero abrir na parte acima (onde consta o erro)
Worksheets(1).Activate
Range("A3").Select

'Determina o nome do arquivo a ser salvo (nome da plan1 selecionada acima)
arquivo = Worksheets(1).Name & ".txt"
'"abre" o arquivo txt para gravação dos dados 
Open Caminho & arquivo For Output As #1

'Linha de inicio dos dados ( a 1 são os cabecalhos) (daqui para baixo é testado e continua perfeitamente)
linha = 3
[...]

aqui tem uma seesão do código que esta dando problema e que eu não sei como resolver.

Os 2 Closes ali em cima estão passando numa boa. Eles estão ali para fechar coisas que o programa vai abrir depois. Eu coloquei eles ali por que no caso de um erro no meio da execução o programa vai fechar na proxima vez que você rodar. Impedindo um erro ao tentar abrir por um arquivo já estar aberto.

As células que estão sendo pedidas na função range são:
B1: onde consta o endereço do arquivo
B2: onde consta o nome do arquivo com a extensão

Agora a linha de erro:
Workbooks(Range("B2")).Activate
Como esta ai ela acusa: Erro em tempo de execução '13': tipos incompativeis
Tentei uma segunda forma:
Workbooks(2).Activate
Esta acusa: Erro em tempo de execução '9': subscrito fora do intervalo

O que eu quero fazer:
Quero que o programa abra o arquivo B1B2 (ex.: C:userpasta1.xlsx (onde: B1=C:user e B2=pasta1.xlsx; informado pelo usuario))
Quero que ele comece a trabalha na Celula A3 da plan1 (que pode ter qualquer nome) deste arquivo que foi aberto
Ele chegando até ai a parte que segue (varrer de A3 à G3 copiando em um .txt e depois ir descendo a linha e repetindo até encontrar uma linha vazia) eu já testei e esta funcionando.

Por favor, estou precisando muito desta ajuda. Sou novo no VBA e tô correndo para terminar isto, mas eu procuro, procuro e não acho como resolver isto. :?

 
Postado : 01/11/2012 7:41 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ruhkron
A seleção de um arquivo (workbook) ou planilha (worksheet ou sheets) é feita pelo nome ou sequencia (index), e uma celula deve ser selecionada e não Ativada.
Então na linha "Workbooks(Range("B2")).Activate 'linha do erro" deve ser : Sheets(1).range("B2").select
Qdo vc tentou Workbook(2).activate, o erro "9", foi por não haver arquivo com nome 2 aberto.

 
Postado : 01/11/2012 7:55 am
(@rukhron)
Posts: 29
Eminent Member
Topic starter
 

Muito obrigado Reinaldo.
Vou testar para ver se atende ao problema e depois retorno com os resultados. Se tudo der certo vou colocar o [resolvido].

PS.: como coloca o resolvido? o.o

 
Postado : 01/11/2012 10:55 am