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

@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

×