Tag Archives: SHFileOperation

VBA – Excluindo arquivos e Movendo para a Lixeira

Lixeira
Lixeira

Programadores mais experientes sempre tiveram a mão uma função simples para exclusão de arquivos no VBA. A função Kill. A Macro abaixo exclui o arquivo no caminho informado:

Public Sub KillThem()
    Kill "C:\temp\delete.txt"
End Sub

Até aqui tudo bem. O inconveniente desta função é que o arquivo é definitivamente excluído, ou seja, não passa nem pela Lixeira. Em alguns casos isso pode até ser bom, em outros não, como por exemplo, selecionar um arquivo por engano.

Para isso, há uma pequena alternativa que seria a óbvia. Enviar o arquivo para a Lixeira. O código VBA abaixo permite a proeza:

Private Const FO_DELETE = &H3
Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
 
Private Type SHFILEOPSTRUCT
    hwnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Long
    hNameMappings As Long
    lpszProgressTitle As Long
End Type
 
Private Declare Function SHFileOperation Lib _
 "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
 
Public Function Exclui_Arquivo(CaminhoArquivo As String) As Boolean
    Dim shfo As SHFILEOPSTRUCT
    Dim lresult As Long
 
    With shfo
        .wFunc = FO_DELETE
        .pFrom = CaminhoArquivo
        .fFlags = FOF_ALLOWUNDO Or FOF_NOCONFIRMATION
    End With
 
    lresult = SHFileOperation(shfo)
    Exclui_Arquivo = CBool(lresult = 0)
End Function
 
Um exemplo de chamada à função seria:
 
Public Sub Teste()
    Dim CaminhoArquivo As String
    CaminhoArquivo = "C:\temp\delete.txt"
    If Exclui_Arquivo(CaminhoArquivo) Then
        MsgBox "Arquivo " & CaminhoArquivo & " excluido com sucesso"
    Else
        MsgBox "Falha na exclusão do aquivo " & CaminhoArquivo
    End If
End Sub

É interessante notar que as constantes FOF_ALLOWUNDO e FOF_NOCONFIRMATION são utilizadas em cojunto. O resultado produzido é a efetivação da operação sem confirmação. Porém, se omitir o segundo, a caixa de confirmação de exclusão de arquivo padrão do Windows será mostrada.  Experimento deixar somente o FOF_ALLOWUNDO e execute o código novamente.

Não entrarei em detalhes da função SHFileOperation e da Estrutura SHFILEOPSTRUCT. Ambas estão bem detalhadas na documentação oficial:

SHFileOperation Function
SHFILEOPSTRUCT Structure

Bom proveito!