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

giovedì 2 febbraio 2023

MS Word: Rimuovere tutti i commenti all'interno di un documento tramite VBA

Una funzione molto utile presente in MS Word, soprattutto quando il file viene modificato da più persone, è quella dei commenti che permette di inserire note/suggerimenti all'interno del documento.

Per visualizzare i commenti presenti in un documento Word cliccare sul menu Revisione quindi su Mostra commenti.
MS Word, Mostra commenti
FIG 1 - MS Word, Mostra commenti
Per eliminare tutti i commenti è possibile procedere sempre dal menu Revisore, cliccare su Elimina presente nel gruppo Commenti e selezionare Elimina tutti i commenti nel documento
MS Word, Elimina tutti i commenti nel documento
FIG 2 - MS Word, Elimina tutti i commenti nel documento

Eliminare tutti i commenti utilizzando VBA

  • Avviare Microsoft Visual Basic, Application Edition tramite la combinazione di tasti ALT F11;
  • Dal menu Inserisci, selezionare Modulo;
    VBA, Inserisci Modulo
    FIG 3 - VBA, Inserisci Modulo

  • Incollare il seguente codice
     Sub RimuoviTuttiCommenti()  
       Dim n As Long  
       Dim oCommenti As Comments  
       Dim nCommenti As Long  
       Set oCommenti = ActiveDocument.Comments  
       nCommenti = oCommenti.Count  
       For n = nCommenti To 1 Step -1  
        oCommenti(n).Delete  
       Next n  
       Set oCommenti = Nothing  
       MsgBox ("Commenti eliminati: " & nCommenti)  
     End Sub  
       
  • Cliccare sul pulsante Esegui o premere F5;
    Esegui Sub\UserForm
    FIG 4 - Esegui Sub\UserForm

  • Un messaggio visualizzerà il numero di commenti eliminati all'interno del documento.

    Commenti eliminati
    FIG 5 - Commenti eliminati







lunedì 23 gennaio 2023

MS Word: Eliminare Intestazioni e piè di pagina all'interno di un documento

Normalmente, è possibile rimuovere rapidamente tutte le intestazioni e i piè di pagina da un documento MS Word semplicemente facendo doppio clic sul campo dell'intestazione o del piè di pagina, per poi rimuoverli tutti in una sola volta. Se il documento contiene più tipi di intestazione e piè di pagina tale operazione va ripetuta per ciascun tipo, in alternativa è possibile utilizzare la funzione Verifica documento:
Dal menu File di MS Word, nella sezione Informazioni, cliccare su Verifica documento quindi su Controlla documento.
MS Word, Controlla documento
FIG 1 - MS Word, Controlla documento

Dalla finestra di dialogo, deselezionare tutte le opzioni lasciando attiva solo Intestazione, piè di pagina e filigrana e cliccare sul pulsante Controlla.
MS Word, Intestazioni, piè di pagina e filigrane
FIG 2 - MS Word, Intestazioni, piè di pagina e filigrane

Nella finestra successiva cliccare su Rimuovi tutto.
Rimuovi tutto
FIG 3 - Rimuovi tutto
Cliccare su Chiudi per ritornare al documento.

Eliminare Intestazioni e piè di pagina tramite VBA

Per eliminare tutte le intestazioni e piè di pagina presenti all'interno del documento, è possibile utilizzare VBA:
Avviare Microsoft Visual Basic, Application Edition tramite la combinazione di tasti ALT+F11.
Dal menu Inserisci, selezionare Modulo.
VBA, Modulo
FIG 4 - VBA, Modulo

Incollare il seguente codice
 Sub RemoveHeaderAndFooter()  
   Dim oSec As Section  
   Dim oHeader As HeaderFooter  
   Dim oFooter As HeaderFooter  
   For Each oSec In ActiveDocument.Sections  
     For Each oHeader In oSec.Headers  
       If oHeader.Exists Then oHeader.Range.Delete  
     Next oHeader  
           For Each oFooter In oSec.Footers  
       If oFooter.Exists Then oFooter.Range.Delete  
     Next oFooter  
   Next oSec  
   Selection.WholeStory  
   ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader  
   Selection.ParagraphFormat.Borders(wdBorderBottom).LineStyle = wdLineStyleNone  
   ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument  
      MsgBox ("Operazione completata")  
 End Sub  
VBA
FIG 5 - VBA

Cliccare sul pulsante Esegui o premere F5.






martedì 17 gennaio 2023

MS Word: Rimuovere tutti i collegamenti tramite VBA

Per eliminare tutti i collegamenti (hyperlinks) presenti in un documento MS Word è possibile procedere nel seguente modo:
Selezionare l'intero documento premendo la combinazione di tasti CTRL + A;
Premere la combinazione CTRL + SHIFT + F9 per eliminare tutti i collegamenti.

