Visualizzazione post con etichetta Macro. Mostra tutti i post
Visualizzazione post con etichetta Macro. Mostra tutti i post

domenica 13 febbraio 2022

MS Outlook: Determinare il percorso della cartella di un'e-mail trovata nei risultati della ricerca

Ottenere il nome della cartella in cui si trova un messaggio non è molto ovvio in Outlook e ancora più difficile è determinare il percorso esatto della cartella. Nei risultati della ricerca Outlook può visualizzare il nome della cartella in cui è stata trovata l'e-mail ma se più cartelle hanno lo stesso nome o se, nel caso di un numero elevato di cartelle, non ricordiamo la sua posizione tale informazione può rivelarsi inutile.

In questo articolo verranno illustrati 2 metodi per individuare l'intero percorso della cartella contenente l'e-mail di nostro interesse.

Metodo 1
Il primo metodo consiste in un piccolo trucco che sfrutta lo strumento di ricerca avanzata:
  • Effettuare la ricerca, quindi eseguire un doppio clic sul messaggio di proprio interesse per aprirlo nella sua finestra.
  • Premere la combinazione di tasti CTRL+SHIFT+F per aprire la funzione di ricerca avanzata.
  • Nel campo "In" viene mostrato il nome della cartella che contiene l'e-mail.
    Ricerca avanzata
    FIG 1 - Ricerca avanzata

  • Cliccando sul pulsante "Sfoglia" verrà mostrata dove si trova esattamente nella gerarchia di cartelle.
    Percorso completo cartella
    FIG 2 - Percorso completo cartella


Metodo 2
Il secondo metodo prevede l'utilizzo di VBA.
  • Avviare Microsoft Visual Basic, Application Edition tramite la combinazione di tasti ALT+F11.
  • Nella visualizzazione ad albero del progetto, sul lato sinistro della finestra, selezionare ThisOutlookSession.
  • Copiare e incollare il seguente codice.
     Public Sub GetEmailFolderPath()  
      Dim obj As Object  
      Dim Msg$  
      Dim Path As Outlook.MAPIFolder  
      Set obj = Application.ActiveWindow  
      'verifica se l'e-mail è aperta in una finestra o è stata selezionata dall'elenco messaggi  
      If TypeOf obj Is Outlook.Inspector Then  
       Set obj = obj.CurrentItem  
      Else  
       Set obj = obj.Selection(1)  
      End If  
      'Recupera il path completo dell'email  
      Set Path = obj.Parent  
      Msg = "La posizione è: " & Path.FolderPath & vbCrLf & "Passare alla cartella?"  
      'Chiede se si intende accedere alla cartella contenente l'e-mail  
      If MsgBox(Msg, vbYesNo) = vbYes Then  
       'Seleziona la cartella contenente l'e-mail  
       Set Application.ActiveExplorer.CurrentFolder = Path  
      End If  
     End Sub  
       
    
  • Salvare il codice cliccando sull'apposita icona e ritornare alla finestra di Outlook.
    Microsoft Visual Basic, Application Edition
    FIG 3 - Microsoft Visual Basic, Application Edition

  • Dal menu File->Opzioni selezionare Personalizzazione barra multifunzione.
  • Nell'elenco Schede principali (sulla destra) aggiungere il segno di spunta alla voce Sviluppo e cliccare su OK.
    Attivazione scheda Sviluppo
    FIG 4 - Attivazione scheda Sviluppo

  • A questo punto effettuare la ricerca, quindi selezionare l'e-mail dall'elenco messaggi o aprirla in una nuova finestra.
  • Dalla scheda Sviluppo cliccare su Macro (o premere la combinazione ALT+F8) e selezionare la macro creata precedentemente che avrà un nome simile a Progetto1.ThisOutlookSession.GetEmailFolderPath.
    Macro GetEmailFolderPath
    FIG 5 - Macro GetEmailFolderPath

  • Verrà visualizzato il path completo dell'e-mail. Cliccando su Si, si verrà posizionati sulla cartella contenente l'email.
    Path completo e-mail
    FIG 6 - Path completo e-mail




mercoledì 19 gennaio 2022

MS Outlook: Macro per stampare un elenco di cartelle di un file di dati

