VBA - Em vez de ActiveExplorer.Selection para definir pasta, defina explicitamente o caminho da pasta

0
Sub MoveItems() 
    Dim Messages As Selection 
    Dim Msg As MailItem 
    Dim NS As NameSpace 
    Set NS = Application.GetNamespace("MAPI") 
    Set Messages = ActiveExplorer.Selection 
    If Messages.Count = 0 Then
      Exit Sub 
    End If 
    For Each Msg In Messages 
      Msg.Move NS.Folders("Personal Folders").Folders("SavedMail") 
    Next
End Sub 

Esse código moverá todas as mensagens de email da pasta atualmente selecionada no Outlook para outra pasta (SavedMail). Gostaria de editar o código para que, em vez de usar a pasta atualmente selecionada como fonte das mensagens, houvesse uma pasta codificada - algo como Set Messages = NS.Folders("Personal Folders").Folders("Moved").

Eu sou um novato VBA e tentei apenas substituir a linha Set Messages com isso, o que resultou em um erro em tempo de execução '13': Incompatibilidade de tipo que eu acho que se refere a uma incompatibilidade dos comandos Dim Messages e Set Messages. Eu tentei usar diferentes definições Dim sem sorte. Eu estou supondo que alguém que conhece o VBA verá a maneira de fazer isso imediatamente.

Mike
fonte

Respostas:

1

Eu acho que o problema que você está enfrentando é a linha

If messages.count = 0 then

Depois de definir messages como uma pasta, você não pode contá-la - ela quer contar uma seleção de itens de correio. A menos que você precise lidar com erros como esse, você pode cortar o código assim -

Sub MoveItems() 
    Dim Msg As MailItem 
    Dim NS As NameSpace 
    Set NS = Application.GetNamespace("MAPI") 
    For Each Msg In NS.Folders("Personal Folders").Folders("Moved").Items
      Msg.Move NS.Folders("Personal Folders").Folders("SavedMail") 
    Next
End Sub 
Raystafarian
fonte
1
Eu diria que, mesmo que pudesse contar as mensagens. Não seria útil, afinal? OP entra em um foreach, se não há nada para iterar então ele iria pular de qualquer maneira?
Dave
@Raystafarian acontece antes que qualquer item seja processado. Todos os itens são itens de correio. Quando eu corro o código incluído no meu post original com o "Dim Mensagens como Seleção", o código é executado corretamente. É somente quando defino explicitamente o caminho para a pasta que me deparo com problemas.
Mike
@Raystafarian que parecia fazer a diferença. Eu acho que é a correção necessária para definir explicitamente a pasta. Mais uma questão surgiu. Existem 25 mensagens de e-mail na pasta Moved, mas apenas 13 são movidas pelo novo código editado. Esses 25 itens foram copiados da Caixa de Entrada na chegada, usando as regras de e-mail do Outlook. O código original usando o "Dim mensagens como seleção" move todos os 25.
Mike
@Raystafarian parece que ele está processando o primeiro item e, em seguida, ignorando o próximo, e depois processando o próximo, etc. Não sei como Para cada um funciona, mas talvez esteja usando um contador para processar o item número 1 e, em seguida, item número 2, etc. Mas, no processamento do item número 1, ele move o item 1 para uma pasta diferente. Isso deixa o que era o item número 2 como agora o número 1. Então, quando ele procurar o item 2, ele irá processar o item 3 quando o loop foi iniciado pela primeira vez.
Mike
1
@Raystafarian que fez o truque. O link para o iterativo respondeu de volta aceito estava certo.
Mike