Eliminare tutti i collegamenti utilizzando VBA

Avviare Microsoft Visual Basic, Application Edition tramite la combinazione di tasti ALT+F11.
Dal menu Inserisci, selezionare Modulo
Incollare il seguente codice
 Sub DelAllHyperlinks()  
      Dim nHyperlinks As Long  
      Dim n As Long  
      With ThisDocument  
       nHyperlinks = .Hyperlinks.Count  
       For n = nHyperlinks To 1 Step -1  
            .Hyperlinks(n).Delete  
       Next n  
      End With  
      MsgBox ("Collegamenti eliminati: " & nHyperlinks)  
 End Sub  
   
Cliccare sul pulsante Esegui o premere F5.
Elimina collegamenti
FIG 1 - Elimina collegamenti


Al termine dell'operazione un messaggio visualizzerà il numero di collegamenti eliminati all'interno del documento.


Per eliminare tutti i collegamenti da tutti i documenti MS Word aperti, il codice da copiare è il seguente
 Sub DelHyperlinksInAllOpenDocuments()  
      Dim doc As Document  
      Dim docName As String  
      Dim nHyperlinks As Long  
      Dim nTotHyperlinks As Long  
      Dim nDoc As Long  
      nTotHyperlinks = 0  
      nDoc = 0   
      For Each doc In Application.Documents  
           docName = doc.Name  
           nDoc = nDoc + 1  
           With Documents(docName)  
            nHyperlinks = .Hyperlinks.Count  
            nTotHyperlinks = nTotHyperlinks + nHyperlinks  
            For n = nHyperlinks To 1 Step -1  
                 .Hyperlinks(n).Delete  
            Next n  
           End With  
      Next doc  
      MsgBox ("Documenti Aperti: " & nDoc & vbNewLine & "Collegamenti totali eliminati: " & nTotHyperlinks)  
 End Sub  

Al termine dell'esecuzione verrà visualizzato un messaggio in cui viene indicato il numero di documenti analizzati e il numero totale di collegamenti rimossi.
Collegamenti eliminati dai documenti aperti
FIG 2 - Collegamenti eliminati dai documenti aperti





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   




domenica 8 novembre 2020

MS Outlook: Inserire un emoji in un'email tramite VBA

In Outlook, tramite VBA, è possibile inserire determinate emoji, simboli o testi all'interno del messaggio di posta elettronica. In questo articolo verrà mostrato passo passo come raggiungere tale scopo. Per poter inserire il testo o l'oggetto desiderato a partire dalla posizione del cursore verrà utilizzato Word Object model.

Per le emoji verrà utilizzato il metodo ChrW che restituisce il carattere associato al codice carattere specificato. Al metodo va passato il codice UTF-16 (Unicode Transformation Format 16 bit: una codifica di caratteri Unicode in sequenze di numeri a 16-bit) relativo all'emoji che si vuole inserire. I codici UTF-16 delle emoji possono essere trovati su molti siti online tra cui The Ultimate Emoji Guide.

Prima di poter poter utilizzare i codici con il metodo ChrW bisogna andare a sostituire i caratteri 0x presenti nel codice UTF-16 con &H

Ad esempio:
Supponiamo di voler inserire l'emoji di una torta di compleanno. Ricerchiamola sul sito The Ultimate Emoji Guide (o su uno dei tanti siti online che forniscono i codici UTF-16) e apriamo la relativa pagina. I codici UTF-16 relativi a tale emoji sono 
0xD83C e 0xDF82
per poterli utilizzare con il metodo ChrW dobbiamo sostituire 0x con &H quindi i codici diventano
&HD83C e &DF82

Emoji Torta di compleanno
FIG 1 - Emoji Torta di compleanno

Codice UTF-16 Torta di compleanno
FIG 2 - Codice UTF-16 Torta di compleanno


