Ir ao conteúdo
  • Cadastre-se

Excel Macro para verificar se o arquivo existe


Posts recomendados

Olás.

 

Tenho uma macro para salvamento de um arquivo segundo alguns parâmetros.

Ela funciona, só que se executada mais de uma vez, dá a mensagem de que o arquivo já existe e se deseja substituir. Aí se o usuário clicar em não a macro dá erro.

A macro:

Dim DataParaNome As String
DataParaNome = Worksheets(1).Range("j1") 'J1 tem uma variação de HOJE()

Dim Endereço As String
Endereço = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "")

Dim Nome1 As String
Nome1 = Endereço + "Controle Painel " + DataParaNome + ".xlsm"

ActiveWorkbook.SaveAs Filename:=Endereço & "Controle Painel " & DataParaNome & ".xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False

Precisa dessa verificação de endereço porque cada máquina o arquivo está numa pasta diferente.

 

Eu preciso que ela verifique se o arquivo existe e acrescente (1), (2), etc...

 

Já tentei usar a DIR, mas como não é o único arquivo dentro da pasta, não funciona (ou eu que não soube usar mesmo)....

 

Agradeço desde já.

Link para o post
Compartilhar em outros sites

Eu usei Len+Dir para verificar se já existe e aqui pra mim funcionou: 

 

Dim DataParaNome  As String
Dim Nome1         As String
Dim Endereço      As String
Dim k             As Integer
Dim fName         As Variant


   DataParaNome = Worksheets(1).Range("j1") 'J1 tem uma variação de HOJE()

   Endereço = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "")

   Nome1 = Endereço + "Controle Painel " + DataParaNome + ".xlsm"

         If VBA.Len(VBA.Dir(Nome1, VBA.vbNormal)) = 0 Then

             GoTo Salva
            
                  Else
                      fName = Nome1
                                     'segue em loop se nome do arquivo já existir
                    Do Until VBA.Len(VBA.Dir(Nome1, VBA.vbNormal)) = 0
                                                              '
                        k = k + 1
                                                                ' renomea a arq. acresc. (+1)
                        Nome1 = VBA.Replace(fName, fName, Endereço & "Controle Painel " & DataParaNome & _
                                                                               "(" & k & ")." & ".xlsm")                                                                                                      ' ex.:(BT12345 - 2)
                    Loop
                    
              End If
         
Salva:

        ActiveWorkbook.SaveAs Filename:=Nome1, _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False

 

 

Link para o post
Compartilhar em outros sites

@Basole Ola.

 

Funcionou certinho!!!

 

Rapaz, eu fucei muito até pedir ajuda aqui....

 

tentei o que esse cara ensinou, http://douglasgodoy.com.br/como-verificar-se-um-arquivo-ou-pasta-existe-com-vba/

mas como eu disse, só funcionava se fosse o único arquivo na pasta.

 

Achei um que ensinava a forçar a abertura do arquivo pra ver se ele existia, mas achei que feria a lógica né? Pensei "deve ter um jeito de fazer isso, não é possível" rsrss

 

Enfim, agradeço demaaaaissss a ajuda, mas se não for abuso, poderia me explicar?

 

Por que fName é variant, e não string?

 

Entendi o LEN, mas porque o "VBA." em tudo?

 

No caso de DIR, eu estava usando "DIR(nome.do.arquivo)" . Por que especificar "normal"? Por isso que a minha não estava funcionando?

 

Nessa parte:

Nome1 = VBA.Replace(fName, fName, Endereço & "Controle Painel " & DataParaNome & "(" & k & ")." & ".xlsm")

Por que "fName" duas vezes?

 

No caso de fileformat, eu poderia alterar para que o arquivo salvo não rode as macros? Qual seria o ideal?

 

 

muito muito muito obrigada!!!!

Link para o post
Compartilhar em outros sites
Citação

Por que fName é variant, e não string?

Variante aceita quase tudo, sendo assim as chances de erros é bem menor

https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/variant-data-type

 

Citação

Entendi o LEN, mas porque o "VBA." em tudo?

   Quando se tem muitas referencias marcadas: 

466x375ximage_thumb.png.pagespeed.ic.I0g

Ou seja varias bibliotecas, quando executa a macro o vba fica todo momento consultando as bibliotecas e isso acaba gerando o erro: "Erro de compilação: Não é possível encontrar o projeto ou a Biblioteca" não reconhecendo algumas bibliotecas, como: Dir, Len, Ucase, Now, Date, vbCr, etc. por isso que eu me acostumei a colocar o vba antes, desta forma evita esse erro. Já aconteceu uma situação de tentar rodar um arquivo em outro computador e ter que colocar vba umas 60 vezes e na unha.

Citação

No caso de DIR, eu estava usando "DIR(nome.do.arquivo)" . Por que especificar "normal"? Por isso que a minha não estava funcionando?

Pode ser da forma que fiz ou assim também, especificando um parâmentro:  If Dir(Nome1, vbDirectory) = "" Then

 

Citação

Nome1 = VBA.Replace(fName, fName, Endereço & "Controle Painel " & DataParaNome & "(" & k & ")." & ".xlsm")

Por que "fName" duas vezes?

Neste caso um fName está anulando o outro, ou seja o replace está a mais, não precisava usa-lo. Pode fazer desta forma:  Nome1 = Endereço & "Controle Painel " & DataParaNome & _
                                                                               "(" & k & ")" & ".xlsx"
 

 

Citação

No caso de fileformat, eu poderia alterar para que o arquivo salvo não rode as macros? Qual seria o ideal?

 

Acho que o ideal seria analisar o seu arquivo. de qualquer forma, experimente assim: 

 

Dim DataParaNome  As String
Dim Nome1         As String
Dim Endereço      As String
Dim k             As Integer
Dim fName         As Variant


   DataParaNome = Worksheets(1).Range("j1") 'J1 tem uma variação de HOJE()

   Endereço = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "")

   Nome1 = Endereço + "Controle Painel " + DataParaNome + ".xlsx"

         If VBA.Len(VBA.Dir(Nome1, VBA.vbNormal)) = 0 Then

             GoTo Salva
            
                  Else
                      fName = Nome1
                                     'segue em loop se nome do arquivo já existir
                    Do Until VBA.Len(VBA.Dir(Nome1, VBA.vbNormal)) = 0
                                                              '
                        k = k + 1
                                                                ' renomea a arq. acresc. (+1)
                        Nome1 = Endereço & "Controle Painel " & DataParaNome & _
                                                          "(" & k & ")" & ".xlsx"                                                                                                     
                    Loop
                    
              End If
         
Salva:

        Application.DisplayAlerts = False
        
        ThisWorkbook.CheckCompatibility = False
        ThisWorkbook.SaveAs Filename:=Nome1, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False        
        Application.DisplayAlerts = True

 

Link para o post
Compartilhar em outros sites
  • 2 anos depois...

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora


Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!