9
respostas

Abrir com VBA um arquivo cujo nome varia no final.

Na aula, pelo VBA dá pra abrir um arquivo localizado num endereço, no caso era Workbooks.Open Filename:="c:users...\janeiro.xlsx.Tenho um arquivo atualizado e disponibilizado todos os dias, mas vem seguido da data do dia: Operações_01.06.20, outro dia Operações_02.06.20,etc. Apliquei o comando acima, mas ele não abre o arquivo, por causa dessa mudança de variação na data. Tem algum comando que permita abrir esse arquivo onde se mantém o mesmo nome, mas tem essa variação no final dele como descrito acima? Obrigado!

9 respostas

Olá Josias tudo bem com você??

Neste caso como o arquivo é renomeado, ele não se trata mais do "mesmo arquivo" até relacionado ao conteúdo, que também foi atualizado.

Você pode tentar usar esse script:

Sub GetLatestFile()

Dim strFolder  As String
Dim strFile    As String
Dim latestFile As String
Dim dtLast     As Date

    strFolder = "C:\Users\victo\Downloads\teste\"
    strFile = Dir(strFolder & "\*.xlsx*", vbNormal) 

    Do While strFile <> ""
        If FileDateTime(strFolder & strFile) > dtLast Then
            dtLast = FileDateTime(strFolder & strFile)
            latestFile = strFolder & strFile
        End If
        strFile = Dir
    Loop

    MsgBox latestFile

End Sub

Esse bloco de código reconhece a pasta que os arquivos serão colocados e além disso o último arquivo xlsx nela. Indico que apague sempre a versão anterior ou atualize a existente.

Espero ter ajudado e qualquer dúvida é só retornar aqui!

Tentei aplicar algumas vezes, mas apareceu: "erro nome do arquivo" ou outro erro. Não consigo ver onde está o erro. O arquivo está no servidor da rede e não no HD do computador. Ainda sou iniciante em VBA e esse é meu primeiro curso, daí ter dificuldade em coisas básicas. O caminho do arquivo é: \Sp0000sr055\sp5459fs201\CEOPC_COMEX\CEOPC04\AUDITORIA\Volume de Contratação - ultimos 12 meses\Relatórios\Volume de contratação _ últimos 12 meses_Atualizado_até_12062020.xlsx. (depois de sp5459fs201, vem uma pasta dentro da outra até chegar no arquivo.

O nome do arquivo é: Volume de contratação _ últimos 12 meses_Atualizado_até_12062020.xlsx. Assim, como posso colocar esses dados na posição correta dentro do script informado?

Obrigado!

Então Josias, o nome do arquivo nesse caso, não é o problema, a extensão do arquivo poderia ser, mas está como xlsx.

Agora com relação ao endereço do caminho da pasta pode existir um problema, se a rede para acessar exige algum tipo de validação.

Faz um teste com uma pasta local no seu pc, primeiramente para fazer funcionar o seu script.

Deixo aqui um LINK da documentação técnica da Microsoft para te guiar com relação ao uso de arquivos na rede.

Consegui abrir o arquivo com a data mais recente usando o script acima, deu certo. Mas ao script precisei acrescentar: " Workbooks.Open Filename:=(latestFile)" depois do Loop, pois a macro ia direto para a msgbox informando o nome arquivo mais recente, mas não trazia o arquivo aberto. Copiei uma área pra colar em outro arquivo aberto, tentei repetir o procedimento alternando entre um e outro com Activate; e depois fechar o arquivo, mas os comandos dão erro: Erro em tempo de execução 9 subscrito fora do intervalo. Workbooks("latestFile").Aticvate Workbooks("latestFile").Close Esse procedimento foi feito em uma das videoaulas e deu muito certo, mas o arquivo aberto não envolvia uma variável, era um arquivo com nome fixo. Será que poderiam me auxiliar mais uma vez. Obrigado.

Sub GetLatestFile()

Dim strFolder As String Dim strFile As String Dim latestFile As String Dim dtLast As Date

strFolder = "C:\Users\josia\Desktop\Excell projetos\"
strFile = Dir(strFolder & "\Fikltro_*.xlsx*", vbNormal)

Do While strFile <> ""
    If FileDateTime(strFolder & strFile) > dtLast Then
        dtLast = FileDateTime(strFolder & strFile)
        latestFile = strFolder & strFile
    End If

    strFile = Dir
Loop

Workbooks.Open Filename:=(latestFile) Sheets("Info").Select Range("I6:I100").Copy

Workbooks("Formulário").Activate Sheets("Importe").Select Range("G1").PasteSpecial xlFormats Range("G1").PasteSpecial xlValues

Workbooks("latestFile").Close

End Sub

Fala Josias, tudo bem?

O erro que você está recebendo é porque você errou na sintaxe dessa linha aqui:

Workbooks("latestFile").Close

Quando você coloca essas "" (aspas) você está dizendo que quer fechar um arquivo chamado strFile.

Na verdade você quer abrir um arquivo com o nome que está dentro de uma variável chamada strFile, então a sintaxe certa é sem as aspas, assim:

Workbooks(latestFile).Close

Percebe a diferença???

Além disso, você poderia experimentar colocar o nome direto, usando a data de hoje como definição para o nome do arquivo. Ficaria mais ou menos assim:

Sub GetLatestFile()

Dim strFolder As String

Dim strFile As String

strFolder = "C:\Users\josia\Desktop\Excell projetos"

strFile = "Volume de contratação _ últimos 12 meses_Atualizado_até_" & Format(Now(), "ddmmyyyy") & ".xlsx"

Workbooks.Open Filename:=(strFile)

Sheets("Info").Select Range("I6:I100").Copy

Workbooks("Formulário").Activate Sheets("Importe").Select

Range("G1").Paste

Workbooks(strFile).Close

End Sub

Prof. Roberto, muito obrigado! Esse script funcionou perfeitamente e vai ser importante para atividade de meu trabalho, pois ele abre o arquivo com a data diária como me é enviado. Outra pergunta: Recebo também um arquivo com data no final, mas esse fica disponível uma semana ou mais. Teria como alterar o scritp para poder abrir esse arquivo em que a data não muda de forma diária, embora o prefixo seja sempre o mesmo? Ele é o único arquivo excel na pasta. Obrigado!

Fala Josias! Que bom que te ajudou.

A pergunta é: você consegue saber qual a data que estará no final desse arquivo que permanece na pasta? (Exemplo: primeiro dia do mês, quinto dia útil, etc)

Se houver uma regra, podemos montar. Caso não seja possível, aí a solução vai ser bem parecida com seu script anterior (ler a pasta).

Fico no aguardo ;)

Prof. Roberto, não tem esse aspecto primeiro, quinto, isso varia. Mas como disse, embora ele traga uma data (que é variável), ele sempre é o único arquivo em uma pasta no servidor. Talvez um script pra trazer o último arquivo ou qualquer arquivo com terminação xlsx. Assim, independente da alteração da data, ele poderia trazer qualquer arquivo que achasse da pasta com terminação xlsx. obrigado!

Fala Josias, tudo bem?

Primeiramente desculpe a demora em responder, mas como essa questão não está em um dos meus cursos, não aparece para mim e acabo demorando para passar nos demais fóruns.

Para esse caso que você descreveu, o código que o Victor te passou na segunda linha dessa conversa, deve ser mais adequado ;)

Basta ajustar para a nova situação.

Abraços!