A resposta a esta pergunta afirma que para evitar o erro você precisa adicionar a referência a MS Scripting Run-time
.
Usei essa metodologia para excluir um arquivo no meu código, mas como sei que ele será usado em vários computadores que não terão essa referência incluída, acho que tenho duas opções:
- Use uma metodologia diferente para excluir um arquivo existente.
- Descubra uma maneira de carregar o arquivo de referência quando o arquivo for aberto.
Este sub está vinculado a um botão ActiveX na planilha
Sub Createbackupfile()
Dim strCurrentName As String
Dim strCurrentPathAndName As String
Dim strCurrentPath As String
Dim strPreviousFilename As String
strCurrentName = ThisWorkbook.Name
strCurrentPathAndName = ThisWorkbook.FullName
strCurrentPath = Replace(strCurrentPathAndName, strCurrentName, "")
NewPath = "OldForecasts\"
With ThisWorkbook
.SaveAs Filename:=strCurrentPath & StrNewPath & strCurrentName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End With
With New FileSystemObject
If .FileExists(CurrentPathAndName) Then
.deleteFile CurrentPathAndName
End If
End With
End Sub
Pergunta
O que é uma abordagem alternativa ao usoNew FileSytemObject
Algumas coisas a mencionar:
(1) Uma pequena coisa: Você pode acessar a pasta de uma pasta de trabalho usando
ThisWorkbook.Path
(note que isso não contém a barra invertida final). Então use strCurrentPath = ThisWorkbook.Path(2) Você atribui o nome da subpasta a uma variável chamada
NewPath
mas depois você acessastrNewPath
. O mesmo problema comCurrentPathAndName
vsstrCurrentPathAndName
. Evite tais erros usando sempreOption Explicit
.Além disso, a menos que em seu código você planeje ter diferentes subpastas como pasta de backup, declare o novo caminho como constante, não como variável:
(3) Conforme mencionado nos comentários, existem alguns comandos (bastante antigos) para manipulação de arquivos no VBA:
kill
para apagar um arquivoDir
para verificar se um arquivo ou pasta existe. Para verificar pastas, você precisa adicionarvbDirectory
como 2º argumento aoDir
-command.MkDir
para criar uma pasta.O código poderia ser parecido com este:
Observe que se esse código também for executado em um Mac, você precisará substituir a barra invertida por uma barra - ou usar
Application.PathSeparator
:(até onde eu sei, os comandos em si funcionam em um Mac, mas não posso verificar isso porque não tenho um Mac para testar.)
(4) O
FileSystemObject
Scripting Runtime é uma forma alternativa de acessar informações de arquivos e pastas. Ele tem algumas vantagens sobre os comandos antigos (por exemplo, você pode percorrer recursivamente suas pastas e subpastas) e oferece comandos adicionais.O Scripting Runtime está presente em todos os computadores Windows (mas não em nenhum Mac). Adicionar uma referência ao seu projeto apenas informa ao compilador VBA que você quer usá-lo (isso é chamado de early binding ). A vantagem é que o compilador pode verificar a sintaxe para você já no momento da compilação, e você tem o intellisense como suporte ao digitar o código.
No entanto, você pode viver perfeitamente sem vinculação antecipada usando
CreateObject
. Isso é chamado de vinculação tardia . O compilador não sabe nada sobre o objeto que é criado e, se você acessar qualquer propriedade ou método, o tempo de execução do VBA examinará o tempo de execução, se existir. Exemplo:O editor VBA pode ajudar você com o intellisense e o compilador verifica se os métodos
FileExists
eDeleteFile
existem. Se você tiver um erro de digitação (você digita por exemploFileExist
), o compilador já pode avisá-lo antes que o código seja executado.Agora o compilador não sabe nada sobre o objeto criado e você receberá um erro de tempo de execução ao usar um nome de método inválido.
Ambas as versões funcionarão em qualquer computador onde a biblioteca exista e não funcionarão em nenhum computador onde a biblioteca não exista. No entanto, quando a biblioteca não existe e você usa a vinculação antecipada, o código não será compilado e você não poderá usar nenhum código. Com a vinculação tardia, você pode usar qualquer outro código do seu projeto.
Mover a pasta de trabalho que contém o código para uma subpasta específica
Uma Chamada Simples
Uma ferramenta
O Método