Ir ao conteúdo
  • Cadastre-se
PlayerMamuska

Excel Macro para verificar se o arquivo existe

Recommended Posts

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á.

Compartilhar este post


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

 

 

Compartilhar este post


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!!!!

Compartilhar este post


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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 publicações 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

×