In alcune circostanze può essere utile ottenere l'elenco delle sottocartelle presenti all'interno di un file di dati di Outlook. Di seguito viene mostrata una macro VBA adatta allo scopo. La macro ottiene un elenco dei nomi delle sottocartelle presenti in un file di dati a partire dalla cartella selezionata. L'elenco viene inserito in un nuovo messaggio pronto per essere inviato.

 ' strFoldersList è una stringa multiriga contenente i nomi delle cartelle   
  Public strFoldersList As String   
  ' lCountFolders andrà a contenere il numero di cartelle elaborate   
  Public lCountFolders As Long   
     
     
  Public Sub GetFolderNames()   
   Dim olApp As Outlook.Application   
   Dim olSession As Outlook.NameSpace   
   Dim olStartFolder As Outlook.MAPIFolder   
      
   lCountFolders = 0   
      
   Set olApp = New Outlook.Application   
   Set olSession = olApp.GetNamespace("MAPI")     
     
   'Consente all'utente di selezionare la cartella da cui iniziare la ricerca   
   Set olStartFolder = olSession.PickFolder   
      
   'Verifica se l'utente ha selezionato una cartella da cui partire   
   If Not (olStartFolder Is Nothing) Then   
    ' Se è stata selezionata una cartella, avvia il processo di ricerca.   
    ProcessFolder olStartFolder   
      
    strFoldersList = strFoldersList & vbCrLf & "Totale cartelle elaborate:" & vbTab & lCountFolders   
    ' Crea un nuovo messaggio email contenente l'elenco delle cartelle   
    Set ListFolders = Application.CreateItem(olMailItem)   
    ListFolders.Body = strFoldersList   
    ListFolders.Display     
   End If   
  ' Resetta il contenuto della stringa per una nuova ricerca   
  strFoldersList = ""   
  End Sub   
     
     
  Sub ProcessFolder(CurrentFolder As Outlook.MAPIFolder)   
       
   Dim i As Long   
   Dim olNewFolder As Outlook.MAPIFolder   
   Dim olTempFolder As Outlook.MAPIFolder   
   Dim olTempFolderPath As String   
   Dim lItemsInFolder As Long   
      
   lItemsInFolder = 0   
   ' Esegue un loop sulle cartelle.   
   For i = 1 To CurrentFolder.Folders.Count   
       
    Set olTempFolder = CurrentFolder.Folders(i)   
       
    olTempFolderPath = olTempFolder.FolderPath   
     
   ' Verifica il numero di elementi contenuti nella cartella   
    lItemsInFolder = olTempFolder.Items.Count   
       
       
    ' Crea una stringa multiriga con i nomi delle cartelle.    
    ' olTempFolder contiente il nome della cartella   
    strFoldersList = strFoldersList & vbCrLf & olTempFolderPath & vbTab & "(Items:" & lItemsInFolder & ")"   
       
    lCountFolders = lCountFolders + 1   
       
   Next   
   ' Esegue la ricerca anche nelle sottocartelle della cartella corrente   
   For Each olNewFolder In CurrentFolder.Folders   
     ProcessFolder olNewFolder   
   Next   
      
      
  End Sub   

La macro è molto semplice e i commenti consentono di capire come funziona.  La procedura principale è GetFolderNames() che consente all'utente di selezionare la cartella su cui operare. Successivamente viene richiamata la procedura ProcessFolder che, partendo dalla cartella selezionata dall'utente, elabora tutte le sottocartelle.


Come utilizzare la macro

  • Per utilizzare la macro avviare la finestra Microsoft Visual Basic, Application Edition premendo, dalla finestra principale di Outlook, la combinazione di tasti ALT+F11.
  • Cliccare, con il tasto destro del mouse, su Progetto1 quindi cliccare su Inserisci e selezionare Modulo.
    VBA, Inserisci modulo
    FIG 1 - VBA, Inserisci modulo

  • Copiare il codice sopra riportato e incollarlo nella nuova finestra. Per salvare il codice cliccare sull'icona del dischetto o premere la combinazione di tasti CTRL+S
    VBA, Modulo (codice)
    FIG 2 - VBA, Modulo (codice)

  • Per eseguire la macro cliccare sul tasto play (o premere F5), selezionare la cartella desiderata e premere OK
    Seleziona cartella
    FIG 3 - Seleziona cartella

  • Verrà creato un nuovo messaggio contenente l'elenco delle cartelle. Per ciascuna cartella verrà visualizzato il numero di elementi contenuti e, alla fine dell'elenco, verrà riportato il numero di cartelle elaborato.
    Messaggio contenente l'elenco cartelle
    FIG 4 - Messaggio contenente l'elenco cartelle