Vediamo passo passo come procedere:
  • Avviare Outlook;
  • 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, Applications Edition
    FIG 3- Outlook - Microsoft Visual Basic, Applications Edition

  • Copiare e incollare il seguente script;
    Dim strCode As String
    
    Sub InserisciTesto()
    strCode = "Testo inserito tramite VBA "
    Inserisci
    End Sub
    
    Sub InserisciFantasma()
    strCode = ChrW(&HD83D) & ChrW(&HDC7B)
    Inserisci
    End Sub
    
    Sub InserisciTorta()
    strCode = ChrW(&HD83C) & ChrW(&HDF82)
    Inserisci
    End Sub
    
    
    Private Sub Inserisci()
         
    Dim objItem As Object
    Dim objInsp As Outlook.Inspector
    Dim objWord As Word.Application
    Dim objDoc As Word.Document
    Dim objSel As Word.Selection
    
    Set objItem = Application.ActiveInspector.currentItem
    Set objInsp = objItem.GetInspector
    Set objDoc = objInsp.WordEditor
    Set objWord = objDoc.Application
    Set objSel = objWord.Selection
    
    objSel.InsertBefore strCode
    objSel.Move wdCharacter, 1
    
    Set objItem = Nothing
    Set objInsp = Nothing
    Set objDoc = Nothing
    Set objWord = Nothing
    Set objSel = Nothing
    End Sub
  • Dal menu Strumenti->Riferimenti selezionare Microsoft Word 16.0 Object Library e cliccare su OK (16.0 rappresenta la versione di Office);
    Microsoft Word 16.0 Object Library
    FIG 4 - Microsoft Word 16.0 Object Library

  • Salvare lo script cliccando sull'apposita icona e ritornare alla finestra di 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 - Personalizzazione barra multifunzione
    FIG 5 - Outlook, Personalizzazione barra multifunzione

  • Per questioni di sicurezza le macro sono disattivate, pertanto dobbiamo procedere alla loro abilitazione. Dalla scheda Sviluppo cliccare su Sicurezza macro;
    Sicurezza macro
    FIG 6 - Sicurezza macro

  • Dalla finestra Centro protezione, nella sezione Impostazioni macro, selezionare Visualizza notifiche per tutte le macro. In questo modo quando si tenta di avviare la Macro verrà richiesto se attivarla o meno.

    Visualizza notifiche per tutte le macro
    FIG 7 - Visualizza notifiche per tutte le macro
Nel codice abbiamo creato tre procedure: 
  • InserisciTesto, inserisce il testo "Testo inserito tramite VBA" all'interno del messaggio;
  • InserisciFantasma, inserisce l'emoji di un fantasma;
  • InserisciTorta, inserisce l'emoji della torta.
Per inserire le nostre emoji o il nostro testo, nella creazione di un nuovo messaggio basta selezionare il menu Sviluppo quindi cliccare su Macro e, una volta accettata l'attivazione, selezionare una delle 3 procedure indicate.
Macro inserimento Emoji/Testo
FIG 8 - Macro inserimento Emoji/Testo








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





mercoledì 18 gennaio 2017

MS Excel: Ordinare i fogli in ordine alfabetico

Chi utilizza file MS Excel con all'interno numerosi fogli può trovare utile avere la possibilità di poterli ordinare in ordine alfabetico. Purtroppo Excel non dispone di una funzione integrata che esegue tale operazione ma a questa mancanza si può facilmente ovviare utilizzando VBA (Visual Basic for Application):
  • Da Excel, aprire l'editor VBA tramite la combinazione di tasti ALT+F11;
  • Cliccare sul menu Inserisci e selezionare la voce Modulo;
    Excel, VBA Inserisci Modulo
    FIG 1 - Excel, VBA Inserisci Modulo
  • Incollare il seguente codice
    Sub OrdinaFogli()
    Dim i As Integer
    Dim j As Integer
    Dim ordinamento
       ordinamento = InputBox("Digitare 1 per ordinare i fogli in modo crescente (dalla A alla Z), 2 per ordinare i fogli in modo 
  •       decrescente (dalla Z alla A):", "Ordina fogli", "1")
       If ordinamento = "" Then
        Exit Sub
       End If
       If IsNumeric(ordinamento) And ordinamento >= 1 And ordinamento <= 2 Then
         For i = 1 To Sheets.Count
          For j = 1 To Sheets.Count - 1
            If ordinamento = 1 Then
              If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then
                  Sheets(j).Move After:=Sheets(j + 1)
              End If
                 
            ElseIf ordinamento = 2 Then
               If UCase$(Sheets(j).Name) < UCase$(Sheets(j + 1).Name) Then
                    Sheets(j).Move After:=Sheets(j + 1)
               End If
            End If
          Next j
         Next i
         Else
          MsgBox "Il valore inserito non è valido!"
         End If
    
    End Sub
    
    
  • Salvare il progetto (CTRL+S);
  • Chiudere l'editor con la combinazione ALT+Q;

Per richiamare la funzione premere la combinazione ALT+F8, selezionare OrdinaFogli e cliccare sul pulsante Esegui. Nella finestra di dialogo digitare il tipo di ordinamento desiderato:
1 - per ordinare i fogli in modo crescente;
2 - per ordinare i fogli in modo decrescente.
Excel, Esegui funzione
FIG 2 - Excel, Esegui funzione
Indicare il tipo di ordinamento desiderato
FIG 3 - Indicare il tipo di ordinamento desiderato

Cliccando sul link che segue è possibile scaricare un file di testo contenente il codice VBA
DOWNLOAD