Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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
  • Autor do tópico
  • @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!!!!

    Editado por PlayerMamuska
    Por que em pergunta é separado, burra!

    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
    

     

    Editado por Basole

    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






    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

    ×