Visualizzare la dimensione di ciascuna cartella

Per visualizzare la dimensione di ciascuna cartella basta apportare una semplice modifica al codice della procedura ProcessFolder come mostrato di seguito. Apportando tale modifica bisogna considerare che il tempo di elaborazione della macro può aumentare notevolmente con l'aumentare delle cartelle e item da elaborare.
 Sub ProcessFolder(CurrentFolder As Outlook.MAPIFolder)   
       
   Dim i As Long   
   Dim olNewFolder As Outlook.MAPIFolder   
   Dim olTempFolder As Outlook.MAPIFolder   
   Dim olTempFolderPath As String   
   Dim lItemsInFolder As Long   
    Dim intSize As Long   
   Dim objItems As Items   
   Dim objItem As Object      
      
   lItemsInFolder = 0   
   ' Esegue un loop sulle cartelle.   
   For i = 1 To CurrentFolder.Folders.Count   
       
    Set olTempFolder = CurrentFolder.Folders(i)   
       
    olTempFolderPath = olTempFolder.FolderPath   
     
   ' Verifica il numero di elementi contenuti nella cartella   
    lItemsInFolder = olTempFolder.Items.Count   
     
       Set objItems = olTempFolder.Items   
       
       intSize = 0   
   ' Somma la dimensione di ogni item presente nella cartella   
   For Each objItem In objItems   
    ' Debug.Print olcount, objItem.Subject, objItem.Size   
     intSize = intSize + objItem.Size   
    Next   
       
       
    ' Crea una stringa multiriga con i nomi delle cartelle.    
    ' olTempFolder contiente il nome della cartella   
    strFoldersList = strFoldersList & vbCrLf & olTempFolderPath & vbTab & "(Items:" & lItemsInFolder & ") (Dimensione:" & Int(intSize / 1024) & " KB)"   
       
    lCountFolders = lCountFolders + 1   
       
   Next   
   ' Esegue la ricerca anche nelle sottocartelle della cartella corrente   
   For Each olNewFolder In CurrentFolder.Folders   
     ProcessFolder olNewFolder   
   Next   
      
      
  End Sub   


Esportare l'elenco in un file CSV

Se al posto di creare un nuovo messaggio di posta si intende salvare l'elenco delle cartelle all'interno di un file CSV modificare la procedura GetFolderNames() come indicato di seguito.
 Public Sub GetFolderNames()   
   Dim olApp As Outlook.Application   
   Dim olSession As Outlook.NameSpace   
   Dim olStartFolder As Outlook.MAPIFolder   
      
   lCountFolders = 0   
      
   Set olApp = New Outlook.Application   
   Set olSession = olApp.GetNamespace("MAPI")   
      
   'Consente all'utente di selezionare la cartella da cui iniziare la ricerca   
   Set olStartFolder = olSession.PickFolder   
      
   'Verifica se l'utente ha selezionato una cartella da cui partire   
   If Not (olStartFolder Is Nothing) Then   
   ' Se è stata selezionata una cartella, avvia il processo di ricerca.   
   ProcessFolder olStartFolder   
      
   ' Crea un file CSV nel percorso specificato   
  strPath = Environ("USERPROFILE") & "\Documents\ElencoCartelleOutlook.csv"   
   Set fso = CreateObject("Scripting.FileSystemObject")   
   Set Fileout = fso.CreateTextFile(strPath, True, False)   
   Fileout.WriteLine strFoldersList   
   End If   
  ' Resetta il contenuto della stringa per una nuova ricerca   
  strFoldersList = ""   
  End Sub   




lunedì 4 febbraio 2019

MS Word: Modificare lo stile delle tabelle tramite macro

MS Word consente di formattare velocemente una tabella applicando gli stili di tabella. Per applicare uno degli stili di tabella messi a disposizione da MS Word:
  • Selezionare la cella di una tabella contenuta nel documento MS Word. Apparirà un nuovo gruppo di schede STRUMENTI TABELLA;
  • Cliccare sulla scheda contestuale Progettazione presente nel nuovo gruppo di schede;
  • Nella raccolta Stili tabella selezionare lo stile tabella da applicare.
    MS Word, Stili tabella
    FIG 1 - MS Word, Stili tabella
Quando si lavora su un lungo testo o quando più persone lavorano su uno stesso documento è possibile ritrovarsi con tabelle formattate in maniera diversa. Per uniformare lo stile delle tabelle contenute in un documento è possibile creare una semplice macro a patto che le tabelle non siano state utilizzate per formattare le pagine.

Il primo passo consiste nell'individuare lo stile che si intende applicare a tutte le tabelle del documento:
  • Selezionare la cella di una tabella;
  • Nel nuovo gruppo STRUMENTI TABELLA, selezionare la scheda Progettazione;
  • Nella sezione Stili tabella scorrere l'elenco degli stili e, una volta individuato lo stile di proprio interesse, soffermarsi per qualche istante sulla relativa icona e prendere nota del nome visualizzato dal tooltip che appare (FIG 1).

Qualora in MS Word la scheda Sviluppo non fosse visibile abilitarla procedendo come indicato di seguito:

  • Dal menu File->Opzioni selezionare Personalizzazione barra multifunzione;
  • Nell'elenco Schede principali (sulla destra) aggiungere il segno di spunta alla voce Sviluppo e cliccare su OK;
    MS Word, Attivazione scheda Sviluppo
    FIG 2 - MS Word, Attivazione scheda Sviluppo
Il passo successivo consiste nel creare la macro:
  • Aprire il documento MS Word contenente le tabelle da uniformare;
  • Avviare Microsoft Visual Basic, Application Edition cliccando sul pulsante Visual Basic nella scheda Sviluppo oppure tramite la combinazione di tasti ALT+F11;
  • Nella visualizzazione ad albero del progetto, sul lato sinistro della finestra, selezionare ThisDocument;
  • Copiare e incollare il seguente codice sostituendo "Tabella griglia 2 - colore 6" con il nome dello stile individuato precedentemente
    Sub ImpostaStileTabelle()
        Dim tabella As Table
        For Each tabella In ActiveDocument.Tables
            tabella.Style = "Tabella griglia 2 - colore 6"
        Next
    End Sub
    

MS Word, Microsoft Visual Basic, Application Edition
FIG 3 - MS Word, Microsoft Visual Basic, Application Edition

A questo punto non resta che eseguire la macro per uniformare lo stile di tutte le tabelle contenute all'interno del documento con quello prescelto:
  • Dalla scheda Sviluppo cliccare sul pulsante Macro (o premere la combinazione di tasti ALT+F8);
  • Selezionare la macro ImpostaStileTabelle appena creata quindi cliccare su Esegui.
    MS Word, Esegui Macro
    FIG 4 - MS Word, Esegui Macro





venerdì 14 dicembre 2018

MS Excel Quick Tip: Bloccare le celle in base al colore di riempimento

Nei fogli Excel complessi può essere utile bloccare tutte le celle mantenendone editabili solo alcune evidenziate con un particolare colore.
Per ottenere questo comportamento è possibile utilizzare uno script VBA.
  • Avviare Excel e caricare il documento che si intende proteggere;
  • Dal menu File selezionare Opzioni;
  • Selezionare Personalizzazione barra multifunzione;
  • Nell'elenco Schede principali (sulla destra) aggiungere il segno di spunta alla voce Sviluppo e cliccare su OK;
    MS Excel, Personalizzazione barra multifunzione
    FIG 1 - MS Excel, Personalizzazione barra multifunzione
  • Premere la combinazione di tasti ALT+F11 per aprire l'editor Microsoft Visual Basic, Application Edition;
  • Dall'elenco ad albero presente sulla sinistra, eseguire un doppio click su Questa_cartella_di_lavoro;
    Microsoft Visual Basic, Application Edition
    FIG 2 - Microsoft Visual Basic, Application Edition
  • Copiare ed incollare il seguente codice
Sub BloccaCelleEvidenziate()
  Dim idColore As Integer
  idColore = 6
  Dim rng As Range
  Dim colore As Long

  For Each rng In ActiveSheet.UsedRange.Cells    
    colore = rng.Interior.colorIndex
    If (colore = idColore) Then
      rng.Locked = False
    Else
      rng.Locked = True
    End If
  Next rng
End Sub

  • La variabile idColore rappresenta il codice colore delle celle da mantenere editabili. Il colore può essere modificato facendo riferimento all'elenco presente sul sito http://dmcritchie.mvps.org/excel/colors.htm.
  • Dalla scheda Sviluppo cliccare sul pulsante Macro (oppure premere la combinazione ALT+F8);
  • Selezionare la macro BloccaCelleEvidenziate e cliccare su Esegui;
  • Per bloccare le altre celle, posizionarsi sulla scheda Revisione, cliccare su Proteggi foglio ed accettare le impostazioni di default cliccando su OK;
    MS Excel, Proteggi foglio
    FIG 3 - MS Excel, Proteggi foglio
  • Dal menu File, cliccare su Salva con nome. Nella casella Salva come selezionare Cartella di lavoro con attivazione macro di Excel quindi assegnare un nome al file e confermare il salvataggio.
    MS Excel, Salva come Cartella di lavoro con attivazione macro di Excel
    FIG 4 - MS Excel, Salva come Cartella di lavoro con attivazione macro di Excel

Adesso tutte le celle colorate con il codice colore specificato dalla variabile idColore verranno mantenute editabili mentre le restanti saranno bloccate.





venerdì 7 dicembre 2018

MS Outlook: Aprire le cartelle Posta in Arrivo, Calendario, Attività e Contatti in più finestre all'avvio di Outlook

Alcuni utenti potrebbero trovare utile che all'avvio di Outlook vengono aperte le cartelle Posta in Arrivo, Calendario, Attività e Contatti in diverse finestre con dimensioni personalizzate. 
Per raggiungere tale scopo è possibile utilizzare VBA:
  • Avviare Outlook;
  • Dal menu File->Opzioni selezionare Personalizzazione barra multifunzione;
  • Nell'elenco Schede principali (sulla destra) aggiungere il segno di spunta alla voce Sviluppo e cliccare su OK;
    Outlook, Personalizza barra multifunzione
    FIG 1 - Outlook, Personalizza barra multifunzione
  • Avviare Microsoft Visual Basic, Application Edition tramite la combinazione di tasti ALT+F11;
  • Nella visualizzazione ad albero del progetto, sul lato sinistro della finestra, selezionare ThisOutlookSession;
    Outlook, Microsoft Visual Basic Application Edition
    FIG 2 - Outlook, Microsoft Visual Basic Application Edition
  • Copiare e incollare il seguente script;
    Private Sub Application_Startup()
     Dim olExp As Outlook.Explorer
     Dim objInbox As Folder
     Dim objCalendar As Folder
     Dim objContacts As Folder
     Dim objTasks As Folder
    
     Set objInbox = Application.ActiveExplorer.CurrentFolder
     Set objCalendar = Session.GetDefaultFolder(olFolderCalendar)
     Set objContacts = Session.GetDefaultFolder(olFolderContacts)
     Set objTasks = Session.GetDefaultFolder(olFolderTasks)
    
    'Apre la cartella Contatti in una finestra di Outlook ridotta ad icona (olMinimized)
     objContacts.Display
     Set olExp = Application.ActiveExplorer
     With olExp
         .WindowState = olMinimized
     End With
    
    'Apre la cartella Attività in una finestra di Outlook ridotta ad icona (olMinimized)
     objTasks.Display
     Set olExp = Application.ActiveExplorer
     With olExp
         .WindowState = olMinimized
     End With
    
    'Apre la cartella Calendario in una finestra normale di Outlook (olNormalWindow)
     objCalendar.Display
     Set olExp = Application.ActiveExplorer
     With olExp
         .WindowState = olNormalWindow
     End With
    
    'Apre la cartella Posta in arrivo in una finestra massimizzata di Outlook (olMaximized)
     objInbox.Display
     Set Application.ActiveExplorer.CurrentFolder = objInbox
     Set olExp = Application.ActiveExplorer
     olExp.WindowState = olMaximized
    
    End Sub
    
  • Attraverso la proprietà WindowState di Outlook.Explorer è possibile indicare se aprire la cartella in una finestra normale (olNormalWindow), ridotta (olMinimized) o ingrandita (olMaximized).  Salvare lo script cliccando sull'apposita icona e ritornare alla finestra di Outlook;
  • Dalla scheda Sviluppo cliccare su Sicurezza macro;
    Outlook, Sicurezza macro
    FIG 3 - Outlook, Sicurezza macro
  • Dalla finestra Centro protezione, nella sezione Impostazioni macro, selezionare Visualizza notifiche per tutte le macro. In questo modo all'avvio di Outlook verrà richiesto se eseguire la macro.
    Outlook, Visualizza notifiche per tutte le macro
    FIG 4 - Outlook, Visualizza notifiche per tutte le macro
Per agire sulla posizione e sulla dimensione delle finestre aperte si utilizzano le proprietà Top, Left, Height, Width che consentono di specificare la distanza in pixel della finestra dalla parte alta dello schermo, la distanza dal bordo sinistro, l'altezza della finestra e la sua larghezza. 
Ad. es volendo aprire la finestra con il Calendario di Outlook, spostarla in altro a sinistra dello schermo e impostare la dimensione 800x1000 lo script è il seguente:

Private Sub Application_Startup()
 Dim olExp As Outlook.Explorer
 Dim objInbox As Folder
 Dim objCalendar As Folder
 Dim objContacts As Folder
 Dim objTasks As Folder

 Set objInbox = Application.ActiveExplorer.CurrentFolder
 Set objCalendar = Session.GetDefaultFolder(olFolderCalendar)
 Set objContacts = Session.GetDefaultFolder(olFolderContacts)
 Set objTasks = Session.GetDefaultFolder(olFolderTasks)

'Apre la cartella Contatti in una finestra di Outlook ridotta ad icona (olMinimized)
 objContacts.Display
 Set olExp = Application.ActiveExplorer
 With olExp
     .WindowState = olMinimized  
 End With

'Apre la cartella Attività in una finestra di Outlook ridotta ad icona (olMinimized)
 objTasks.Display
 Set olExp = Application.ActiveExplorer
 With olExp
     .WindowState = olMinimized
 End With

'Apre la cartella Calendario in una finestra normale di Outlook (olNormalWindow)
 objCalendar.Display
 Set olExp = Application.ActiveExplorer
 With olExp
     .WindowState = olNormalWindow
     .Top = 0
     .Left = 0
     .Height = 800
     .Width = 1000
 End With

'Apre la cartella Posta in arrivo in una finestra massimizzata di Outlook (olMaximized)
 objInbox.Display
 Set Application.ActiveExplorer.CurrentFolder = objInbox
 Set olExp = Application.ActiveExplorer
 olExp.WindowState = olMaximized

End Sub

Se si vogliono aprire più finestre di Outlook in modo che siano sfalsate tra loro come mostrato in FIG 5, il codice da copiare è il seguente:
Private Sub Application_Startup()
 Dim objInbox As Folder
 Dim objCalendar As Folder
 Dim objContacts As Folder
 Dim objTasks As Folder

 Set objInbox = Application.ActiveExplorer.CurrentFolder
 Set objCalendar = Session.GetDefaultFolder(olFolderCalendar)
 Set objContacts = Session.GetDefaultFolder(olFolderContacts)
 Set objTasks = Session.GetDefaultFolder(olFolderTasks)

 objCalendar.Display
 objContacts.Display
 objTasks.Display

 Dim olExps As Outlook.Explorers
 Set olExps = Application.Explorers

 Dim oTop As Long, oLeft As Long
 oTop = 100
 oLeft = 200

 For x = 1 To olExps.Count

  With olExps.Item(x)
      .WindowState = olNormalWindow
      .Top = oTop
      .Left = oLeft
      .Height = 800
      .Width = 1000
  End With
 oTop = oTop + 50
 oLeft = oLeft + 50

 Next x

 Set Application.ActiveExplorer.CurrentFolder = objInbox
End Sub
Outlook, Finestre sfalsate
FIG 5 - Outlook, Finestre sfalsate