Telefonino.net network
 
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. NEI PREFERITI .:: | RSS Forum | RSS News | NEWS web | NEWS software |
| PUBBLICITA' | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | CERCA nel FORUM » |

Torna indietro   WinTricks Forum > WinTricks > Guide

Notices

Chiudi discussione
 
Strumenti discussione
Vecchio 01-06-2014, 10.50.35   #31
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Metodi e Proprietà della Cartella di Lavoro



L'oggetto WorkBook è il "figlio" dell'oggetto Application nella gerarchia degli oggetti di VBA, e rappresenta una singola cartella di lavoro di Excel all'interno dell'applicazione e si riferisce ad un insieme di tutte le cartelle di lavoro attualmente aperte in Excel. Si noti che mentre si lavora con cartelle di lavoro, si utilizzeranno Proprietà e Metodi dell’oggetto cartella di lavoro e per fare riferimento o restituire un oggetto Workbook (singola cartella di lavoro), possono essere utilizzate le seguenti proprietà.


Proprietà Workbooks.Item
L' Item dell'oggetto Workbooks si riferisce ad una singola cartella di lavoro in una collezione e viene rappresentata con questa sintassi: WorkbooksObject.Item (Index), dove Index è il nome della cartella di lavoro o il numero di indice che sarebbe anche possibile omettere utilizzando una sintassi come: WorkbooksObject (WorkbookName) o WorkbooksObject (IndexNumber). Il numero di indice inizia da 1 per il primo foglio aperto o creato e si incrementa per ogni successiva cartella di lavoro, incluse quelle nascoste. L’ultima cartella di lavoro viene restituita dalla proprietà Count in questo modo: Workbooks.Count. La Proprietà WorkbooksObject.Count, restituisce il numero di cartelle di lavoro. Consultare gli esempi sotto riportati di utilizzo di questa proprietà.

Esempio: Chiudere la cartella di lavoro denominata "VBA_1.xlsm"
Codice:
Workbooks.Item ("VBA_1.xlsm"). Close 
'oppure 
Workbooks ("VBA_1.xlsm"). Close
Esempio: Chiudere la cartella di lavoro aperta dopo averla salvata
Codice:
Workbooks(Workbooks.Count).Close  SaveChanges:=True
Esempio : Restituisce il nome della cartella di lavoro con indice 2, cioè la seconda cartella di lavoro che si è aperta/creato
Codice:
MsgBox Workbooks(2).Name
Esempio: Anteprima di stampa della cartella di lavoro con indice 2
Codice:
Workbooks(2).PrintPreview
Esempio: Restituisce il nome dell'ultima cartella di lavoro aperta o creata
Codice:
MsgBox Workbooks(Workbooks.Count).Name
Esempio: Restituire i nomi di tutte le cartelle di lavoro aperte:
Codice:
Sub workbookNames()
Dim i As Integer
For i = 1 To Workbooks.Count
msgbox Workbooks(i).Name
Next i
End Sub
Esempio: Impostare una variabile in una cartella di lavoro:
Codice:
Sub workbookVariable()
Dim wb As Workbook, i As Integer
Set wb = Workbooks("Excel_1.xlsx")
For i = 1 To wb.Worksheets.Count
MsgBox wb.Worksheets(i).Name
Next i
End Sub

Proprietà ActiveWorkbook
Questa proprietà restituisce la cartella di lavoro attiva, cioè la cartella di lavoro nella finestra attiva con questa sintassi: ApplicationObject.ActiveWorkbook, esempio:
Codice:
MsgBox "il nome della cartella attiva è" & ActiveWorkbook.Name
Proprietà ThisWorkbook
Questa proprietà viene utilizzata solo dall'interno dell'applicazione Excel e restituisce la cartella di lavoro in cui il codice viene eseguito al moment con la seguente sintassi:

ApplicationObject.ThisWorkbook
esempio :
Codice:
MsgBox "Il nome di questa cartella di lavoro è" & ThisWorkbook.Name
Si noti che sebbene il più delle volte ActiveWorkbook è la stessa ThisWorkbook, ma potrebbe non essere sempre così, la cartella di lavoro attiva può essere diversa da quella in cui viene eseguito il codice, come illustrato dal seguente esempio di codice.

Esempio: Aprire due file della cartella di lavoro di Excel ("prova1.xlsm" e "prova2.xlsm") in un'unica istanza (questo consentirà a tutte le cartelle di lavoro di accedere alla macro), Inserire il codice nella cartella di lavoro "prova1.xlsm", che è anche la cartella di lavoro attiva
Codice:
Sub ActiveWorkbook_ThisWorkbook()
MsgBox "Il nome della cartella attiva è " & ActiveWorkbook.Name
'Restituisce "prova1.xlsm"
MsgBox " Il nome di questa cartella di lavoro è " & ThisWorkbook.Name
'attiva "prova2.xlsm"
Workbooks("prova2.xlsm").Activate
'ritorna a "prova2.xlsm", mentre ThisWorkbook rimane su "prova1.xlsm"
MsgBox "Il nome della cartella attiva è " & ActiveWorkbook.Name
'ritorna a "prova1.xlsm"
MsgBox " Il nome di questa cartella di lavoro è " & ThisWorkbook.Name
'attiva "prova1.xlsm"
Workbooks("prova1.xlsm").Activate
'ritorna a "prova1.xlsm"
MsgBox "Active Workbook's name is " & ActiveWorkbook.Name
MsgBox "Il nome di questa cartella di lavoro è " & ThisWorkbook.Name
End Sub
Il Metodo Workbooks.Open
Si utilizza il metodo Workbooks.Open per aprire una cartella di lavoro con questa sintassi: WorkbooksObject.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
L'argomento FileName è necessario mentre tutti gli altri argomenti sono facoltativi, vediamo solo alcuni di loro. L’argomento FileName è un valore di tipo String che specifica il nome del file compresa l'estensione e il suo percorso, mentre l’argomento UpdateLinks se impostato non aggiornerà link o riferimenti esterni quando la cartella di lavoro è aperta, mentre specificando il valore 3 aggiornerà i link o riferimenti esterni.

L’argomento ReadOnly impostato a True apre la cartella di lavoro in modalità di sola lettura e l’argomento password è un valore stringa che specifica la password necessaria per aprire una cartella di lavoro protetta da password, omettendo tale argomento verrà richiesto all'utente una password. L’argomento WriteResPassword è un valore stringa che specifica la password necessaria per aprire una cartella di lavoro in scrittura, (es. apertura di questo file senza la password renderà sola lettura), e omettendo tale argomento verrà richiesto all'utente una password. Si noti che quando una cartella di lavoro è aperta a livello di programmazione, le macro sono abilitate di default.


Metodo Workbooks.Add
Si utilizza il metodo Workbooks.Add per creare una nuova cartella di lavoro, che diventa anche la cartella di lavoro usando questa sintassi: WorkbooksObject.Add (modello). Usando questo metodo VBA restituisce un oggetto cartella di lavoro. E 'opzionale specificare il modello, in quanto questo argomento è un valore stringa che specifica il nome (e il percorso) di un file di Excel esistente, e in questo caso il file specificato funge da modello per la nuova cartella di lavoro che viene creato, il che significa che la nuova cartella avrà lo stesso contenuto, formattazione, macro e la personalizzazione del file esistente che è specificato. È inoltre possibile definire una costante
  • xlWBATemplate Enumeration: Per questo argomento, e in questo caso la cartella di lavoro appena creata conterrà un singolo foglio del tipo che è specificato
  • xlWBATChart: Creerà un foglio grafico
  • xlWBATExcel4MacroSheet: Crea una versione di Excel 4 con macro
  • xlWBATExcel4IntlMacroSheet: Crea una versione di Excel 4 con foglio macro internazionale
  • xlWBATWorksheet: Crea un foglio di lavoro.

Tralasciando l'argomento modello si creerà una nuova cartella di lavoro di Excel di default con tre fogli bianchi, in cui il numero predefinito dei fogli può essere modificato/impostato utilizzando la proprietà Application.SheetsInNewWorkbook

Il nome predefinito di una nuova cartella di lavoro quando viene creata utilizzando il metodo Add, e l'argomento modello viene omesso, è denominato CartelN, dove la prima cartella di lavoro sarà Cartel1, seguita da Cartel2, e così via, quando l'argomento modello è la costante xlWBATWorksheet, le cartelle di lavoro sono denominate SheetN e la prima cartella di lavoro creata sarà Foglio1, seguita da Foglio2, e così via

Esempio: Utilizzare il metodo Add per creare una nuova cartella di lavoro
Codice:
Sub WorkbooksAdd()
Dim i As Integer, n As Integer
i = InputBox("Inserire il numero di cartelle da creare")
For n = 1 To i
Workbooks.Add
Next n
End Sub
Il Metodo Close
Si utilizza il metodo Close dell'oggetto Workbooks per chiudere tutte le cartelle di lavoro aperte con questa sintassi: WorkbooksObject.Close è inoltre possibile impostare la proprietà DisplayAlerts su False per non visualizzare alcuna richiesta o avviso alla chiusura di una cartella. Per chiudere tutte le cartelle di lavoro aperte, utilizzare la riga di codice Workbooks.Close, si può utilizzare il metodo Close dell'oggetto Workbook per chiudere una singola cartella di lavoro con questa sintassi: WorkbookObject.Close (SaveChanges, filename, RouteWorkbook).

Tutti gli argomenti sono opzionali da specificare e tralasciando l'argomento SaveChanges verrà richiesto all'utente se salvare le modifiche, nel caso in cui siano state fatte, alla cartella di lavoro dopo l’ultimo salvataggio. Impostando l’argomento SaveChanges a True si salveranno tutte le modifiche apportate alla cartella di lavoro, e se impostato su False, la cartella di lavoro si chiude senza salvare le modifiche apportate e in entrambe le impostazioni la cartella di lavoro si chiude senza visualizzare alcuna richiesta per salvare le modifiche.

L’argomento filename dovrebbe essere utilizzato per specificare un nome di file per chiudere una cartella di lavoro che ancora non ha un nome di file associato, cioè una nuova cartella di lavoro, altrimenti con l'omissione di questo argomento si richiederà all'utente di specificare il nome del file prima di chiuderlo. L’argomento nome del file può essere utilizzato come opzione se si desidera salvare una cartella di lavoro esistente, cioè che ha già un nome associato, con un nuovo nome di file. L’argomento RouteWorkbook impostato a True consente di instradare o inviare al destinatario, se è presente una lista di distribuzione. Esempi di utilizzo di questo metodo:

Esempio: Per chiudere la cartella di lavoro attiva dopo aver salvato le modifiche
Codice:
ActiveWorkbook.Close SaveChanges: = True
Esempio: Per chiudere la cartella di lavoro denominata "prova1.xlsx", dopo aver salvato le modifiche
Codice:
Workbooks ("prova.xlsx"). Close SaveChanges: = True
Esempio: Vari metodi di apertura e chiusura della cartella di lavoro con salvataggio
Codice:
 Sub WorkbookAdd()
Application.DisplayAlerts = False
'spostarsi dalla directory corrente alla directory ThisWorkbook, con ChDir
ChDir ThisWorkbook.Path
'Specificando il nome di un file esistente nella stessa cartella ThisWorkbook e si utilizza come modello 
Workbooks.Add "prova1.xlsx"
MsgBox " Il nome della Nuova cartella di lavoro e il numero di fogli è: " & ActiveWorkbook.Name & "; " & ActiveWorkbook.Sheets.count
'salva come file xls di Excel 97, formato 2003, utilizzando FileFormat Enumeration
ActiveWorkbook.SaveAs fileName:=ActiveWorkbook.Name, FileFormat:=xlExcel8
'Inserire nella cella A1 del foglio attivo "xlsFile" 
ActiveWorkbook.ActiveSheet.Range("A1") = "xlsFile"
‘chiude la cartella di lavoro dopo aver salvato le modifiche
ActiveWorkbook.Close SaveChanges:=True
 
'Creare una nuova cartella di lavoro con tre fogli di lavoro 
Workbooks.Add
MsgBox " Il nome della Nuova cartella di lavoro e il numero di fogli è: " & ActiveWorkbook.Name & "; " & ActiveWorkbook.Sheets.count
'salvare con estensione xlsx (2007) utilizzando FileFormat Enumeration 
ActiveWorkbook.SaveAs fileName:=ActiveWorkbook.Name, FileFormat:=xlOpenXMLWorkbook
'Inserire nella cella A1 del foglio attivo "xlsxFile"
ActiveWorkbook.ActiveSheet.Range("A1") = "xlsxFile"
‘chiude la cartella di lavoro dopo aver salvato le modifiche 
ActiveWorkbook.Close SaveChanges:=True
 
'Modificare il numero predefinito di fogli di lavoro a 5:
Application.SheetsInNewWorkbook = 5
'crea una nuova cartella con cinque fogli 
Workbooks.Add
MsgBox "Il nome della Nuova cartella di lavoro e il numero di fogli è: " & ActiveWorkbook.Name & "; " & ActiveWorkbook.Sheets.count
'salvare la nuova cartella come xlsm, con attivazione macro, utilizzando FileFormat
ActiveWorkbook.SaveAs fileName:="NewWorkbookSaved.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
'Inserire " xlsmFile " nella cella A1 del foglio attivo
ActiveWorkbook.ActiveSheet.Range("A1") = "xlsmFile"
‘chiude la cartella di lavoro dopo aver salvato le modifiche 
ActiveWorkbook.Close SaveChanges:=True
 
'Creare una nuova cartella di lavoro contenente un foglio di lavoro
Workbooks.Add (xlWBATWorksheet)
MsgBox " Il nome della Nuova cartella di lavoro e il numero di fogli è: " & ActiveWorkbook.Name & "; " & ActiveWorkbook.Sheets.count
'salvare la nuova cartella di lavoro, omettendo il formato file, verrà salvato nel formato predefinito della versione di Excel
ActiveWorkbook.SaveAs fileName:=ActiveWorkbook.Name
'Inserisce "DefaultFileFormat" nella cella A1 del foglio attivo
ActiveWorkbook.ActiveSheet.Range("A1") = "DefaultFileFormat"
‘chiude la cartella di lavoro dopo aver salvato le modifiche 
ActiveWorkbook.Close SaveChanges:=True
 
'Creare una nuova cartella di lavoro contenente un foglio grafico
Workbooks.Add (xlWBATChart)
MsgBox "Il nome della Nuova cartella di lavoro e il numero di fogli è: " & ActiveWorkbook.Name & "; " & ActiveWorkbook.Sheets.count
‘salva con estensione xlsx, utilizzando il FileFormat 
ActiveWorkbook.SaveAs fileName:=ActiveWorkbook.Name, FileFormat:=xlOpenXMLWorkbook
'chiude la cartella di lavoro
ActiveWorkbook.Close

'ripristino proprietà DisplayAlerts per visualizzare gli avvisi
Application.DisplayAlerts = True
'Si potrebbe ripristinare il valore predefinito di Excel 2007 di tre fogli bianchi, perché il valore impostato utilizzando la proprietà SheetsInNewWorkbook verrà trattenuto dopo questa sessione.
Application.SheetsInNewWorkbook = 3
End Sub
Il Metodo Workbook.SaveCopyAs
Si utilizza il metodo Workbook.SaveCopyAs per salvare una copia della cartella di lavoro e questo metodo non modifica la cartella di lavoro aperta con questa sintassi: WorkbookObject.SaveCopyAs (filename). L’argomento filename è facoltativo e viene utilizzato per specificare il nome del file con cui viene memorizzata la copia della cartella di lavoro. Si noti che il metodo Workbook.SaveCopyAs permette di salvare con lo stesso formato di file, cioè la cartella di lavoro e la sua copia devono avere lo stesso formato di file, altrimenti durante l'apertura della copia salvata otterrete un messaggio - "Il file che si sta cercando di aprire è in un formato diverso da quello specificato dall'estensione del file ... " ed è possibile che il file non possa venire aperto.

Esempio: Utilizzare il metodo Workbook.SaveCopyAs per salvare una copia della cartella di lavoro attiva
Codice:
Sub WorkbookSaveCopyAs1()
Dim LastRow As Long
'Determinare l'ultima riga scritta nella colonna "A"
LastRow = ActiveWorkbook.ActiveSheet.Range("A" & Rows.count).End(xlUp).Row
'Salvare una copia della cartella di lavoro se i dati in una colonna del foglio attivo è maggiore di un numero specifico di righe
If LastRow >= 100 Then
'Salvare una copia della cartella di lavoro attiva specificando un nome di file
ActiveWorkbook.SaveCopyAs "C:\Document\Test\Copia_1.xlsm"
End If
'La cartella di lavoro corrente rimane la cartella attiva, la copia è stata salvata e chiusa
MsgBox ActiveWorkbook.Name
End Sub
Esempio: Utilizzare il metodo Workbook.SaveCopyAs per salvare una copia di ThisWorkbook con un nome univoco ogni volta.
Codice:
Sub WorkbookSaveCopyAs2()
Dim fname As String, extn As String, MyStr As String
Dim i As Integer, lastDot As Integer
'cambiare la directory corrente alla directory ThisWorkbook
ChDir ThisWorkbook.Path
'Trovare la posizione del punto per distinguere l’estensione del file
For i = 1 To Len(ThisWorkbook.Name)
If Mid(ThisWorkbook.Name, i, 1) = "." Then
lastDot = i
End If
Next i
'Estensione del file estratta e dot prima estensione
extn = Right(ThisWorkbook.Name, Len(ThisWorkbook.Name) - lastDot + 1)
'nome della cartella estratto escluso l'estensione dal punto
MyStr = Left(ThisWorkbook.Name, lastDot - 1)
'specificare il nome per la copia. Parte del nome del file renderà il nome univoco
fname = MyStr & "_" & Format(Now(), "yyyy-mm-dd hh-mm-ss AMPM") & extn
'salvare una copia di ThisWorkbook specificando un nome di file 
ThisWorkbook.SaveCopyAs fname
'la cartella di lavoro corrente rimane la cartella di lavoro attiva, la copia salvata rimane chiusa
MsgBox ActiveWorkbook.Name
End Sub
Esempio: Utilizzare il metodo Workbook.SaveCopyAs per salvare una copia della cartella di lavoro specificata.
Codice:
Sub WorkbookSaveCopyAs3()
'Aprire una cartella di lavoro specificata nella directory corrente
Workbooks.Open "C:\Documenti\Test\prova_3.xlsx"
'la cartella di lavoro aperta diventa la cartella attiva di lavoro 
MsgBox ActiveWorkbook.Name
'salvare una copia della cartella di lavoro aperta, specificando un nome di file 
ActiveWorkbook.SaveCopyAs "C:\Documenti\Test\Copia_di_prova3.xlsx"
'la cartella di lavoro aperta rimane la cartella di lavoro attiva, la copia salvata rimane chiusa
MsgBox ActiveWorkbook.Name
'chiudere la cartella di lavoro aperta - notare che né la cartella di lavoro aperta o la copia salvata saranno aperti dopo questo comando
ActiveWorkbook.Close
End Sub
Il metodo Workbook.Save
Si utilizza il metodo Workbook.Save per salvare una cartella di lavoro specificata con questa sintassi: WorkbookObject.Save. Esempio: Salvare la cartella di lavoro denominato "prova_1.xlsm":
Codice:
Workbooks ("prova_1.xlsm"). Save
Si utilizza l'argomento SaveChanges del metodo Close dell'oggetto Workbook , per salvare la cartella di lavoro prima della chiusura. esempio per chiudere la cartella di lavoro dopo averla salvata:
Codice:
Workbooks(Workbooks.Count).Close SaveChanges:=True
Si utilizzare il metodo Workbook.SaveAs per salvare le modifiche della cartella di lavoro in un file separato con questa sintassi: WorkbookObject.SaveAs (FileName, FileFormat, password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout , locale). Tutti gli argomenti sono opzionali, vediamo solo alcuni di loro. L’argomento FileName è un valore di tipo String che specifica il nome del file compresa l'estensione e il suo percorso, omettendo il percorso il file verrà salvato nella directory corrente, mentre FileFormat specifica il formato del file da salvare, il formato predefinito è la versione corrente di Excel, mentre per un file esistente l'impostazione predefinita è il formato del file che era specificato. Si ricorda che in Excel 2007-2010 durante l'utilizzo SaveAs, è necessario specificare il parametro FileFormat per salvare un nome di file con estensione Xlsm se la cartella di lavoro in fase di salvataggio non è un file Xlsm, vale a dire:
Codice:
FileFormat: = xlOpenXMLWorkbookMacroEnabled
È possibile specificare una password case-sensitive fino a 15 caratteri per l'apertura del file, utilizzando l’argomento password specificando una password per aprire un file, se non si inserisce la password si aprirà in sola lettura utilizzando l’argomento WriteResPassword per specificare la password.

Esempio: Salvare una cartella di lavoro esistente con un nuovo nome e formato
Codice:
Sub workbookSaveAs1()
'salvare la cartella di lavoro con indice 2 e con un nuovo nome e formato del file. ricordate che tutti i file dovrebbero essere 'aperti in una singola istanza di Excel.
'Ricordate che in Excel 2007-2010 durante l'utilizzo di SaveAs, è necessario specificare il parametro FileFormat per salvare un nome di file con estensione xlsm se la cartella di lavoro non è un file xlsm cioè... FileFormat: = ‘xlOpenXMLWorkbookMacroEnabled o FileFormat: = . 52 
‘salvare il file xlsm come file xlsm, in Excel 2007
Workbooks(2).SaveAs "Workbook_cambiato.xlsm"
End Sub
Esempio: Salvataggio di una nuova cartella di lavoro:
Codice:
Sub workbookSaveAs2()
'aggiungere una nuova cartella di lavoro
Workbooks.Add
'salvare la nuova cartella di lavoro, che diventa la cartella di lavoro attiva, protetta da password
ActiveWorkbook.SaveAs fileName:="Nuova_cart.xlsx", Password:="abc123"
'salvare la nuova cartella di lavoro come un file xlsm con password di protezione
'ActiveWorkbook.SaveAs fileName:="Nuova_cart.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, Password:="abc123"
'salvare la nuova cartella di lavoro come file xlsm con password di protezione, ma può essere aperta in sola lettura senza fornire la password
ActiveWorkbook.SaveAs fileName:="Nuova_cart.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123"
End Sub
Si utilizza la proprietà Workbook.Saved per determinare se sono state apportate modifiche alla cartella di lavoro dopo l’ultimo salvataggio con questa sintassi: WorkbookObject .Saved che restituisce un valore booleano, dove True indica che la cartella di lavoro non è stata modificata dopo l'ultimo salvataggio. L'impostazione di questa proprietà su True prima di chiudere una cartella di lavoro in cui sono state apportate modifiche non chiederà di salvare la cartella di lavoro e non verranno salvate le modifiche.

Esempio: Impostare la proprietà Workbook.Saved a True per chiudere la cartella di lavoro con nessuna richiesta di salvare le modifiche:
Codice:
Sub workbookSaved()
'Aprire una cartella di lavoro
Workbooks.Open "C:\Documents\prova5.xlsx"
'Workbook.Saved restituirà true a indicare che non sono state apportate modifiche alla cartella di lavoro dopo che è stata salvata l'ultima volta
MsgBox Workbooks("prova5").Saved
'modifichiamo la cartella di lavoro 
Workbooks("prova5.xlsx").ActiveSheet.Range("A1") = "Ciao Mondo!"
'Workbook.Saved restituirà False per indicare che le modifiche sono state apportate alla cartella di lavoro dopo che è stata salvata l'ultima volta 
MsgBox Workbooks("prova5.xlsx").Saved
'impostare la proprietà Workbook.Saved su true
Workbooks("prova5.xlsx").Saved = True
'chiudere la cartella di lavoro con nessuna richiesta di salvare le modifiche e questo NON salverà le eventuali modifiche. Se la proprietà Saved non è stata impostata su True si otterrà un prompt per salvare le modifiche
Workbooks("prova5.xlsx").Close
End Sub
Il Metodo Workbook.Activate
Si utilizza il metodo Workbook.Activate per attivare una cartella di lavoro e se la cartella di lavoro dispone di più finestre, il metodo attiva la prima finestra. Sintassi: WorkbookObject.Activate . Per attivare la cartella di lavoro denominato "prova5.xlsx", utilizzare il codice
Codice:
Workbooks ("prova5.xlsx"). Activate
Il Metodo Workbook.PrintPreview
Si utilizza il metodo Workbook.PrintPreview per visualizzare un'anteprima di come verrà stampata la cartella con questa sintassi: WorkbookObject.PrintPreview (EnableChanges). E 'facoltativo specificare l'argomento EnableChanges, che accetta un valore booleano (il valore predefinito è True), per consentire o non consentire all'utente di modificare le opzioni di impostazione della pagina (es. orientamento della pagina, il ridimensionamento, i margini, ecc) disponibili in anteprima di stampa.

Esempio: Utilizzo di PrintPreview
Codice:
Sub PrintPreview()
'Anteprima di stampa del foglio attivo della cartella di lavoro, impedendo all'utente di cambiare le impostazione della pagina di anteprima di stampa.
Workbooks("prova5.xlsx").PrintPreview EnableChanges:=False
'anteprima di stampa di "Foglio3" di "prova5.xlsx, permettendo all'utente di cambiare le impostazioni di pagina disponibili in anteprima di stampa.
Workbooks("prova5.xlsx").Worksheets("Foglio3").PrintPreview EnableChanges:=True
End Sub
Il Metodo Workbook.SendMail
Molte persone utilizzano Outlook come client per la posta elettronica, è possibile automatizzare Outlook, consentendo maggiori funzionalità di inviare e-mail, lavorando con gli oggetti di Outlook utilizzando VBA in Excel. L'automazione è un processo mediante il quale una applicazione comunica o controlla con un'altra applicazione e un'opzione per inviare e-mail da Excel è quella di utilizzare il metodo Workbook.SendMail. Con il metodo Workbook.SendMail , si utilizza il sistema di posta installato per inviare una cartella di lavoro.

Sintassi: WorkbookObject.SendMail(Recipients, Subject, ReturnReceipt)).

L’argomento Recipients è necessario per specificare un singolo destinatario o più destinatari come testo o un array di stringhe di testo, rispettivamente e l’argomento Subject è facoltativo e viene utilizzato per specificare l'oggetto della mail e se si omette questo argomento di default verrà usato il nome della cartella di lavoro come oggetto. L’argomento ReturnReceipt è facoltativo, se viene usato si specifica il suo valore, che può essere True o False e indica la richiesta di richiedere una ricevuta di ritorno, il valore predefinito è False. Per inserire il nome del destinatario come testo:
Codice:
ActiveWorkbook.SendMail Recipients:="nome_destinatario"
Esempio: Inviare una cartella di lavoro, specificando il nome del destinatario o indirizzo email
Codice:
Sub inviaM_1()
Workbooks.Open ("C:\Documents\Test1\prova1.xlsx")
'specificare il nome del destinatario come testo
ActiveWorkbook.SendMail Recipients:="Gino Primo", Subject:="Ciao", ReturnReceipt:=True
'specifica indirizzo e-mail di destinazione
ActiveWorkbook.SendMail Recipients:="info@gino.com", Subject:="Ciao", ReturnReceipt:=True
End Sub
Esempio: Inviare cartella di lavoro, specificando più destinatari.
Codice:
Sub inviaM_2()
'Specificare più destinatari 
ThisWorkbook.SendMail Array("Gino Primo", "Beppe Secondo")
'specificare più indirizzi e-mail come destinazione
ThisWorkbook.SendMail Array(" info@gino.com", " info@beppe.com")
End Sub
Esempio: Inviare un foglio Excel con il metodo Sendmail.
Codice:
Sub inviaM_3()
Dim name1 As String, name2 As String
Dim wb As Workbook
'cambiare la directory corrente alla directory ThisWorkbook, utilizzando ChDir  
ChDir ThisWorkbook.Path
Path 'crea una nuova cartella di lavoro con un unico foglio da copiare da ThisWorkbook ThisWorkbook.Worksheets("Foglio1").Copy
'impostare la variabile wb per la nuova cartella di lavoro, che diventa la cartella di lavoro attiva
Set wb = ActiveWorkbook
'rinominare il foglio nella nuova cartella di lavoro 
wb.Sheets("Foglio1").Name = "Nuovo Foglio"
'salvare la nuova cartella di lavoro con un nome di file, nella cartella predefinita 
wb.SaveAs fileName:="NuovoF.xlsx"
'assegnare delle variabili per I destinatari
name1 = "Gino Primo"
name2 = "Beppe Secondo"
'Inserire i nomi dei destinatari in una matrice
wb.SendMail Array(name1, name2), Subject:=ThisWorkbook.Worksheets("Foglio1").Range("A1"), ReturnReceipt:=False
'chiudere la nuova cartella di lavoro
wb.Close
End Sub
Esempio: Inviare la cartella di lavoro, specificando il destinatario in una cella del foglio di lavoro, con l'indicazione della data in oggetto.
Codice:
Sub inviaM_4() 
Dim strRec As String
'La cella A14 contiene: info@gino.com
strRec = ThisWorkbook.Sheets("Foglio1").Range("A14").Value
'l’oggetto apparirà come "Si prega di controllare 10/08/2014 10:43:06 "
ActiveWorkbook.SendMail Recipients:=strRec, Subject:="Si prega di controllare " & Format(Now, "dd/mm/yyyy hh:mm:ss AMPM")
End Sub
Esempio: Inviare la cartella di lavoro, specificando più destinatari da intervallo di prospetto.
Codice:
Sub inviaM_5()
Dim MyArr As Variant
'la cella A14 contiene info@gino.com, e la cella A15 contiene info@beppe.com
ActiveWorkbook.SendMail Recipients:=ThisWorkbook.Sheets("Foglio1").Range("A14:A15").Value
MyArr = ThisWorkbook.Sheets("Foglio1").Range("A14:A15")
ActiveWorkbook.SendMail Recipients:=MyArr
'La cella A10 contiene gino Primo la cella A11 contiene beppe secondo, in A14 è stato inserito info@gino.com, e in A15 info@beppe.com
‘Gli intervalli sono stati nominati "nomi_1"=Range("A10:A11"), "email_1"=Range("A14:A15")
MyArr = ThisWorkbook.Sheets("Sheet1").Range("nomi_1")
MyArr = ThisWorkbook.Sheets("Sheet1").Range("email_1")
ActiveWorkbook.SendMail Recipients:=MyArr
End Sub
La Proprietà Workbook.ActiveSheet
Questa proprietà restituisce la scheda attualmente attiva in una cartella di lavoro e si usa con questa sintassi: WorkbookObject.ActiveSheet. Se appaiono più finestre per una cartella di lavoro, ActiveSheet potrebbe essere diversa per ogni finestra, se non c'è un foglio attivo, questa proprietà restituisce Nothing. Utilizzare il metodo Activate dell'oggetto foglio di lavoro per attivarne una, cioè attivare un foglio. Per esempio
Codice:
ActiveWorkbook.Sheets ("Foglio3"). Activate
attiverà il foglio denominato "Foglio3" nella cartella di lavoro attiva, il cui nome verrà visualizzato da
Codice:
MsgBox ActiveWorkbook.ActiveSheet.Name
La Proprietà Workbook.ActiveChart
Questa proprietà restituisce il grafico attualmente attivo, che può essere un foglio grafico o un grafico incorporato. Sintassi: WorkbookObject.ActiveChart, se non c'è un grafico attivo, questa proprietà restituisce Nothing. Si utilizza il metodo Activate della 'oggetto Chart' o 'oggetto ChartObject' per attivare rispettivamente un foglio grafico o un grafico incorporato, tenendo presente che un foglio grafico è attivo se selezionato dall'utente o attivato utilizzando il metodo Activate. Vedi esempio sotto riportato

Esempio: Illustrare proprietà ActiveChart e metodo Activate.
Codice:
Sub attiva_graf() 
'Attivare il foglio grafico denominato "Chart1"
ActiveWorkbook.Sheets("Chart1").activate
'In alternativa, per attivare un foglio grafico: 'ActiveWorkbook.Charts (1). activate 'restituisce il grafico attivo - "Chart1"
MsgBox ActiveWorkbook.ActiveChart.Name
'attivare il grafico incorporato denominato "Grafico 13" in "Foglio2", utilizzando il metodo Activate 
ActiveWorkbook.Sheets("Foglio2").ChartObjects("Chart 13").activate
'In alternativa, per attivare il grafico 1 nel "Foglio2" ActiveWorkbook.Sheets ("Foglio2") ChartObjects (1).Activate, restituisce il grafico attivo - "Foglio2 Chart 13"
MsgBox ActiveWorkbook.ActiveChart.Name
'Aggiungere un titolo al grafico attivo (grafico incorporato denominato "Chart 13" in "Foglio2"):
With ActiveWorkbook.ActiveChart
.HasTitle = True
.ChartTitle.Text = "Ems_Grafico1"
End With
'Restituisce il titolo del grafico attivo - "Ems_Grafico1"
MsgBox ActiveWorkbook.ActiveChart.ChartTitle.Text
End Sub
La Proprietà Workbook.FileFormat
Questa proprietà restituisce il formato del file della cartella di lavoro. Sintassi: WorkbookObject.FileFormat ed è di sola lettura, inoltre è possibile specificare o impostare il formato di file durante il salvataggio di una cartella di lavoro esistente o nuova utilizzando il metodo Workbook.SaveAs (discusso sopra).


La Proprietà Workbook.Name
Questa proprietà restituisce il nome di una cartella di lavoro (valore stringa). Sintassi: WorkbookObject.Name ed è di sola lettura e non è possibile modificare il nome della cartella di lavoro. È tuttavia possibile utilizzare il metodo Workbook.SaveAs per salvare una cartella di lavoro esistente (in un nuovo file) con un nuovo nome o salvare una nuova cartella di lavoro con nome.

Codice:
Sub WorkbookName () 
'restituire i nomi di tutte le cartelle di lavoro aperte
 Dim i As Integer, conta As Integer 
'restituisce il numero delle cartelle di lavoro  
count = Workbooks.Count
'Restituisce i nomi di tutte le cartelle
For i = 1 To count
MsgBox Workbooks(i).Name
Next i
End Sub
La Proprietà Workbook.Password
Si utilizza questa proprietà per impostare o restituire una password per l'apertura di una cartella di lavoro e si tratta di una proprietà di lettura/scrittura con la seguente sintassi: WorkbookObject.Password. Vedere l’esempio sottostante che illustra come impostare una password per aprire una cartella di lavoro e modificare e cancellare una password esistente.

Esempio: Imposta una password per la cartella di lavoro da aprire, cambiare password, eliminare password.
Codice:
Sub pass_cart() 
Application.DisplayAlerts = False
Dim fpath As String, fname As String, Pswd As String, newPswd As String
'specificare il nome completo (cioè il percorso e nome) del file da aprire
fpath = "C:\Documents\Test1"
fname = "prova1.xlsx"
'specificare la password per aprire il file
Pswd = "123"
newPswd = "abc"

'aprire la cartella di lavoro senza password
Workbooks.Open fileName:=(fpath & "\" & fname)
'imposta password
ActiveWorkbook.Password = Pswd
'chiudi la cartella salvando le modifiche
ActiveWorkbook.Close SaveChanges:=True

'apri la cartella di lavoro con una password e aggiorna link o riferimenti esterni 
Workbooks.Open fileName:=(fpath & "\" & fname), UpdateLinks:=3, Password:=Pswd
'il file verrà salvato senza visualizzare alcuna richiesta 
ActiveWorkbook.SaveAs fileName:=(fpath & "\" & fname), Password:=newPswd
'chiudi la cartella salvando le modifiche 
ActiveWorkbook.Close SaveChanges:=True

'apri la cartella di lavoro con una password e aggiorna link o riferimenti esterni
Workbooks.Open fileName:=(fpath & "\" & fname), UpdateLinks:=3, Password:=newPswd
'il file verrà salvato senza visualizzare alcuna richiesta 
ActiveWorkbook.SaveAs fileName:=(fpath & "\" & fname), Password:=""
'chiudi la cartella salvando le modifiche 
ActiveWorkbook.Close SaveChanges:=True
Application.DisplayAlerts = True
End Sub
La Proprietò Workbook.Path
Si utilizza questa proprietà per restituire il percorso (valore stringa) completa della cartella di lavoro Sintassi: WorkbookObject.Path.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 02-06-2014, 11.16.56   #32
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
#2

Oggetti: Nozioni generali



La programmazione VBA è utilizzata per ottenere una migliore funzionalità di calcolo, per automatizzare le operazioni ripetitive e per integrare Excel con altre applicazioni di Office. Le istruzioni date a Excel sono sotto forma di codice, e vengono chiamate macro o procedure e sono sviluppate in Visual Basic Editor (VBE), che è l'ambiente di sviluppo VBA. Utilizzando il VBA è possibile facilitare le operazioni necessarie per ottenere un risultato, sia esso di calcolo che di ricerca, attraverso delle azioni svolte su un oggetto, in pratica, attraverso un semplice Click su un pulsante, il computer elabora una serie di dati, agevolando così il nostro lavoro.
È necessario, per prima cosa, illustrare alcune piccole terminologie di base che identificano le varie fasi della programmazione, ricordando che ogni oggetto, o controllo, presente nella casella degli strumenti è dotato di un insieme di proprietà, metodi ed eventi.


Oggetti, Proprietà e Metodi
Un oggetto è una “cosa” che contiene i dati e ha proprietà e metodi e sono una parte fondamentale della programmazione VBA. Gli oggetti sono la cartella di lavoro, il foglio di lavoro, un pulsante di comando, i font, i pulsanti di opzione che andiamo ad inserire su un foglio e ai quali affidiamo il compito di eseguire una determinata azione
Le Proprietà sono le caratteristiche o gli attributi che descrivono l'oggetto, come il nome, il colore, la dimensione, e definiscono il comportamento di un oggetto, se è visibile o abilitato. I dati o le informazioni di un oggetto possono essere raggiunti con proprietà o metodi, dove il metodo è un'azione eseguita da un oggetto tramite un codice VBA che farà sì che l'oggetto esegua un'azione.
I metodi sono le istruzioni, impartite ad un oggetto, relative alle azioni che deve intraprendere in risposta ad un evento. Ogni tipo di oggetto ha un elenco di metodi diversi e specifici, per esempio una Userform può compiere azioni come: Unload (il form si cancella dalla memoria temporanea del computer per lasciare il posto ad un altro form o per terminare il programma), Hide (il form si nasconde durante l’esecuzione del programma), Show (il form si mostra in un momento determinato, durante l’esecuzione del programma), etc.
Gli Eventi sono le azioni, che vengono svolte durante l’utilizzo del programma dall'utente finale e sono connesse ad un oggetto. Una routine evento (un codice VBA) viene attivata quando si verifica un evento come l’apertura, la chiusura, l’attivazione o disattivazione della cartella di lavoro, la selezione di una cella o cambiando la selezione delle celle in un foglio di lavoro, fare un cambiamento nel contenuto di un foglio di lavoro, la selezione o l'attivazione di un foglio di lavoro, e così via. Excel dispone di routine evento che sono procedure richiamate automaticamente quando un oggetto riconosce il verificarsi di un evento.
Le procedure di evento sono collegate a oggetti come la cartella di lavoro, il foglio di lavoro, i grafici, le Form o i vari controlli e sono attivate da un evento predefinito. Vengono installate all'interno di Excel con un nome standard e predeterminato, come la procedura di modifica del foglio di lavoro viene installata con il foglio di lavoro e denominata "Private Sub Worksheet_Change". In questa routine l'oggetto foglio di lavoro è associato all'evento Change, che contiene un codice personalizzato che viene eseguito automaticamente quando si modifica il contenuto di una cella del foglio di lavoro.

Il modello a oggetti Application rappresenta l’intera applicazione Excel e contiene tutti gli oggetti di programmazione legati gli uni agli altri in una gerarchia. L’oggetto Application è in cima alla gerarchia di oggetti di Excel e spostandosi verso il basso è possibile accedere all'oggetto cartella di lavoro (Workbook), ai fogli di lavoro (Wotsheet), alle Celle etc.
Gli oggetti di Excel sono accessibili attraverso oggetti "padri", il foglio di lavoro è il genitore dell'oggetto Range (Celle), la cartella di lavoro (Workbook) è il padre dell'oggetto foglio di lavoro (Worksheet), e l'oggetto Application è il padre dell'oggetto Workbook. Prima di inoltraci ulteriormente negli argomenti è opportuno almeno conoscere il significato di certi termini e aspetti della programmazione VBA. In questa fase indicheremo in maniera marginale il significato e la sintassi di certi argomenti, che verranno ampiamente trattati nel proseguo del corso in maniera più chiara ed esauriente.

L'insieme Workbooks
Come abbiamo poco sopra affermato l’oggetto Workbook rappresenta una cartella di lavoro di Microsoft Excel, ed è un elemento dell'insieme Workbooks che contiene tutti gli oggetti Workbook aperti in Microsoft Excel. Vediamo alcuni esempi di metodi e proprietà per l’oggetto Workbook.

Workbooks.Close ==> [chiude tutte le cartelle di lavoro aperte]
Workbooks.Add ==> [aggiunge una nuova cartella di lavoro vuota]
Workbooks(1).Activate ==> [attiva la prima cartella di lavoro aperta]

Il numero di indice determina l'ordine nel quale le cartelle di lavoro sono state aperte o create, per cui: Workbooks(1) rappresenta la prima cartella di lavoro creata

L'insieme Worksheets
L’insieme Worksheets è un insieme di tutti gli oggetti Worksheet nella cartella di lavoro specificata o attiva e ciascun oggetto Worksheet rappresenta un foglio di lavoro.

Worksheets(1) ==> [è il primo foglio di lavoro a sinistra della cartella di lavoro]
Worksheets(1).Visible = False ==> [nasconde il foglio 1 della cartella di lavoro attiva]
Worksheets("Foglio1").Activate ==> [attiva Foglio1]

Quando il foglio attivo è un foglio di lavoro, per farvi riferimento è possibile utilizzare la proprietà "ActiveSheet"

ActiveSheet.Name = "Archivio" ==> [imposta il nome al foglio attivo]
MsgBox ActiveSheet.Name ==> [riporta il nome del foglio attivo]
ActiveSheet.PrintOut ==> [stampa il foglio di lavoro]

L'insieme Sheets
Sheets è l’insieme di tutti i fogli della cartella di lavoro specificata o attiva e può contenere l'oggetto Chart (grafico) o Worksheet (foglio di lavoro).

Sheets.PrintOut ==> [stampa tutti i fogli della cartella di lavoro attiva]
Sheets("Foglio1").Activate ==> [attiva Foglio1]

L'insieme Range
Rappresenta una cella, una riga, una colonna, una selezione di celle contenente uno o più blocchi contigui di celle. Per restituire un oggetto Range che rappresenta una singola cella o un intervallo di celle, la modalità di utilizzo è

Worksheets("Foglio1").Range("A5").Value = 15 ==> [Inserisce il valore 15 nella cella A5]

Quando viene utilizzata senza qualificatore di oggetto (vale a dire l’oggetto prima del punto), la proprietà Range restituisce un intervallo del foglio attivo. Si può utilizzare il metodo Activate per attivare un foglio di lavoro prima di utilizzare la proprietà Range senza il qualificatore di oggetto

Worksheets("Foglio1").Activate
Range("A1:A10").Formula = "=Rand()" ==> [inseriamo un numero causale nell’intervallo specificato]

La Proprietà Cells
La proprietà Cells restituisce un oggetto che rappresenta tutte le celle del foglio di lavoro attivo e la modalità di utilizzo è Cells(row, column) dove row è l'indice di riga e column è l'indice della colonna, per restituire una singola cella.

Worksheets(1).Cells(1, 1).Value = 15 ==> [imposta il valore della cella A1 a 15]
ActiveSheet.Cells(2, 1).Formula = "=Somma(A1:B10)" ==> [imposta la formula nella cella A2]

La Proprietà Columns
Per un oggetto Application restituisce un oggetto che rappresenta tutte le colonne del foglio di lavoro attivo mentre per un oggetto Range restituisce le righe dell’intervallo specificato. Utilizzare questa proprietà senza un qualificatore di oggetto equivale ad ActiveSheet.Columns.

Worksheets("Foglio1").Columns(1).Font.Bold = True ==> [imposta il carattere grassetto alla Colonna A di Foglio1]
Columns(1).Value = 0 ==> [imposta il valore di tutte le celle a zero della colonna 1]

La Proprietà Rows
Per un oggetto Application, restituisce un oggetto che rappresenta tutte le righe del foglio di lavoro attivo mentre per un oggetto Worksheet, restituisce tutte le righe del foglio di lavoro specificato. Utilizzare questa proprietà senza un qualificatore di oggetto equivale a ActiveSheet.Rows.

Worksheets("Foglio1").Rows(3).Delete ==> [elimina la riga 3 di Foglio1]
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 08-06-2014, 01.11.10   #33
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Creare e richiamare procedure Sub e Funzioni




Se volete sviluppare una applicazione VBE, una delle prime cose che dovete sapere è la differenza tra Funzioni e Subroutine, quest’ultime note anche come Procedure Sub. In entrambi i casi si tratta di una sorta di "raggruppamento" di istruzioni che svolgono un'operazione comune, e per questo sono molto simili, praticamente tutto il codice di un programma è contenuto all'interno di funzioni e routine. Conoscere la differenza tra i due tipi di procedure aiuterà a prendere la decisione giusta su quale usare, in quanto consentono di suddividere il codice in blocchi, ognuno dotato di una propria specifica funzionalità, evitando ripetizioni e garantendo una miglior leggibilità del codice stesso. La differenza fondamentale tra le due è che le procedure eseguono operazioni di tipo generale, come una serie di istruzioni collegate ad un evento o richiamate nel codice principale, mentre le funzioni rappresentano un procedimento di calcolo o una elaborazione che deve restituire un valore come risultato al programma chiamante.

Se si scrive lo stesso codice più volte, l’applicazione che state costruendo potrebbe beneficiare di una procedura, piuttosto che duplicare il codice in più posizioni, che oltre a rendere più difficoltosa l’operazione di Debug rende il programma stesso più grande di quanto dovrebbe essere. Una procedura è indicata anche con il termine di macro, che è rappresentata come un insieme di codici che rendono Excel in grado di eseguire un'azione. Una procedura è una sequenza di istruzioni che inizia con la parole chiave Sub, seguita dal nome della routine, e poi da due parentesi, al cui interno è possibile inserire dei parametri (opzionali) richiesti della procedura, ai quali non c'è limite, come numero, e termina con la parola chiave End Sub

La procedura Sub
Sub è la forma breve di sotto-routine, ed è utilizzata per gestire una certa attività all'interno di un programma. Le subroutine vengono usate per dividere i task in singole procedure, cosa molto utile in quanto la divisione di un programma in procedure e sotto procedure lo rende più leggibile e riduce le probabilità di errore. Le subroutine possono accettare alcuni argomenti come parametri ma non restituiscono nessun valore alla procedura o alla funzione chiamante. Una procedura Sub inizia con la parola chiave Sub, seguita dal nome e poi da una serie di parentesi e termina con l'istruzione End Sub nel mezzo tra le due parole chiave va inserito il codice. La sintassi è:
Codice:
Sub nome_routine ()
‘istruzioni della subroutine
End Sub
Oppure, nel caso si voglia passare dei parametri alla Sub si usa questa sintassi:
Codice:
Sub nome_routine (param1 As tipo, param2 As tipo)
 ‘istruzioni della subroutine
End Sub
Dove param1 e param2 rappresentano i parametri che vengono passati alla procedura. Si noti come la dichiarazione di una subroutine è molto simile a come si dovrebbe dichiarare una variabile, specificando il nome del parametro e il tipo di dati, dove ciascun parametro passato alla procedura è trattato come una variabile locale nella subroutine, il che significa che la “durata” del parametro è la stessa di quella della procedura. Ci sono due modi per passare una variabile in ingresso ad una procedura: per valore (o ByVal) oppure per riferimento (o ByRef). La differenza fra le due modalità sta nel rendere disponibile alla procedura o una copia del valore della variabile, o il contenuto vero e proprio della stessa. Sintatticamente si indica la modalità per valore o per riferimento premettendo ByVal o ByRef rispettivamente prima della dichiarazione dei parametri di ingresso

Sub nome_routine (ByVal As Type)
Sub nome_routine (ByRef As Type)


Si consideri che in assenza del tipo di dati nella dichiarazione della routine, per impostazione predefinita, una subroutine tratta gli argomenti passati per valore, il che significa che la procedura non può modificare il contenuto della componente variabile nel codice chiamante. Per richiamare una subroutine che non prevede il passaggio di parametri da altra routine, si può alternativamente utilizzare l’istruzione Call seguita dal nome della routine oppure indicare il solo nome della routine da eseguire.
Codice:
Call aggiungi1
aggiungi1
Nel caso si debba richiamare una routine che necessita il passaggio di parametri allora è necessario ricorrere all’istruzione Call e inserire, dopo il suo nome, i valori separati da una virgola e racchiusi tra parentesi.

Call aggiungi1(x)

Si consideri il seguente programma come esempio:
Codice:
Sub prova1()
Dim x As Integer
x = 5
MsgBox x
Call aggiungi1(x)
MsgBox x
End Sub

Sub aggiungi1(ByVal i As Integer)
i = i + 1
End Sub
In questo esempio viene assegnato il valore 5 alla variabile x, e poi tramite la funzione MsgBox ne viene stampato il valore a video, successivamente viene chiamata la procedura aggiungi1 che prende in ingresso una copia del valore di x e lo incrementa. Questa operazione però non ha effetto sul contenuto della variabile x infatti quando successivamente viene stampato il valore di x rimane sempre 5. Se invece consideriamo il seguente listato
Codice:
Sub prova2()
Dim x As Integer
x = 5
MsgBox x
Call aggiungi2(x)
MsgBox x
End Sub

Sub aggiungi2(ByRef i As Integer)
i = i + 1
End Sub
Questa volta la variabile x è stata passata per riferimento (ByRef), questo significa che la procedura va a modificare il contenuto della variabile, Infatti alla fine dell’elaborazione il valore di x è stato incrementato e vale 6

La procedure Function
Abbiamo già detto che una procedura sub è un insieme di codici VBA o istruzioni che svolgono un'azione, ma non restituiscono un valore, mentre invece una funzione è anche usata per eseguire un'azione o un calcolo, cosa che può essere eseguita anche da una sub routine, ma la Function restituisce un valore. Il nome della funzione può essere utilizzato nell'ambito della procedura per indicare il valore restituito dalla funzione stessa e non può essere creata utilizzando il registratore di Macro. Una routine Function può essere richiamata utilizzando il nome in un'espressione che non è possibile per una procedura sub, che invece necessita di essere richiamata solo da una dichiarazione autonoma. Poiché una funzione restituisce un valore, può essere utilizzata direttamente in un foglio di lavoro inserendo il nome della funzione dopo aver digitato un segno di uguale

Una Function inizia con la parola chiave Function, seguito da un nome e poi da una serie di parentesi, inoltre è necessario specificare il tipo di dati che corrisponde al tipo di valore che la funzione restituirà, digitando la parola chiave As dopo le parentesi seguita dal tipo di dati.
Codice:
Function nome_funzione(param1 As tipo_param1, param2 As tipo_param2)  As tipo_valore
... istruzioni funzione
End Function
Esempio di funzione:
Codice:
Function calcola_area(Raggio As Double) As Double
 calcola_area = Raggio * Raggio * 3.14
End Function
Le funzioni possono essere create senza argomenti e con qualsiasi numero di argomenti che sono elencati tra le parentesi e in caso di argomenti multipli, si deve separarli con una virgola e termina con un'istruzione End Function che può essere digitato, andando alla riga successiva dopo aver digitato la dichiarazione viene inserita automaticamente da VBE. Le istruzioni espresse in codice VBA vanno collocate tra la dichiarazione Function e la dichiarazione finale End Function. La funzione può essere richiamata da un'altra procedura, vale a dire una sub o una function e può essere utilizzata direttamente in una formula del foglio di lavoro inserendo il nome della funzione dopo aver digitato un segno di uguale. Vediamo alcuni esempi di Funtion e come si chiamano:

Esempio: Utilizzare una function per inserire il valore restituito in una cella del foglio attivo
Codice:
Function part_nome() As String
Dim nome As String
Dim cognome As String
nome = InputBox("Inserire nome")
cognome = InputBox("Inserire il cognome")
part_nome = nome & "" & cognome
End Function

Sub nome_int()
ActiveSheet.Range("A1") = part_nome
End Sub
Esempio: Usare una Function per fare calcoli e ricevere il risultato come valore ritorno
Codice:
Function area1() As Double
Dim i As Integer
i = InputBox("Immettere il raggio del cerchio")
area1 = i * i * 3.14
area1 = Format(area1, "#. # #")
End Function

Sub calcola_1()
MsgBox "L'area del cerchio è:" & " " & area1
End Sub
Esempio: Passare una variabile alla Function per eseguire dei calcoli
Codice:
Function tre(i As Integer) As Long
tre = i * 3
End Function
 
Sub chiama_3()
Dim a As Integer
a = InputBox("Immettere un numero intero")
MsgBox tre(a)
End Sub
Si può osservare che quando la Function non riceve argomenti l'insieme di parentesi, dopo il nome della procedura, è vuoto, tuttavia, quando gli argomenti sono passati a una procedura secondaria o a una funzione da altre procedure, allora questi sono elencati tra le parentesi.

Esempio: La funzione calcola_1 restituisce un valore che può essere utilizzato in una sub
Codice:
Function calcola_1() As Double
Dim a As Double
Dim b As Double
a = InputBox("Inserire il primo numero")
b = InputBox("Inserire il secondo numero")
calcola_1 = (a + b) * 2
End Function

Sub calcola()
Dim c As Double
c = calcola_1 * 5 / 2
MsgBox c
End Sub
Esempio: La funzione calcola_2 non restituisce un valore che può essere utilizzato dalla procedura chiamante.
Codice:
Sub calcola_2()
Dim a As Double
Dim b As Double
Dim c As Double
a = InputBox("Inserire il primo numero")
b = InputBox("Inserire il secondo numero")
c = (a + b) * 2
MsgBox c
End Sub

Sub usa_calcola2()
calcola_2
End Sub
Regole e Convenzioni per assegnare il nome alle procedure
Ci sono alcune regole che devono essere seguite quando si assegna il nome alle procedure, una di queste è quella di assegnare un nome che rifletta l'azione che eseguirà la stessa, si può usare una frase differenziando le parole da un carattere di sottolineatura o una lettera maiuscola: esempio cerca_N può equivalere a cerca nomi, si sconsiglia di usare nomi molto lunghi, inoltre il nome deve iniziare con una lettera, sono da evitare i numeri o un carattere di sottolineatura. Un nome può essere costituito da lettere, numeri o caratteri di sottolineatura, ma non può avere un periodo o caratteri di punteggiatura o caratteri speciali: esempio (.) @ # $% ^ & * () + - = [] {}; ':! ",. / <> \ |? `~ .

Il nome dovrebbe essere costituito da una stringa di caratteri continui, senza spazio intermedio e può avere un massimo di 255 caratteri, inoltre i nomi delle procedure non possono utilizzare parole chiave o riservate come And, Or, Loop, Do, Len, Close, data, ElseIf, Else, Select, etc. che VBA utilizza come parte del suo linguaggio di programmazione.


Procedure Public o Private
Una procedura VBA può essere utilizzata in ambito pubblico o privato e questo metodo di procedura può essere specificato con la parola chiave Public o Private, se non viene specificato il metodo, VBA tratta le procedure come pubbliche di default. Una procedura dichiarata come Private può essere richiamata solo da tutte le procedure nello stesso modulo e non saranno visibili o accessibili alle procedure di moduli esterni nel progetto e non apparirà nella finestra di dialogo Macro. La Procedura pubblica invece può essere richiamata da tutte le procedure dello stesso modulo, ma anche da tutte le procedure di moduli esterni nel progetto e il suo nome verrà visualizzato nella finestra di dialogo Macro e può essere eseguito da esso. Esempi di una procedura pubblica:

Sub calcola1 ()
Public Sub calcola1 ()
Function calcola1 () As Double
Public Function calcola1 () As Double


Esempi di una procedura privata:

Private Sub calcola1 ()
Private Function calcola1 () As Double



Moduli Standard
Questi sono anche indicati come moduli di codice o semplicemente moduli, e ciascun modulo può essere utilizzato per coprire un certo aspetto del progetto. La maggior parte del codice VBA e le funzioni personalizzate (cioè Funzioni definite dall'utente denominate UDF) sono collocati in moduli di codice standard che non vengono utilizzati per le procedure di evento o per gli eventi di applicazioni create in un modulo di classe dedicato. Per quanto riguarda gli eventi non connessi con oggetti, come il metodo OnTime (attiva automaticamente un codice VBA ad intervalli periodici o in un giorno o momento specifico) e il metodo OnKey (eseguire un codice specifico su pressione di un tasto o una combinazione di tasti), essendo questi metodi non associati a un particolare oggetto il loro codice viene inserito in un modulo standard.


Modulo Workbook
ThisWorkbook è il nome del modulo per la cartella di lavoro e viene utilizzato per inserire eventi nella cartella di lavoro e eventi Application. Gli eventi Workbook sono azioni connesse con la cartella di lavoro per innescare un codice VBA o macro, vale a dire, apertura, chiusura, salvataggio, attivazione e disattivazione del foglio di lavoro sono esempi di eventi delle cartelle di lavoro. Con l’evento Open della cartella di lavoro, è possibile eseguire una sub automaticamente quando una cartella di lavoro è aperta e il codice dell’evento della cartella di lavoro deve essere inserito nel modulo di codice per l'oggetto ThisWorkbook, mentre se sono posti in moduli di codice standard Excel non sarà in grado di trovarli ed eseguirli. Anche se eventi Application possono essere creati in qualsiasi modulo oggetto, è meglio che siano posizionati in un modulo oggetto ThisWorkbook oppure è possibile creare un modulo di classe per gestirli.


Modulo Foglio
Un modulo foglio ha lo stesso nome del foglio di lavoro con cui è associato (Foglio1, Foglio2 etc.) e in VBE, il codice del nome può essere modificato solo nella finestra Proprietà e non a livello di programmazione, inoltre il modulo foglio può essere per un foglio di lavoro o un grafico e viene usato per posizionare gli eventi innescati o da eventi associati al foglio di lavoro, o da macro. Per utilizzare una routine evento del foglio di lavoro, in VBE si deve selezionare il foglio di lavoro dalla casella Progetti e quindi selezionare una procedura corrispondente dalla finestra del Codice e una volta selezionato l'evento specifico, si deve inserire il codice VBA che si desidera eseguire. Si ricorda che se il codice viene immesso in un modulo standard, Excel non sarà in grado di trovare le istruzioni ed eseguirle. Le principali istanze di evento sono: la selezione di una cella o cambiando la selezione di celle in un foglio di lavoro, cambiare il contenuto di una cella, selezionare o attivare un foglio, calcolare un foglio di lavoro e così via. Ad esempio, con l'evento Change (modifica) di Worskheet, una procedura viene eseguita automaticamente quando si modifica il contenuto di una cella del foglio di lavoro.

Modulo UserForm
Procedure di eventi per Userform, o per i suoi controlli, sono posizionati nel modulo di codice della Form prescelta, e sono moduli pre-determinati, cioè che si verificano per un particolare uso della Form e/o dei relativi controlli, esempi in questo caso includono gli eventi: Initialize, Activate o Click. Per raggiungere un evento è necessario fare doppio clic sul corpo della Form per visualizzare il modulo di codice, quindi selezionare Userform o il suo controllo dalla casella Oggetti e quindi selezionare una procedura corrispondente dalla casella Routine. Dopo aver selezionato l'evento specifico, inserire il codice VBA che si desidera eseguire, ricordate di impostare la proprietà Name dei controlli prima di usare le routine di evento per loro, altrimenti sarà necessario cambiare il nome della procedura che corrisponde al nome del controllo.


Esecuzione di Function
La Function può essere chiamata da un'altra procedura vale a dire una procedura Sub o Function, e la funzione può essere utilizzata direttamente nel foglio come una formula inserendo il nome della funzione dopo aver digitato un segno di uguale.


Esecuzione di procedure di evento
Gli eventi sono azioni eseguite, o eventi, che innescano una macro VBA e vengono attivati quando si verifica un evento come apertura, chiusura, attivazione, disattivazione della cartella di lavoro, di una selezione di celle o di una sola cella, in pratica consiste nel fare un cambiamento del contenuto di un foglio di lavoro o di una cella. Le procedure di evento sono collegate agli oggetti, una procedura evento è una procedura con un nome standard che viene eseguito sul verificarsi di un evento corrispondente. Le procedure di evento sono attivate da un evento predefinito e vengono installate all'interno di Excel con un nome standard. Si consideri la procedura di modifica del foglio di lavoro che viene installata con il foglio di lavoro nella procedura Private Sub Worksheet_Change (ByVal Target As Range) che viene richiamata automaticamente quando un oggetto riconosce il verificarsi di un evento che possa modificare l’oggetto stesso. Una procedura evento per un oggetto è una combinazione del nome dell'oggetto (come specificato nella proprietà Name), un carattere di sottolineatura e il nome dell'evento.


Esecuzione routine Sub
Nella scheda Visualizza della barra multifunzione, cliccare su Macro nel gruppo Macro e poi su Visualizza macro che aprirà la finestra di dialogo macro. Nella finestra di dialogo Macro, selezionare il nome della macro e fare clic su Esegui per eseguire la Sub/macro. È inoltre possibile aprire la finestra di dialogo macro facendo clic su Macro nel gruppo Codice nella scheda Sviluppo sulla barra multifunzione oppure utilizzare la combinazione di tasti Alt + F8 per aprire la finestra di dialogo macro.

Tasto di scelta rapida: Per utilizzare il tasto di scelta rapida associato alla macro è necessario avere già assegnato un tasto alla macro che può essere fatto sia nel momento in cui si inizia la registrazione di una macro o poi selezionando il nome della macro nell'elenco delle macro presenti nella finestra di dialogo Macro e facendo clic sul pulsante Opzioni .

Per eseguire una macro dall’editor di VBE si deve cliccare all'interno della procedura e premere F5 (o fare clic su Esegui nella barra dei menu) oppure dal menu Strumenti nella barra dei menu e cliccare su macro che apre la finestra di dialogo Macro, e selezionare il nome della macro e fare clic su Esegui per eseguirla. Ovviamente questi metodi non sono molto user friendly per eseguire le macro, un modo migliore per eseguire una macro potrebbe essere quella di fare clic su un pulsante accompagnate da un testo auto-esplicativo che appare sul foglio di lavoro

Si consideri che è possibile assegnare una macro a qualsiasi controllo modulo agendo dalla scheda Sviluppo sulla barra multifunzione, fare clic su Inserisci nel gruppo Controlli, selezionare e fare clic su pulsante nei controlli modulo e quindi fare clic sul foglio di lavoro in cui si desidera posizionare l'oggetto, poi di deve fare clic col destro del mouse sul pulsante e selezionare Assegna macro nella finestra che appare dalla quale è possibile selezionare e assegnare una macro al pulsante


Assegnare più Macro
È possibile assegnare più macro a un oggetto, un'immagine o un controllo, chiamando altre procedure secondarie. Consultare di seguito, ad esempio, nella procedura secondaria (CommandButton1_Click) che viene eseguito facendo clic su un pulsante di comando, altre due procedure secondarie denominate Macro1 e Macro2 sono chiamate ed eseguite. In questo esempio le macro sono chiamati con i loro nomi, ma è possibile visualizzare tutte le macro facendo clic su macro nel gruppo di macro (nella scheda Visualizza della barra multifunzione) e poi selezionando Visualizza macro. Ricordarsi di digitare i nomi di macro su righe separate durante la loro chiamata.
Codice:
Private Sub CommandButton1_Click ()
Macro1 
Macro2
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 08-06-2014, 01.46.46   #34
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Leggere un File Txt con VBA




Ci sono vari modi di leggere un file Txt da VBA, vediamo un modo che credo sia facile da capire e modificare ma che richiede la conoscenza di un paio di concetti di VBA come la progettazione delle macro e la scelta dei metodi. Per meglio comprendere, vediamo quando, perché e come scegliere la funzione giusta, e una corretta gestione degli errori e delle decisioni da intraprendere a livello codice utilizzando una tecnica e metodi differenti. Cominciamo con l'aggiunta dei riferimenti necessari al progetto VBA, aprite un nuovo file Excel a dall’editor di VB seguite il percorso dal menu Strumenti – Riferimenti, scorrete la lista fino a trovare la libreria Microsoft Scripting Runtime library e spuntare la casella e confermate l’operazione cliccando sul tasto Ok. La Microsoft Scripting Runtime library ci permette di utilizzare:

FileSystemObject: Con questo oggetto si può accedere rapidamente a qualsiasi unità, cartella o file.
TextStream: E’ un oggetto usato per leggere il contenuto di un file Txt

Creiamo ora un file Txt aprendo notepad o un altro editor di testo e copiate e incollate i dati di esempio qui sotto
Codice:
Questa è la riga uno 
questa invece è la seconda linea 
è questa è la linea n ° 3 
ecco la quarta riga del file 
e finiamo con la Linea 5
Salvate il file col nome di prova.txt sul desktop e ritornate nell’editor di VBE per inserire un nuovo modulo, seguendo il percorso dal menu Inserisci – Modulo e copiate e incollate il codice sotto riportato
Codice:
 Sub leggi_txt()
   Dim alex As FileSystemObject
   Set alex = New FileSystemObject
    Dim alex_1 As TextStream
   Set alex_1 = alex.OpenTextFile("C:\Test\prova.txt")
    alex_1.Close
End Sub
Ora se si esegue la procedura leggi_txt si ottiene un messaggio di errore del tipo

Fig. 1

E cliccando sul pulsante Debug si evidenzia la riga che ha rimandato l’errore

Fig. 2

L’errore rimandato è: Impossibile trovare il file. Un occhio attento si sarebbe accorto dell’errore prima di eseguire la procedura in quanto è evidente la differenza dei percorsi del file, ma è stato simulato questo errore per introdurre un modo per gestire questo errore. All’inizio è stato citato il metodo come semplice e ora vediamo di applicare questa logica.
Come si può vedere il metodo OpenTextFile () accetta un parametro che è il percorso del file, ma la procedura non controlla se il file esiste o no, tocca al programmatore fornire un corretto percorso di ingresso alla funzione per evitare errori Runtime. Per essere sicuri che il file esista si possono usare vari metodi, ma il metodo più semplice sarebbe di pilotare il codice in modo che facesse questa valutazione: se il file esiste puoi proseguire, se non non esiste esci.

Quindi dobbiamo aggiungere qualcosa al codice per verificare se il file esiste, e lo possiamo fare in due modi, uno consiste nel creare una funzione che esegua il controllo e restituisca un valore Booleano True o False, oppure utilizzare un metodo già esistente nell’oggetto FileSystemObject che corrisponde al metodo FileExists. Utilizzando il metodo FileExists si può aggiungere un'istruzione IF – Else al codice attuale che prima di aprire il file Txt verifichi se il percorso è corretto. In pratica usando un’espressione del genere
Codice:
Sub leggi_txt()
   Dim alex As FileSystemObject
   Set alex = New FileSystemObject
    Dim alex_1 As TextStream
    If <pathisvalid> Then
   Set alex_1 = alex.OpenTextFile("C:\Test\prova.txt")
    alex_1.Close
    Else
    MsgBox "Il percorso del file non è valido.", vbCritical, vbNullString
    Exit Sub
    End If
End Sub
Dove <pathisvalid> è solo un segnaposto per l'espressione che deve controllare se il file esiste oppure no, in altre parole, se il percorso è valido, pertanto sostituiamo il segnaposto con il comando alex.FileExist (“C\Test\prova.txt”) e modifichiamo il listato in questo modo
Codice:
Sub leggi_txt()
   Dim alex As FileSystemObject
   Set alex = New FileSystemObject
    Dim alex_1 As TextStream
    
    If alex.FileExists("C:\Test\prova.txt") Then
   Set alex_1 = alex.OpenTextFile("C:\Test\prova.txt")
    alex_1.Close
    Else
    MsgBox "Il percorso del file non è valido.", vbCritical, vbNullString
    Exit Sub
    End If
End Sub
Fig. 3

In alternativa, possiamo usare la funzione Dir per verificare se il file esiste in questo modo: If Dir("C:\Test\prova.txt") <> vbNullString Then. Se si vuole usare Dir () vorrei suggerire di aggiungere una funzione di tipo booleano al codice, che restituisca un valore vero o falso se il percorso è corretta o meno. Converrete che ricevere un parametro di ritorno vero o falso sia quantomeno azzeccato all’operazione che si sta cercando di fare. Possiamo ora definire questa funzione
Codice:
Function FileExist(filePath As String) As Boolean
    If Dir(filePath) <> vbNullString Then
        FileExist = True
    Else
        FileExist = False
    End If
End Function
Oppure con una sintassi diversa
Codice:
Function fileExist(filePath As String) As Boolean
    fileExist = IIf(Dir(filePath) <> vbNullString, Vero, Falso)
End Function
Personalmente ritengo che non abbiamo assolutamente bisogno di quest’ultimo listato che utilizza il segnaposto (o placeholder) IIF, in quanto sappiamo che la funzione FileExist fa esattamente la stessa cosa, ma soprattutto vale la pena di sapere come gestire situazioni simili, creando le proprie funzioni e questo è un ottimo modo. E 'sempre una buona regola assegnare tutti i dati a variabili, se si memorizza il percorso in un'unica variabile nel codice, invece di ripeterlo in vari contesti, il codice diventerà più facile da gestire, in fase di test e di debug. Cosa succede se il percorso o il nome del file cambia? Per non scorrere l'intero progetto alla ricerca di tutte le occorrenze di percorso sarebbe molto meglio e più facile da gestire se si usa una variabile che identifica il percorso del file e in caso di modifica si edita solo la variabile e il resto del codice rimane intatto.

Pertanto aggiungiamo una variabile per memorizzare il percorso, creando una variabile String denominata filePath a cui assegniamo il valore di "C:\Test\prova.txt"
Codice:
Dim filePath As String
filePath = "C:\Test\prova.txt"
Da notare che la variabile filePath viene utilizzata nella Function FileExist e OpenTextFile, così ora il codice diventa:
Codice:
Sub leggi_txt()
   Dim alex As FileSystemObject
   Set alex = New FileSystemObject
    Dim alex_1 As TextStream
    Dim filePath As String
    filePath = "C:\Test\prova.txt"
    If alex.FileExists(filePath) Then
   Set alex_1 = alex.OpenTextFile(filePath)
    alex_1.Close
    Else
    MsgBox "Il percorso del file non è valido.", vbCritical, vbNullString
    Exit Sub
    End If
End Sub

Function fileExist(filePath As String) As Boolean
    If Dir(filePath) <> vbNullString Then
        fileExist = True
    Else
        fileExist = False
    End If
End Function
Ora abbiamo costruito la procedura che apre il file se il percorso è corretto, oppure visualizza un messaggio di errore se il percorso del file non è corretto. Però questa procedura andrebbe bene se sul pc che viene utilizzato ci sia un solo utente che si logga all’apertura di Windows, oppure, se si sposta il percorso di ricerca sul desktop, servono altri parametri, oppure se ci fossero più utenti che si loggano sul pc. In questo caso verrebbe rimandato un errore di percorso non trovato a meno che non modifichiamo il listato usando una funzione che restituirebbe il nome attualmente loggato in Windows. Si tratta di usare la funzione [i[Environ ()[/i] che per essere usata si deve modificare il percorso del file in questo modo:

filePath = "C:\Users\" & Environ$("Username") & "\Test\prova.txt"

Se si esegue questo codice la macro apre e chiude con successo il file prova.txt, ma non possiamo avere nessuna certezza, pertanto possiamo aggiungere una dichiarazione temporanea al codice per verificare se il file è effettivamente aperto.
Codice:
Sub leggi_txt()
   Dim alex As FileSystemObject
   Set alex = New FileSystemObject
    Dim alex_1 As TextStream
    
    Dim filePath As String
    filePath = "C:\Users\" & Environ$("Username") & "\Desktop\prova.txt"

    If alex.FileExists(filePath) Then
   Set alex_1 = alex.OpenTextFile(filePath)
   Debug.Print IIf(alex_1 Is Nothing, "Il file è chiuso", "Il file è aperto")
    alex_1.Close
    Else
    MsgBox "Il percorso del file non è valido.", vbCritical, vbNullString
    Exit Sub
    End If
End Sub
Se il codice sopra esposto lo eseguiamo è possibile vedere se il file viene aperto oppure no, pertanto attiviamo la Finestra Immediata dal menu Visualizza – Finestra immediata oppure cliccando la combinazione di tasti CTRL + G e si dovrebbe vedere che il file viene aperto dopo aver eseguito la macro

Fig. 4

Come si può vedere nella figura sopra riportata il codice sta funzionando benissimo, ma cosa accadrebbe se ci fosse un errore nel file prova.txt, oppure se fosse stato danneggiato, oppure se il metodo OpenTextFile non è riuscito a leggere il file. Certamente sarebbe apparso un messaggio minaccioso di errore di runtime.
Si dovrebbe sempre prendere in considerazione uno scenario simile se si lavora con i file, se qualcosa va storto nell'esecuzione del codice il programma si ferma immediatamente, così, tutti gli oggetti aperti, tutti i riferimenti sarebbe rimasti aperti e molto probabilmente non saremmo in grado di liberare la memoria a meno che il garbage collection (modalità automatica di gestione della memoria nei sistemi Windows) non ci fosse venuto in aiuto.

Questo è un caso in cui l’istruzione On Error GoTo <label> è molto utile, pertanto proviamo ad applicare il gestore degli errori al nostro esempio. Considerate le seguenti modifiche
Codice:
Sub leggi_txt()
   Dim alex As FileSystemObject
   Set alex = New FileSystemObject
    Dim alex_1 As TextStream
    Dim filePath As String
    filePath = "C:\Users\" & Environ$("Username") & "\Desktop\prova.txt"

    If alex.FileExists(filePath) Then
    On Error GoTo Err
   Set alex_1 = alex.OpenTextFile(filePath)
    alex_1.Close
    Else
    MsgBox "Il percorso del file non è valido.", vbCritical, vbNullString
    Exit Sub
    End If
    
Err:
    MsgBox "Errore durante la lettura del file.", vbCritical, vbNullString
    alex_1.Close
    Exit Sub
End Sub
Se si verifica un errore durante la lettura del file l'istruzione On goto errore Err fermerà l'esecuzione del codice e salterà all'etichetta Err che mostrerà un messaggio di errore, per poi uscire dalla macro attualmente in esecuzione. Passiamo ora alla lettura del contenuto del file prova.txt. I tre approcci più comuni per leggere il contenuto di un file txt sono i metodi Read ReadAll e ReadLine applicabili all’oggetto TextStream.

Il metodo .ReadAll è molto facile da usare, se inseriamo una riga di codice dopo la chiamata OpenTextFile di questo tipo: Range("A1") = alex_1.ReadAll
Si recupera il contenuto del file prova.txt e lo si inserisce nella prima cella in alto a sinistra (A1) del foglio di calcolo attivo.

Fig. 5

Se si clicca sulla cella A1 e si osserva la barra della formula si sarà in grado di vedere meglio in quale formato avete ricevuto i vostri dati. Dovrebbe assomigliare a questa

Fig. 6

Come si può vedere il metodo ReadAll recupera tutti i dati da un file di testo in una volta nello stesso formato che sono disposti nel file di testo. E’ ovvio che ricevere dei dati in questo formato non è un buon approccio e non consentono una manipolazione degli stessi, ma possiamo usare la funzione Read, la quale accetta un parametro che corrisponde al numero di caratteri che si desidera leggere. Se modifichiamo il codice, sostituendo alex_1.ReadAll con alex_1.Read(5), verranno restituiti i primi 5 caratteri dal file di testo nella cella A1. Potete cambiare il valore 5 in qualsiasi altro numero e se si supera il numero di caratteri nel file di testo verrà recuperato l'intero file.

Anche questo metodo non presenta le caratteristiche desiderate per importare dei dati e manipolarli, non possiamo sapere quanti caratteri dobbiamo importare per avere dei dati di senso compiuto, se si tratta di dati in formato stringa oppure avere dei valori numerici che non vengano troncati. Esiste un approccio diverso per leggere il file di testo, usando l’istruzione ReadLine e come suggerisce il nome stesso permette di leggere il file riga per riga e possiamo con le adeguate istruzioni depositare i dati in celle separate. Se modifichiamo il codice in questo modo
Codice:
Set alex_1 = alex.OpenTextFile(filePath)
    Do While Not alex_1.AtEndOfStream
    Range("A" & Range("A" & Rows.Count).End(xlUp).Row + 1) = alex_1.ReadLine
    Loop
    alex_1.Close
Il risultato sarà come il seguente

Fig. 7

Come si può notare la prima riga è stata lasciata vuota, che potrebbe ospitare le intestazioni dei campi, ma se si osserva l’istruzione Range("A" & Range("A" & Rows.Count).End(xlUp).Row + 1) , se si esegue il codice due volte, alla successiva esecuzione i dati verrebbero incollati sotto l’ultima riga utilizzata nella colonna A, in alternativa è possibile utilizzare una variabile per sovrascrivere i dati in questo modo:
Codice:
Set alex_1 = alex.OpenTextFile(filePath)
   Dim i As Long
   i = 1
  Cells.ClearContents
    Do While Not alex_1.AtEndOfStream
   Range("A" & i) = alex_1.ReadLine
    i = i + 1
    Loop
    alex_1.Close
e si ottiene un risultato come il seguente:

Fig. 8

Concludendo ormai si dovrebbe facilmente essere in grado di aprire qualsiasi file txt con codice VBA ed estrarre i dati da esso, vediamo il codice per intero nei due approcci presentati
Codice:
Sub leggi_txt()
    Dim alex As FileSystemObject
    Set alex = New FileSystemObject
    Dim alex_1 As TextStream
    Dim filePath As String
    filePath = "C:\Users\" & Environ$("Username") & "\Desktop\prova.txt"
    If alex.FileExists(filePath) Then
        On Error GoTo Err
        Set alex_1 = alex.OpenTextFile(filePath)
   Dim i As Long
   i = 1
  Cells.ClearContents
    Do While Not alex_1.AtEndOfStream
   Range("A" & i) = alex_1.ReadLine
    i = i + 1
    Loop
    alex_1.Close
    Else
        MsgBox "Il percorso del file non è valido.", vbCritical, vbNullString
        Exit Sub
    End If
    Exit Sub
Err:
    MsgBox "Errore durante la lettura del file.", vbCritical, vbNullString
    alex_1.Close
    Exit SubEnd Sub

Function fileExist(filePath As String) As Boolean
    If Dir(filePath) <> vbNullString Then
        fileExist = True
    Else
        fileExist = False
    End If
End Function
Oppure
Codice:
Sub leggi_txt()
    Dim alex As New FileSystemObject
    Dim alex_1 As TextStream
    Dim filePath As String
    filePath = "C:\Users\" & Environ$("Username") & "\Desktop\prova.txt"
    If Not fileExist(filePath) Then GoTo FileDoesntExist
    On Error GoTo Err
    Set alex_1 = alex.OpenTextFile(filePath)
    With Sheets(1).Range("A1")
        .ClearContents
        .NumberFormat = "@"
        .Value = alex_1.ReadAll
    End With
    alex_1.Close
    Exit Sub
 
FileDoesntExist:
    MsgBox "Il File non esiste", vbCritical, "File not found!"
    Exit Sub
 
Err:
    MsgBox "Errore durante la lettura del file.", vbCritical, vbNullString
    alex_1.Close
    Exit Sub
End Sub
 
Function fileExist(path As String) As Boolean
    fileExist = IIf(Dir(path) <> vbNullString, True, False)
End Function
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 08-06-2014, 16.19.08   #35
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
I controlli Label, TextBox e CommandButton




Il controllo Label
Il controllo Label serve per visualizzare un testo non modificabile dall'utente e viene utilizzato per descrivere altri controlli, ed è spesso usato per descrivere un TextBox o per visualizzare delle informazioni. Questo tipo di controllo deve essere inserito in un controllo UserForm e dato che è molto utilizzato, è inutile assegnare un nome significativo a ogni sua istanza, a meno che non la si debba modificare durante l'esecuzione del programma. Si utilizzano principalmente le seguenti proprietà: Caption per visualizzare il testo, Left e Top per posizionarlo, TextAlign per allineare il testo all'interno dell'etichetta, Font per lo stile e il formato del testo, BackColor e ForeColor per i colori di sfondo e del testo. È possibile formattare una etichetta sia nella finestra Proprietà o mediante un'istruzione VBA come: Label1.Caption = "Inserire la quantità richiesta", oppure utilizzando una dichiarazione With come illustrato di seguito.

Esempio: Cliccando sul pulsante di una Form verrà formattato il testo della Label
Codice:
Private Sub CommandButton1_Click()
With Label1
.Caption = "Inserire il testo"
'Allineamento del testo impostato al centro
.TextAlign = fmTextAlignCenter
.WordWrap = True
'Impostare il tipo di carattere
.Font.Name = "Arial"
.Font.Size = 12
.Font.Italic = True
'impostare a giallo e il colore del testo e a rosso il colore di sfondo
.ForeColor = RGB(255, 255, 0)
.BackColor = RGB(255, 0, 0)    
End With
End Sub
Il controllo CommandButton
Un CommandButton viene in genere utilizzato per eseguire una macro tramite l'evento Click. Se entrate in VBE è possibile accedere all'evento Click facendo doppio clic sul CommandButton, oppure è possibile selezionare il nome del CommandButton (nel modulo di codice per il Form utente) nella casella a discesa nella finestra del codice a sinistra e poi selezionare e poi cliccare nella tendina in alto a destra. Cliccando sul CommandButton verrà eseguito il codice che viene inserito nell'evento Click oppure è possibile inserire il nome di una macro da eseguire

Esempio: Usando l'evento Click si può chiudere la Form
Codice:
Private Sub CommandButton2_Click () 
MsgBox "Chiusura UserForm !"
Unload Me
End Sub
Esempio: Cliccando sul pulsante di comando si esegue un'altra macro per svuotare tutti i controlli della Form
Codice:
Private Sub CommandButton1_Click () 
ClearForm
End Sub
 
Private Sub ClearForm () 
Textbox1.value = ""
ComboBox1.Value = ""
CheckBox1.Value = False
OptionButton1.Value = False
End Sub
Il Controllo TextBox
Un controllo TextBox accetta dati da parte dell'utente. Oltre alle proprietà comuni menzionate in precedenza, le proprietà chiave includono:

[I]Proprietà AutoTab[/I]: Restituisce un valore booleano (True o False) che specifica se la scheda passa automaticamente al controllo successivo nell'ordine di tabulazione dopo il numero massimo di caratteri determinato dalla struttura MaxLength all’entrata nel TextBox da parte dell'utente, mentre invece il valore False (che è di default) indica che lo spostamento al controllo successivo avviene manualmente quando l'utente preme il tasto Tab.

[i]Proprietà EnterKeyBehavior[/i]: Restituisce un valore booleano (True o False) che determina l'effetto quando un utente preme il tasto Invio in un TextBox. Se la proprietà MultiLine è impostata su True, il valore indica la creazione di una nuova linea premendo Invio mentre il valore False (Default) si passa al controllo successivo nell'ordine di tabulazione. Se MultiLine proprietà è impostata su False, il Focus è sempre spostato al controllo successivo nell'ordine di tabulazione ignorando la proprietà EnterKeyBehavior

Proprietà MaxLength: Specifica il numero massimo di caratteri che possono essere inseriti in una TextBox. Specificando un valore di 0 indica che non vi è alcun limite massimo.

Proprietà MultiLine: Restituisce un valore booleano (True o False) che determina se il testo viene visualizzato in più righe o meno, nella TextBox. True indica che il testo viene visualizzato in più righe, e questo è anche il valore di default.

Proprietà PasswordChar: Specifica quali caratteri si devono visualizzare nella TextBox al posto dei caratteri effettivamente inseriti o digitati dall'utente. Questa proprietà è utile per proteggere i codici di sicurezza sensibili, o per convalidare un utente prima di consentire di procedere ulteriormente.

Proprietà ScrollBars: Specifica se un TextBox ha barre di scorrimento verticali e/o orizzontali, o nessuna. Ci sono 4 impostazioni "auto-esplicativo":
  • fmScrollBarsNone (valore 0) - questa è l'impostazione di default
  • fmScrollBarsHorizontal (valore 1)
  • fmScrollBarsVertical (valore 2)
  • fmScrollBarsBoth (valore 3).
L’impostazione fmScrollBarsNone non visualizza nessuna barra di scorrimento e se la proprietà AutoSize è impostata su True, non comparirà nessuna barra di scorrimento perché il TextBox si allarga per accogliere il testo o di dati aggiuntivi. Se WordWrap è impostata su True, non comparirà nessuna barra di scorrimento orrizzontale nel TextBox. Le impostazioni della barra di scorrimento fmScrollBarsHorizontal o fmScrollBarsBoth, visualizzano una barra di scorrimento orizzontale in una TextBox a linea singola se il testo è più lungo rispetto alla capienza della casella. Le impostazioni della barra di scorrimento fmScrollBarsVertical o fmScrollBarsBoth, visualizzano una barra di scorrimento verticale in una TextBox a più righe se il testo è più lungo rispetto alla capienza della casella e WordWrap è impostata su True.

Per visualizzare una barra di scorrimento orizzontale in un TexBox multilinea, l'impostazione della barra di scorrimento dovrebbe essere fmScrollBarsHorizontal, e WordWrap dovrebbe essere impostata su False e il testo dovrebbe essere più lungo rispetto alla capienza della casella.

Nota: Una barra di scorrimento orizzontale (o verticale) è visibile solo se il controllo ha spazio sufficiente per includere la barra di scorrimento sotto o al bordo destro della sua casella.

Proprietà Text: Il testo in un TextBox viene restituito o impostato da questa proprietà. Un valore assegnato alla proprietà Text viene assegnato automaticamente al valore della proprietà, e viceversa.

Esempio: Aggiungere un TextBox in un Form e formattarlo utilizzando il codice VBA
Codice:
 Private Sub CommandButton1_Click()
Dim box_1 As MSForms.TextBox
Set box_1 = Controls.Add("Forms.TextBox.1", "Esempio 1")
With box_1
.Font.Name = "Times New Roman"
.Font.Size = 10
.TextAlign = fmTextAlignLeft
.Width = 100
.Height = 50
.Left = 50
.Top = 75
.MultiLine = True
.WordWrap = True
.AutoSize = False
.ScrollBars = 2
.SetFocus
End With
End Sub
Esempio: Impostare la proprietà Enabled di una TextBox per impedire all’utente di digitare direttamente nella casella di testo che deve essere riempito solo per l'opzione selezionata dall'utente nel ListBox
Codice:
Private Sub UserForm_Initialize()
With ListBox1
For i = 1 To 10
.AddItem i
Next i
.ControlTipText = "Selezionare un numero dal Listbox per inserirlo nel TextBox."
End With
Me.TextBox1.Enabled = False
End Sub
Private Sub ListBox1_Click()
TextBox1.Text = ListBox1.Value
End Sub
Esempio: Utilizzare una TextBox per impostare una password, in questo esempio usiamo la proprietà PasswordChar per controllare se il nome utente e la password, sono autorizzati a procedere e caricare UserForm1 viene caricato.
Codice:
Private Sub UserForm_Initialize()
TextBox2.MaxLength = 5
TextBox2.PasswordChar = "*"
TextBox2.BackColor = RGB(255, 255, 0)
End Sub

Private Sub CommandButton1_Click()
Dim password As String
If TextBox1.Text = "Pippo" And TextBox2.Text = "123456" Then
password = "True"
ElseIf TextBox1.Text = "Topolino" And TextBox2.Text = "987654" Then
password = "True"
ElseIf TextBox1.Text = "Paperino" And TextBox2.Text = "369852" Then
password = "True"
End If
If password = "True" Then
MsgBox "Password Esatta Puoi Continuare"
Unload Me
UserForm1.Show
Else
MsgBox "Paasword o Username errato. Riprova"
TextBox1.Text = vbNullString
TextBox2.Text = vbNullString
TextBox1.SetFocus
End If
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 16-06-2014, 23.01.19   #36
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Il Metodo OnTime ed esempi sui colori




Esempi di codice per modificare il colore del carattere in celle aventi "formule", "formule e numeri" e "costanti".
Codice:
Sub colore_formule()
Dim coloreF As Long
Dim coloreN As Long
Dim coloreC As Long
Dim cell As Range
coloreF = RGB(Red:=0, Green:=255, Blue:=0)
coloreN = RGB(Red:=0, Green:=0, Blue:=0)
coloreC = RGB(Red:=0, Green:=0, Blue:=255)
For Each cell In ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas)
'celle con formule
cell.Font.Color = coloreF
Next cell
For Each cell In ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas, xlNumbers)
'celle con numeri
cell.Font.Color = coloreN
Next cell
For Each cell In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants)
'celle con costanti (non formule)
cell.Font.Color = coloreC
Next cell
End Sub
Codice:
Sub colore_formule2()
Dim coloreF As Long
Dim coloreN As Long
Dim coloreC As Long
Dim cell As Range
coloreF = RGB(Red:=0, Green:=255, Blue:=0)
coloreN = RGB(Red:=0, Green:=0, Blue:=0)
coloreC = RGB(Red:=0, Green:=0, Blue:=255)
For Each cell In ActiveSheet.UsedRange
If cell.HasFormula = True Then
'celle con formule
cell.Font.Color = coloreF
If IsNumeric(cell) = True Then
'celle con numeri
cell.Font.Color = coloreN
End If
Else
cell.Font.Color = coloreC
'cellule con costanti
End If
Next cell
End Sub
Il codice sotto riportato cambia il colore di una cella quando vengono immessi i valori delle celle sfruttando l’evento Change del foglio di lavoro
Codice:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim coloreF As Long
Dim coloreN As Long
Dim coloreC As Long
coloreF = RGB(Red:=0, Green:=255, Blue:=0)
coloreN = RGB(Red:=0, Green:=0, Blue:=0)
coloreC = RGB(Red:=0, Green:=0, Blue:=255)
With Target
If .HasFormula Then
'celle con formule
.Font.Color = coloreF
If IsNumeric(Target) Then
'celle con numeri
.Font.Color = coloreN
End If
Else
.Font.Color = coloreC
'celle con costanti (non formule)
End If
End With
End Sub
Eseguire le macro a intervalli periodici o a un tempo determinato

Il Metodo Application.OnTime
Si può utilizzare il metodo Application.OnTime per eseguire una procedura a intervalli specifici o in un momento specifico della giornata. Sintassi: ApplicationObject OnTime (earliestTime, ProcedureName, LatestTime, Schedule).

Usando questo metodo è possibile pianificare l'esecuzione di una procedura in futuro in specifici intervalli di tempo, a partire da oggi, oppure è possibile fissare un momento specifico della giornata. L' oggetto Application rappresenta l'intera applicazione Excel, ed è l'oggetto più in alto nella gerarchia degli oggetti di Excel. Gli argomenti earliestTime e ProcedureName devono essere specificati, mentre gli altri argomenti sono facoltativi.

earliestTime: Questo argomento specifica il momento in cui la procedura viene eseguita

ProcedureName: Questo argomento specifica il nome della procedura che si desidera eseguire.

LatestTime: Con questo argomento è possibile impostare il limite di tempo per l'esecuzione della procedura vale a dire che se si imposta LatestTime a earliestTime + 20 e se nel frattempo un'altra procedura viene eseguita ed Excel non è “pronto” entro 20 secondi, questa procedura non verrà eseguita, tralasciando l'argomento LatestTime Excel eseguirà la procedura. Tralasciando l’argomento Schedule sarà impostato di default su True, che stabilisce una nuova procedura Ontime. Per annullare una procedura OnTime esistente impostata in precedenza, si deve specificare OnTime su False.

Per eseguire una procedura in specifici intervalli a partire da oggi, si deve utilizzare "Now + TimeValue (ora)", se per esempio si esprime il metodo con una espressione come: TimeValue ("20:30:00"), verrà eseguita una procedura alle 20:30, mentre invece per eseguire una procedura a intervalli specifici di tempo (ad esempio, da oggi), si deve utilizzare Now + TimeValue (ora) vale a dire, Ora + TimeValue ("00:00:05") imposta l'intervallo di tempo a 5 secondi, al quale intervallo la procedura verrà eseguita.


Arrestare o annullare una procedura utilizzando il metodo OnTime
Se si tenta di chiudere la cartella di lavoro, mentre una procedura è in esecuzione utilizzando Application.OnTime, Excel riaprirà la cartella di lavoro per completare la procedura, quindi, sarà necessario annullare la procedura. Per annullare una procedura in esecuzione utilizzando il metodo OnTime, è richiesto il tempo preciso della sua esecuzione pianificata. Si noti che se non si passa il tempo a una variabile, Excel non sa quale metodo OnTime deve utilizzare per annullare l’operazione. Per esempio se viene usata la sintassi Now + TimeValue ("00:00:03"), non è un valore statico, ma lo può diventare quando viene passato a una variabile. Ciò significa che il momento in cui la procedura è da eseguire (argomento earliestTime) deve essere assegnato a una variabile, utilizzando una variabile pubblica per rendere la variabile a disposizione di tutte le procedure in tutti i moduli e poi utilizzarlo per annullare il metodo OnTime.

Esempio: Questa procedura utilizza il metodo OnTime il cui valore di incremento automatico viene reperito in una cella e viene eseguita a intervalli di tempo specifici. Il procedimento si Arresta al superamento di un valore in una cella specifica. La procedura deve essere inserita in un modulo standard
Codice:
Public tempoR As Date
Sub incremento1()
'imposta l'intervallo di tempo a 3 secondi
tempoR = Now + TimeValue("00:00:03")
'la procedura verrà eseguita in automatico nell'intervallo di tempo fissato
Application.OnTime EarliestTime:=tempoR, Procedure:="incremento1", schedule:=True
'incrementare il valore nella cella A1 di 5 ogni volta che si esegue la macro
Cells(1, 1).Value = Cells(1, 1).Value + 5
'la procedura si ferma quando trova il valore 25 nella cella A1
If Cells(1, 1).Value > 25 Then
'annullare la procedura impostando l'argomento schedule a False
Application.OnTime tempoR, "incremento1", , False
End If
End Sub
Esempio: Questa procedura utilizza il metodo OnTime il cui valore di incremento automatico viene reperito in una cella e viene eseguita a intervalli di tempo specifici. Il procedimento si Arresta dopo essere stata eseguita un determinato numero di volte. La procedura deve essere inserita in un modulo standard
Codice:
Public tempoI As Date
Dim conta As Integer
Sub incremento2()
tempoI = Now + TimeValue("00:00:03")
Application.OnTime tempoI, "incremento2", , True
Cells(1, 1).Value = Cells(1, 1).Value + 5
conta = conta + 1
'Interrompere la procedura dopo averla eseguita per 5 volte
If conta = 5 Then
Application.OnTime tempoI, "incremento2", , False
conta = 0
End If
End Sub
Esempio: Avviare la procedura OnTime automaticamente quando la cartella di lavoro viene aperta e interromperla automaticamente alla chiusura della cartella di lavoro. Questa procedura imposta i promemoria in orari specifici e chiude automaticamente la cartella di lavoro in un momento specifico. Aggiungere il codice sotto riportato al modulo ThisWorkbook
Codice:
Private Sub Workbook_Open()
ricordami
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
'fermo il promemoria
ricordamiST
'salva cartella di lavoro prima della chiusura
ThisWorkbook.Save
End Sub
Le procedure sotto riportate devono essere inserite in un modulo standard:
Codice:
Public dTime As Date
Sub ricordami()
On Error Resume Next
dTime = Now + TimeValue("00:00:01")
Application.OnTime dTime, "ricordami"
'Chiudere la cartella di lavoro nel momento specificato

If Time = TimeSerial(18, 30, 0) Then
chiudiCAR
End If

'Impostare promemoria di chiusura ufficio
If Time = TimeSerial(17, 30, 0) Then
Application.OnTime dTime, "chiudiOF"
End If

'impostare promemoria pausa pranzo
If Time = TimeSerial(13, 0, 0) Then
Application.OnTime dTime, "pranzo"
End If

'impostare il promemoria per la pausa caffè 
If Time = TimeSerial(11, 15, 0) Then
Application.OnTime dTime, "Pcaffe"
End If
End Sub
Codice:
Sub ricordamiST()
'fermare la procedura ricordami
Application.OnTime dTime, "ricordami", , False
End Sub

Sub chiudiCAR()
On Error Resume Next
ricordamiST
'salva cartella di lavoro prima della chiusura
ThisWorkbook.Save
'chiude la cartella di lavoro
ThisWorkbook.Close
End Sub

Sub Pcaffe()
Dim obj As Object
Dim strMsg As String
Set obj = CreateObject("WScript.Shell")
'riproduco un segnale acustico di avviso
Beep
'Popup Message Box si chiuderà automaticamente da solo
strMsg = obj.Popup("Pausa Caffè!", vbOKCancel)
End Sub

Sub pranzo()
Dim obj As Object
Dim strMsg As String
Set obj = CreateObject("WScript.Shell")
Beep
strMsg = obj.Popup("Pausa Pranzo!", vbOKCancel)
End Sub

Sub chiudiOF()
Dim obj As Object
Dim strMsg As String
Set obj = CreateObject("WScript.Shell")
Beep
strMsg = obj.Popup("Chiudi Ufficio!", vbOKCancel)
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 17-06-2014, 11.00.14   #37
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Il Metodo Find in VBA




Per cercare un articolo specifico o un valore in un intervallo, si può utilizzare il metodo Find che restituisce il Range, vale a dire, la cella, dove si trova l'elemento o valore. Se non viene trovata nessuna corrispondenza viene restituito Nothing.

Sintassi: RangeObject.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

E’ necessario specificare solo l'argomento What, tutti gli altri sono facoltativi e rappresentano:

RangeObject: Rappresenta un intervallo in cui viene cercato l'elemento o lo specifico valore ed è possibile cercare all'interno di celle specifiche, vale a dire, Range, Colonne o le celle di un foglio di lavoro.

What: E 'la voce o il valore che viene ricercato e può essere di qualsiasi tipo di dati.

After: Rappresenta una singola cella che è necessario specificare, dopo di che la ricerca inizia. Perché la ricerca inizia dopo questa cella, la cella specificata viene cercata alla fine e quando la ricerca inizia dopo la cella specificata e raggiunge la fine dell'intervallo di ricerca, senza trovare il valore di ricerca, la ricerca ricomincia dall'inizio dell'intervallo di ricerca fino alla cella specificata. Se l'argomento non viene specificato, la cella iniziale è definita nell'angolo superiore sinistro del campo di ricerca, dopo di che inizia la ricerca.

Se si specifica After: = Range ("A13") in cui il campo di ricerca è Range ("A1: A20"), il metodo Find inizierà la ricerca dalla cella A14, fino alla cella A20 e successivamente cercherà dalla cella A1 fino alla cella A13.

Lookin: Questo argomento specifica il tipo di informazioni - può essere xlValues o xlFormulas o xlComments che indicano il tipo di valore da cercare, se una formula, un commento o un valore. Il valore predefinito è xlFormulas.

Fig. 1

Prendiamo il caso in cui la cella A7 di figura 1 contenga la formula =SOMMA(A4;A5) e il totale della somma è 176, si può usare il metodo Find per cercare il valore nelle formule in questo modo:

ActiveSheet.Range("A1:A20").Find(What:="176", After:=ActiveSheet.Range("A1"), LookIn:=xlFormulas)

Verrà restituita la cella $A$9, perché il valore 176 NON compare nella formula della cella A7, ma compare come valore nella cella A9. Se invece usiamo il metodo Find per ricercare il valore 176 deve essere espresso in questo modo:

ActiveSheet.Range("A1:A20").Find(What:="176", After:=ActiveSheet.Range("A1"), LookIn:=xlValues)
Restituirà $A$7, in quanto il valore 176 appare come risultato della formula nella cella A7 e solo dopo nella cella A9. Analogamente, nel caso in cui la cella A7 contiene la formula =SOMMA(A4;A5), e la cella A16 contiene la stringa somma, si può applicare il metodo Find in questo modo:

ActiveSheet.Range("A1:A20").Find(What:="somma", After:=ActiveSheet.Range("A1"), LookIn:=xlValues)
Restituirà $A$16, mentre invece se il metodo viene espresso nel seguente modo:

ActiveSheet.Range("A1:A20").Find(What:="sum", After:=ActiveSheet.Range("A1"), LookIn:=xlFormulas)
Restituirà $A$7

Esempio: Le opzioni del metodo Find
Codice:
Sub cerca_1()
Dim valoreC As Range

'Restituisce $A$9
Set valoreC = ActiveSheet.Range("A1:A20").Find(What:="176", After:=ActiveSheet.Range("A1"), LookIn:=xlFormulas)
If Not valoreC Is Nothing Then
MsgBox valoreC.Address
'End If

'Restituisce $A$7
Set valoreC = ActiveSheet.Range("A1:A20").Find(What:="176", After:=ActiveSheet.Range("A1"), LookIn:=xlValues)
If Not valoreC Is Nothing Then
MsgBox valoreC.Address
'End If

'Restituisce $A$16
Set valoreC = ActiveSheet.Range("A1:A20").Find(What:="somma", After:=ActiveSheet.Range("A1"), LookIn:=xlValues)
If Not valoreC Is Nothing Then
MsgBox valoreC.Address
End If

'Restituisce $A$7
Set valoreC = ActiveSheet.Range("A1:A20").Find(What:="sum", After:=ActiveSheet.Range("A1"), LookIn:=xlFormulas)
If Not valoreC Is Nothing Then
MsgBox valoreC.Address
End If
End Sub
E’ possibile utilizzare anche gli altri parametri della sintassi del metodo Find come:

LookAt: È possibile specificare xlWhole o xlPart , se volete, rispettivamente, una corrispondenza esatta o una corrispondenza parziale. Una ricerca utilizzando xlPart per "Gianni" restituirà la cella che ha "Gianni Morandi", perché c'è una corrispondenza parziale. Utilizzare xlWhole per abbinare l'intero valore o la stringa che corrisponde esattamente al valore di una cella. Il valore predefinito è xlPart.

SearchOrder: È possibile specificare xlByRows o xlByColumns per questo argomento, che indicano se cercare per righe o per colonne. Il valore predefinito è xlByRows.

Supponiamo che le celle A7 e B3 contengano la stringa "somma" si può utilizzare il metodo Find per una ricerca nelle righe in questo modo:
ActiveSheet.Range("A1:B20").Find (What:= "somma", LookIn:=xlValues, SearchOrder:=xlByRows)

Mentre invece per una ricerca nelle colonne si deve applicare il metodo Find in questo modo:
ActiveSheet.Range ("A1:B20").Find (What:= "somma", LookIn: = xlValues, SearchOrder: = xlByColumns )

XlSearchDirection: È possibile specificare xlNext per ricerche verso il basso (cioè il valore corrispondente successivo) o xlPrevious per ricerche verso l'alto o all'indietro (cioè il valore corrispondente precedente) nel campo di ricerca. Il valore predefinito è xlNext. Se si specifica After: = Range ("A13") in cui il campo di ricerca è Range ("A1: A20") e impostare il SearchDirection: = xlNext , allora la funzione di ricerca inizierà a cercare dalla cella A14 fino alla cella A20 e poi ricercare dalla cella A1 fino alla cella A13.

MatchCase : Si deve specificare il valore True per una ricerca case-sensitive. Il valore predefinito è False.

MatchByte: Questo argomento può essere utilizzata solo se si seleziona il supporto delle lingue a doppio byte.

SearchFormat: Indica se si desidera cercare una specifica formattazione con il valore True o False. Il valore predefinito è False. Si deve specificare il formato utilizzando la proprietà FindFormat dell'oggetto Application, e impostare l'argomento SearchFormat true. Vedi l’esempio sotto riportato che illustra questa tesi.

Esempio: Utilizzare il metodo Find per cercare la prima occorrenza del valore stringa "somma", che è in grassetto. Si noti che la ricerca inizierà dopo la cella A1 (cioè dalla A2) in assenza dell’argomento After
Codice:
Sub cerca_formato()
Dim cerca_1 As Range, ultima As Range, cerca_val As Range
'impostare l'intervallo di ricerca
Set cerca_1 = ActiveSheet.Range("A1:A20")
'specificare l'ultima cella del range
Set ultima = cerca_1.Cells(cerca_1.Cells.Count)
'Specificare il formato utilizzando FindFormat
Set cerca_val = cerca_1.Find(What:="somma", After:=ultima, LookIn:=xlValues, SearchFormat:=True)
MsgBox cerca_val.Address
End Sub
Ogni volta che il metodo Find viene utilizzato, le impostazioni per LookIn, LookAt, SearchOrder, e MatchByte vengono salvate, a meno che i valori per questi argomenti non siano specificati di nuovo, i valori precedentemente salvati vengono utilizzati di nuovo la prossima volta che viene richiamato il metodo. Quindi è importante impostare questi argomenti in modo esplicito ogni volta che questo metodo viene utilizzato. In questo modo, il valore di argomento utilizzato in precedenza diventa il default se non specificato nel successivo uso. Ad esempio, se si specifica LookIn con l’argomento xlFormulas, poi xlFormulas diventa il valore predefinito per l'argomento LookIn. E nel successivo utilizzo, se si omette di menzionare l'argomento LookIn, si imposterà xlFormulas.

Nel caso in cui si desidera cercare un elemento o un valore in un intervallo, una pratica comune è utilizzare un ciclo come Loop o For Next. Se l'intervallo di ricerca è piuttosto grande, l’uso del ciclo potrebbe richiedere molto tempo, mentre invece un grande vantaggio nell'uso del metodo Find è la sua velocità.
Per trovare occorrenze multiple di un elemento o un intervallo si può utilizzare il metodo FindNext o FindPrevious. Questi metodi sono utilizzati per proseguire la ricerca con il metodo Find, utilizzando gli stessi parametri o condizioni, e restituire il successivo (metodo FindNext) o precedente (metodo FindPrevious) cella corrispondente.

Metodo Range.FindNext: Sintassi: RangeObject.FindNext (After)

RangeObject: Rappresenta un intervallo in cui viene cercato l'elemento o il valore specifico.

After: Rappresenta una singola cella che si deve specificare dopo la quale inizia la ricerca. Quando la ricerca inizia dopo la cella specificata e raggiunge la fine dell'intervallo di ricerca, senza trovare il valore di ricerca, la ricerca ricomincia dall’inizio dell'intervallo di ricerca fino alla cella specificata. È facoltativo specificare questo argomento, e se non specificato, è la cella nell'angolo superiore sinistro del campo di ricerca, dopo di che inizia la ricerca.

Il Metodo Range.FindPrevious: Sintassi: RangeObject.FindPrevious (After)

RangeObject: Rappresenta un intervallo in cui viene cercato l'elemento o valore specifico.

After: Rappresenta una singola cella che si specifica prima che inizia la ricerca, perché la ricerca inizia da questa cella. È facoltativo specificare questo argomento, e se non specificato, è la cella nell'angolo superiore sinistro del campo di ricerca prima che inizia la ricerca.

Esempio: Trovare più occorrenze di un valore in un intervallo; trovare la stringa "vecchia" in un campo di ricerca, sostituirla con "nuova" e cambiare il colore del carattere.
Codice:
Sub multi_cerca()
Dim cerca1 As Range, ultima As Range, cerca_prima As Range
Dim primo_ind As String
'Impostare l'intervallo di ricerca
Set cerca1 = ActiveSheet.Range("A1:A100")
'Specifica ultima cella nel range
Set ultima = cerca1.Cells(cerca1.Cells.Count)
'Trovare la stringa "vecchia" nel campo di ricerca
Set cerca_prima = cerca1.Find(What:="vecchia", After:=ultima, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

'Se "vecchia" si trova nel campo di ricerca
If Not cerca_prima Is Nothing Then
'Salva l'indirizzo del primo risultato di "vecchia", nella variabile primo_ind
primo_ind = cerca_prima.Address
Do
'Trova la successiva occorrenza di "vecchia". Si noti, che non si parte dalla prima occorrenza di "vecchia"
Set cerca_prima = cerca1.FindNext(cerca_prima)
'Sostituire "vecchia" con "nuova"
cerca_prima.Value = "nuova"
'Colore del carattere è cambiato
cerca_prima.Font.Color = vbRed

Loop Until cerca_prima.Address = primo_ind
End If
End Sub
Esempio: Con riferimento all’Immagine 2, sotto riportata, il codice proposto mostra come utilizzare il metodo Find e la proprietà Offset per fare una ricerca verticale.

Fig. 2

Per ogni studente nella colonna A, si deve trovare il nome dello stesso nella colonna E, e inserire i suoi voti nella colonna B, solo se è nella classe 3
Codice:
Sub cerca_2()
Dim cerca1 As Range, nomeSt As Range, prima As Range, stud As Range
Set cerca1 = ActiveSheet.Range("E3:E7")
Set nomeSt = ActiveSheet.Range("A3:A7")
'si ricercano tutti i nomi degli studenti menzionati nell'intervallo specificato
For Each stud In nomeSt
Set prima = cerca1.Find(What:=stud, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
'Se il nome dello studente viene trovato e se studente è in classe 3
If Not prima Is Nothing And prima.Offset(0, 1) = "3" Then
stud.Offset(0, 1) = prima.Offset(0, 2)
End If
Next
End Sub
Utilizzo del metodo Find per cercare una data
Excel memorizza tutte le date come numeri interi e il tempo come frazioni decimali. Con questo sistema, Excel può aggiungere, sottrarre o confrontare date e ore, proprio come qualsiasi altro numero, considerando come data iniziale di questo sistema il 1/1/1900 0:00:00, che Excel considera erroneamente il 1900 come un anno bisestile, si presume che questo errore sia stato fatto consapevolmente da Microsoft per garantire la compatibilità con Lotus 1-2-3, e quindi in realtà il bug sarebbe stato in Lotus 123 (predecessore di Excel).

In Excel, la data equivale a un "numero di serie" (che è un valore numerico), che è il conteggio del numero di giorni trascorsi da una certa data di riferimento. La parte intera (valori a sinistra del separatore decimale) è il numero di giorni trascorsi dal 1 gennaio 1900, ad esempio, 1 gennaio 1900 viene memorizzato come 1, il 2 gennaio 1900 viene memorizzato come 2, il 15 marzo 2001 viene memorizzato come 36.965. La parte frazionaria (valori a destra del decimale) contiene informazioni temporali, e rappresenta il tempo come frazione di un giorno intero. Ad esempio, 12:00 (mezzanotte) è memorizzato come 0, 06:00 viene memorizzato come 0,25, 12:00 (mezzogiorno) viene memorizzato come 0.5, 06:00 viene memorizzato come 0,75, 06:00:30 viene memorizzato come 0,750347222. Per controllare il "numero di serie" di una data e ora si deve formattare la cella come "Generale".

L’utilizzo del metodo Find per trovare o cercare una data può essere difficile, il formato della data deve corrispondere al formato data predefinito, come impostato nel vostro desktop, che, se non specificatamente modificato, dovrebbe essere nel suo formato standard di "data breve" o "data lunga”, vale a dire, " 22/01/2010" o "22 gennaio 2010". Non importa in quale data il formato viene visualizzato nel foglio di lavoro, deve solo essere una data valida per Excel corrispondente ad un numero di serie valido. Il codice seguente mostra come utilizzare il metodo Find per cercare una data

Esempio: Ricerca di una data all'interno di un intervallo

Fig. 3

In questo esempio l’utente inserisce la data che vuole trovare nella cella D2 che viene rappresentata col valore di 36254 in quanto la cella è formattata come "Generale". La ricerca avviene nella colonna A.
Codice:
Sub cerca_data()
Dim primo As Range, cerca1 As Range, ultimo As Range
Dim strDate As String
'intervallo di ricerca
Set cerca1 = ActiveSheet.Range("A1:A20")
Set ultimo = cerca1.Cells(cerca1.Cells.Count)
 
'si stabilisce che la data da cercare è in D2
strDate = Format(ActiveSheet.Range("D1"), "Short Date")
'Format ("4/4/99", "Short Date") restituisce "04/04/1999"
'Format ("4/4/99", "Long Date") restituisce "Domenica 4 Aprile 1999".
'La funzione IsDate restituisce True se l'espressione è una data valida, altrimenti restituisce False.
If IsDate(strDate) = False Then
MsgBox "Formato Data Incorretto"
Exit Sub
End If
'CDate converte un numero o una stringa di testo in un tipo di dati Date.
'CDate (36240) restituisce "04/04/1999"
 
Set primo = cerca1.Find(What:=CDate(strDate), After:=ultimo, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If Not primo Is Nothing Then
'Se la data viene trovata si stampa l'indirizzo della cella (A5 in questo esempio)
MsgBox primo.Address
Else
MsgBox "Data non trovata"
End If
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 19-06-2014, 14.32.01   #38
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Approfondimento ed esempi sulla Proprietà Range, Cells, Item, Row e Columns




È possibile fare riferimento o accedere a un Range del foglio di lavoro utilizzando le proprietà e i metodi dell'oggetto Range che si riferisce ad una cella o a un intervallo di celle, può essere una riga, una colonna o una selezione di celle comprendenti uno o più blocchi contigui di celle. Uno degli aspetti più importanti nella codifica vba fa riferimento a intervalli all'interno di un foglio di lavoro.


La Proprietà Range
Abbiamo detto che un oggetto Range si riferisce a una cella o a un intervallo di celle e può essere una riga, una colonna o una selezione di celle comprendenti uno o più blocchi contigui di celle. Un oggetto Range fa sempre riferimento a un foglio di lavoro specifico, e Excel attualmente non supporta gli oggetti Range che si sviluppano su più fogli di lavoro. Alcuni esempi di codice:

• Oggetto Range riferito a una singola cella
Dim rng As Range
Set rng = Range ("A1")


• Oggetto Range riferito a un blocco di celle contigue
Dim rng As Range
Set rng = Range ("A1: C3")


• Oggetto Range riferito ad una riga
Dim rng As Range
Set rng = Rows (1)


• Oggetto Range riferito a più colonne
Dim rng As Range
Set rng = Columns ("A: C")


Codice per l’oggetto Range riferito a 2 o più blocchi di celle contigue, utilizzando il metodo Union e Selection

Il Metodo Union
Dim rng1 As Range, rng2 As Range, rngUnion As Range
'impostare un blocco contiguo di celle come primo intervallo (o Range)
Set rng1 = Range ("A1: B2")
'impostare un altro blocco contiguo di celle come secondo intervallo
Set rng2 = Range ("D3: E4")
'assegnare una variabile (oggetto range) per rappresentare l'unione dei due intervalli
Set rngUnion = Union (rng1, rng2)
'colore interno impostato per l'intervallo che è l'unione di 2 oggetti Range
rngUnion.Interior.Color = vbYellow

La Proprietà Selection
'Selezionare 2 blocchi contigui di celle, utilizzando il metodo Select
Range("A1:B2,D3:E4").Select
'impostare il colore di sfondo delle celle selezionate a giallo
Selection.Interior.Color = vbYellow


La proprietà Worksheet, Sintassi: WorksheetObject.Range (Cell1, Cell2)
E’ possibile utilizzare solo l'argomento Cell1 e in questo caso dovrà essere un riferimento a un Range che può includere un operatore di intervallo (2 punti) o l'operatore di unione (virgola), o il riferimento a un intervallo che può essere un nome definito. Esempi di utilizzo di questo tipo di riferimento sono:

Worksheets ("Foglio1"). Range ("A1") che si riferisce alla cella A1, oppure
Worksheets ("Foglio1"). Range ("A1: B3"), che si riferisce alle celle A1, A2, A3, B1, B2 e B3.

Quando entrambi gli argomenti cell1 e cell2 vengono utilizzati (cell1 e cell2 sono oggetti Range), si riferiscono alle celle comprese tra l'angolo superiore sinistro e l'angolo inferiore destro del Range, cioè le celle iniziali e finali del Range , e gli argomenti possono essere una singola cella, un'intera riga o colonna o una singola cella denominata. Un esempio di utilizzo di questo tipo di riferimento è

Worksheets ("Foglio1"). Range (Cells (1, 1), Cells (3, 2)) , che si riferisce alle celle A1, A2, A3, B1, B2 e B3.

Utilizzando il codice Range ("A1") verrà restituita la cella A1 del foglio attivo, come se si utilizza la sintassi Application.Range ("A1") o ActiveSheet.Range ("A1")


La proprietà Range, Sintassi: RangeObject.Range (Cell1, Cell2)
Per accedere a un Range relativo a un intervallo, ad esempio:
Worksheets("Foglio1").Range("C5:E8").Range("A1") si farà riferimento al Range ("C5") mentre il codice Worksheets("Foglio1").Range("C5:E8").Range("B2") farà riferimento al Range ("D6")

Rispetto ad utilizzare la proprietà Range, è possibile utilizzare anche un codice breve per fare riferimento a un intervallo utilizzando le parentesi quadre per racchiudere un riferimento di tipo “A1” o un nome. Durante l'utilizzo delle parentesi quadre, non si racchiude l'intervallo tra virgolette per renderlo una stringa. Utilizzando le parentesi quadre è come applicare il metodo Evaluate dell'oggetto Application, in cui la proprietà Range o il metodo Evaluate utilizzano un argomento stringa che permette di manipolare la stringa con codice VBA. Esempi: utilizzando

[A1]. Value = 5 è equivalente all'utilizzo di
Range ( "A1"). Value = 5, mentre usando
[A1: A3, B2: B4, C3: D5]. Interior.Color = vbRed equivale a
Range ("A1: A3, B2: B4, C3: D5"). Interior.Color = vbRed , e con intervalli denominati come:
[pippo] .Interior.Color = vbBlue equivale a
Range ("pippo"). Interior.Color = vbBlue.

Utilizzando le parentesi quadre si consentono solo riferimento a intervalli fissi, mentre invece usando la proprietà Range si permette di manipolare l'argomento stringa con codice VBA in modo che è possibile utilizzare delle variabili per fare riferimento a un Range dinamico, come illustrato di seguito:
Codice:
Sub RangeDinamico () 
Dim i As Integer
‘si inserisce Ciao nelle celle da 1 a 5 della colonna B
For i = 1 To 5 
Range ("B" & i) = "Ciao"
next i
End Sub
La proprietà Cells restituisce un oggetto Range riferito a tutte le celle di un foglio di lavoro o a un intervallo, in quanto può essere utilizzata con riferimento ad un oggetto Application, a un oggetto foglio di lavoro o un oggetto Range. La proprietà Application.Cells si riferisce a tutte le celle del foglio di lavoro attivo ed è possibile utilizzare Application.Cells nel codice o omettere il qualificatore di oggetto e utilizzare il codice per riferirsi a tutte le celle del foglio di lavoro attivo.

La proprietà Worksheet.Cells: Sintassi: WorksheetObject.Cells si riferisce a tutte le celle di un foglio di lavoro specificato, utilizzando il codice
Worksheets ("Foglio1"). Cells si fa riferimento a tutte le celle del foglio denominato "Foglio1".

Utilizzando la struttura Range.Cells ci si riferisce alle celle in un intervallo specificato - Sintassi: RangeObject.Cells. Questa proprietà può essere utilizzata come
Range ("A1: B5"). Cells, ma utilizzando le celle come nome intervallo in questo caso è irrilevante perché con o senza questa dicitura il codice farà riferimento al Range A1: B5. Per fare riferimento a una cella specifica, si deve utilizzare la Proprietà Item dell'oggetto Range, specificando la riga relativa e le posizioni delle colonne dopo la parola chiave Cells, vale a dire,

Worksheets ("Foglio1"). Cells.Item (2, 3) si riferisce al Range C2 e
Worksheets ("Foglio1"). Range ("C2"). Cells (2, 3) farà riferimento al Range E3.

Poiché la proprietà Item è la proprietà predefinita del oggetto Range è possibile omettere questa istruzione utilizzando questo codice

Worksheets ("Foglio1"). Cells (2, 3), che si riferisce anche al Range C2. Si può preferire in alcuni casi utilizzare
Worksheets ("Foglio1"). Cells (2, 3) rispetto a
Worksheets ("Foglio1"). Range ("C2"), perché le variabili di riga e colonna possono essere facilmente utilizzabili


La Proprietà Item: si deve utilizzare la proprietà Range.Item per restituire un intervallo come offset nell'intervallo specificato Sintassi: RangeObject.Item (RowIndex, ColumnIndex) . È necessario specificare l'argomento RowIndex mentre ColumnIndex è opzionale. RowIndex è il numero di indice della cella, partendo da 1 e crescente da sinistra a destra e poi verso il basso.

Worksheets ("Foglio1"). Cells.Item (1) o
Worksheets ("Foglio1"). Cells (1) si riferisce al Range A1, mentre
Worksheets ("Foglio1"). Cells (2) si riferisce al Range B1.

Durante l'utilizzo di un solo parametro di riferimento della proprietà Item (RowIndex), se l'indice supera il numero di colonne nell'intervallo specificato, il riferimento verrà disposto alle righe successive all'interno delle colonne del Range. Tralasciando l'oggetto qualificatore imposterà il foglio attivo. Cells (16385) che si riferisce al Range A2 del foglio attivo in Excel 2007 che ha 16384 colonne e cells (16386) si riferisce all’intervallo B2, e così via. Si noti inoltre che RowIndex e ColumnIndex sono offset e relativi nell'intervallo specificato (cioè rispetto all'angolo superiore sinistro del campo specificato). Entrambe le espressioni:

Range ("B3") .Item (1) e
Range ("B3: D6").Item (1) si riferiscono al Range B3.

Il seguente codice si riferisce al Range D4:

Range ("B3: D6") Item (6) o
Range ("B3: D6"). Cells (6) o
Range ("B3: D6") (6). ColumnIndex[/i] si riferisce al numero di colonna della cella e può essere un numero che inizia con 1 o può essere una stringa che inizia con la lettera "A".

Worksheets ("Foglio1"). Cells (2, 3) e
Worksheets ("Foglio1"). Cells (2, "C") si riferiscono entrambi al Range C2 in cui RowIndex è 2 e ColumnIndex è 3 (colonna C),

Range ("C2"). Cells (2, 3) si riferisce al Range E3 nel foglio attivo, e
Range ("C2"). Cells (4, 5) si riferisce al Range G5 nel foglio attivo. Utilizzando:
Range ("C2"). Item (2, 3) e Range ("C2"). Item (4, 5) si ha lo stesso effetto e si riferiscono, rispettivamente, al Range E3:G5. Utilizzando:
Range ("C2: D3"). Cells (2, 3) e
Range ("C2: D3"). Cells (4, 5) sarà come riferirsi rispettivamente al Range E3 e al Range G5. Omettere la Voce Item esprimendo il codice in questo modo
Range ("C2: D3") (2, 3) e
Range ("C2: D3") (4, 5), ci si riferisce al Range E3 e al Range G5.


La Proprietà Columns nell’Oggetto Foglio di lavoro ha la seguente Sintassi: WorksheetObject.Columns per riferirsi a tutte le colonne in un foglio di lavoro che vengono restituite come un oggetto Range. Esempio:

Worksheets ("Foglio1"). Columns restituirà tutte le colonne del foglio di lavoro, mentre
Worksheets ("Foglio1"). Columns (1), restituisce la prima colonna (colonna A) del foglio di lavoro, oppure Worksheets ("Foglio1"). Columns ("A") restituisce la prima colonna (colonna A) e
Worksheets ("Foglio1"). Columns ("A: C") restituisce le colonne A, B e C; e così via. Tralasciando l'oggetto qualificatore si imposterà il foglio come attivo, utilizzando la colonna (1) che restituisce la prima colonna del foglio attivo.

La Proprietà Columns dell'oggetto Range ha la seguente Sintassi: RangeObject.Columns e viene usato per fare riferimento alle colonne in un intervallo specificato. Esempio: per inserire un colore di sfondo nelle celle di tutte le colonne del Range specificato, cioè da B2 a D4.

Worksheets ("Foglio1"). Range ("B2: D4"). Columns.Interior.Color = vbYellow. oppure per Inserire il colore di fondo nelle celle della prima colonna del Range B2:B4:

Worksheets ("Foglio1"). Range ("B2: D4"). Columns (1). Interior.Color = vbGreen.

Se l'oggetto specificato contiene più zone, le colonne della prima area verranno restituite solo da questa proprietà. Prendiamo l'esempio di 2 aree nell'intervallo specificato, la prima area sarà "B2: D4" e la seconda "F3: G6", il seguente codice inserisce il colore di fondo nelle celle dalla prima colonna della prima area dalle celle B2: B4:

Worksheets ("Foglio1"). Range ("B2: D4, F3: G6"). Columns (1). Interior.Color = vbRed

La Proprietà Worksheet.Rows ha la seguente Sintassi: WorksheetObject.Rows e si riferisce a tutte le righe in un foglio di lavoro che vengono restituite come un oggetto Range si può usare

Worksheets ("Foglio1"). Rows che restituirà tutte le righe del foglio di lavoro, mentre
Worksheets ("Foglio1 "). Rows (1) restituisce la prima riga (riga uno) del foglio di lavoro e
Worksheets ("Foglio1"). Rows (3) restituisce la terza riga del foglio di lavoro e
Worksheets ("Foglio1"). Rows ("1:03") restituisce le prime 3 righe, e così via.

La Proprietà Range.Rows ha la seguente Sintassi: RangeObject.Rows fa riferimento a delle righe in un intervallo specificato, per esempio, per inserire il colore di fondo in tutte le righe specificate da B2 a D4 si usa:

Worksheets ("Foglio1"). Range ("B2: D4"). Rows.Interior.Color = vbYellow mentre invece per inserire il colore di fondo nella prima riga nel Range da B2 a D2:
Worksheets ("Foglio1"). Range ("B2: D4"). Rows (1). Interior.Color = vbGreen.

Se l'oggetto specificato contiene più zone, le righe della prima area verranno restituite solo dalla proprietà Areas. Prendiamo l'esempio di 2 aree nell'intervallo specificato, la prima area è "B2: D4" e la seconda area è "F3: G6" - il seguente codice inserisce il colore di fondo nelle celle dalla prima riga della prima area alle celle da B2 a D2:

Worksheets ("Foglio1"). Range ("B2: D4, F3: G6"). Rows (1). Interior.Color = vbRed.

La Proprietà Range.Offset ha la seguente Sintassi: RangeObject.Offset (RowOffset, ColumnOffset) . Entrambi gli argomenti sono facoltativi, l’argomento RowOffset specifica il numero di righe dell’intervallo specificato in cui si deve spostare, tenendo presente che valori negativi indicano uno spostamento verso l'alto e valori positivi indicano lo spostamento verso il basso, il valore di default è 0. L'argomento ColumnOffset specifica il numero di colonne dell'intervallo specificato in cui ci si deve spostare, tenendo presente che valori negativi indicano lo spostamento a sinistra e valori positivi indicano lo spostamento a destra, il valore di default è 0. Esempio:

Range ("C5"). Offset (1, 2) si sposta di 1 riga e 2 colonne e si riferisce al Range E6, mentre invece
Range ("C5: D7 "). Offset (1, -2) si sposta di 1 riga verso il basso e di 2 colonne a sinistra e si riferisce al Range (A6: B8).


Accedere a un intervallo
con Riferimento a una singola cella, inserire il valore 10 nella cella A1 del foglio di lavoro denominato "Foglio1"

Worksheets ("Foglio1"). Range ("A1"). Value = 10
Worksheets ("Foglio1"). Range ("A1") = 10


Inserire il valore di 10 nella cella C2 del foglio di lavoro attivo
ActiveSheet.Cells (2, 3). Value = 10

Riferimento a un intervallo di celle
Inserire il valore 10 nelle celle A1, A2, A3, B1, B2 e B3 del foglio attivo
ActiveSheet.Range. ("A1: B3"). Value = 10
ActiveSheet.Range ("A1", "B3"). Value = 10
ActiveSheet.Range (Cells (1, 1), Cells (3, 2)) = 10


Inserire il valore 10 nelle celle A1 e B3 del foglio denominato "Foglio1":
Worksheets ("Foglio1"). Range ("A1, B3"). Value = 10

Impostate il colore di sfondo (rosso) per le celle B2, B3, C2, C3, D2, D3 e H7 del foglio di lavoro denominato "Foglio3"
ActiveWorkbook.Worksheets ("Foglio3"). Range ("B2: D3, H7"). Interior.Color = vbRed

Inserire il valore 10 nell’intervallo denominato "pippo" del foglio di lavoro attivo, vale a dire che è possibile assegnare un nome al Range ("B2: B3") come "pippo" per inserire 10 nelle celle B2 e B3
Range ("pippo"). Value = 10
ActiveSheet.Range ("pippo"). Value = 10


Selezionare tutte le celle del foglio di lavoro attivo:
ActiveSheet.Cells.Select
Cells.Select


Impostare il font "Times New Roman" e la dimensione del carattere a 11, per tutte le celle del foglio di lavoro attivo nella cartella di lavoro attiva
ActiveWorkbook.ActiveSheet.Cells.Font.Name = "Times New Roman"
ActiveSheet.Cells.Font.Size = 11
Cells.Font.Size = 11



Righe e Colonne
Selezionare tutte le righe del foglio di lavoro attivo
ActiveSheet.Rows.Select

Inserire il valore 10 in ogni cella della riga 2 del foglio di lavoro denominato "Foglio1"
Worksheets ("Foglio1"). Righe (2). Valore = 10

Selezionare tutte le colonne del foglio di lavoro attivo
ActiveSheet.Columns.Select
Columns.Select


Inserire il valore 10 in ogni cella della colonna numero 3 del foglio di lavoro attivo
ActiveSheet.Columns (3). Value = 10
Columns ("C"). Value = 10


Inserire il valore 10 in ogni cella delle colonne 1, 2 e 3 del foglio denominato "Foglio1"
Worksheets ("Foglio1"). Columns ("A: C"). Value = 10


Riferimento relativo
Inserisce il valore 10 in C5
Range ("C5: E8"). Range ("A1") = 10

Inserisce il valore 10 in D6 - riferimento inizia dall'angolo superiore sinistro del campo definito:
Range ("C5: E8"). Range ("B2") = 10

Inserisce il valore 10 in E6, con offset di 1 riga e 2 colonne
Range ("C5"). Offset (1, 2) = 10

Inserisce il valore 10 nel Range ("F7: H10") con Offset di 2 righe e 3 colonne
Range. ("C5: E8"). Offset (2, 3) = 10
Codice:
 Sub esempio_1()
Dim ws As Worksheet, rng As Range
Dim r As Integer, c As Integer, n As Integer, i As Integer, j As Integer
Set ws = Worksheets("Foglio1")
ws.Activate
For r = 1 To 5
n = 1
For c = 1 To 5
Cells(r, c).Value = n
n = n + 1
Next c
Next r
Set rng = Range(Cells(1, 1), Cells(5, 5))
For i = 1 To 5
If i Mod 2 = 0 Then
rng.Columns(i).Interior.Color = vbYellow
Else
rng.Columns(i).Interior.Color = vbGreen
End If
Next i
 
For j = 1 To 5
If j Mod 2 = 0 Then
rng.Rows(j).Font.Bold = True
rng.Rows(j).Font.Color = vbRed
End If
Next j
 
rng.Cells.Font.Italic = True
End Sub
Per restituire il numero della prima riga in un intervallo, si utilizza la Proprietà Range.Row e se l'intervallo specificato contiene più aree, questa proprietà restituirà il numero della prima riga della prima area. Sintassi: RangeObject.Row, mentre invece per restituire il numero della prima colonna in un intervallo, si utilizza la Proprietà Range.Column e se l'intervallo specificato contiene più aree, questa proprietà restituirà il numero della prima colonna nella prima area. Sintassi: RangeObject.Column

Esempi:
Prendi il numero della prima riga nell’intervallo specificato – restituisce 4:
MsgBox ActiveSheet.Range ("B4"). Row
MsgBox Worksheets ("Foglio1"). Range ("B4: D7"). Row


Prendi il numero della prima colonna nell'intervallo specificato - restituisce 2:
MsgBox ActiveSheet.Range ("B4: D7"). Columns

Prendi il numero dell'ultima riga nell'intervallo specificato - restituisce 7:
Spiegazione: Range ("B4: D7"). Rows.Count restituisce 4 (il numero di righe nell'intervallo), così come: Range("B4:D7").Rows(Range("B4:D7").Rows.Count) o
Range("B4:D7").Rows(4), restituiscono l'ultima riga nell'intervallo specificato.

MsgBox Range ("B4: D7"). Row. (Range ("B4: D7"). Rows.Count). Row

Esempio: Utilizzare la Proprietà Row, Columns per determinare il numero di riga e numero di colonna a righe alternate
Codice:
Sub esempio_2()
Dim rng As Range, cell As Range, i As Integer

Set rng = Worksheets("Foglio1").Range("B4:D7")
 
For Each cell In rng
cell.Value = cell.Row & "," & cell.Column
Next
 
For i = 1 To rng.Rows.Count
If i Mod 2 = 1 Then
rng.Rows(i).Interior.Color = vbGreen
Else
rng.Rows(i).Interior.Color = vbYellow
End If
Next
End Sub
È possibile ottenere un riferimento di intervallo in linguaggio VBA utilizzando la proprietà Range.Address , che restituisce l'indirizzo di un intervallo come valore stringa. Questa proprietà è di sola lettura. Esempi di utilizzo

Restituisce $B$2
MsgBox Range ("B2"). Address

Restituisce $B$2, $C$3
MsgBox Range ("B2, C3"). Address

Restituisce $A$1: $B$2, $C$3, $D$4
Dim strRng As String
Range ("A1: B2, C3, D4"). Select
strRng = Selection.Address
MsgBox strRng


Restituisce $B2
MsgBox Range ("B2"). Address (RowAbsolute: = False)

Restituisce B$2
MsgBox Range ("B2"). Address (ColumnAbsolute: = False)

Restituisce R2C2
MsgBox Range ("B2"). Address (ReferenceStyle: = xlR1C1)

Restituisce R[1] C[-1] – il Range ("B2") è di 1 riga e -1 colonna rispetto al Range ("C1")
MsgBox Range ("B2"). Address (RowAbsolute: = False, ColumnAbsolute: = False, ReferenceStyle: = xlR1C1, relativeTo: = Range ("C1"))

Restituisce RC [-2] – il Range ("A1") è di 0 riga e -2 colonne rispetto al Range ("C1")
MsgBox Cells(1, 1). Address (RowAbsolute: = False, ColumnAbsolute: = False, ReferenceStyle: = xlR1C1, relativeTo: = Range ( "C1"))


Attivare e selezionare Celle con ActiveCell e Selection
Il metodo Select (dell'oggetto Range) viene utilizzato per selezionare una cella o un intervallo di celle in un foglio di lavoro e presenta la seguente Sintassi: RangeObject.Select, dovete assicurarvi che il foglio di lavoro in cui viene applicato il metodo Select per selezionare le celle, sia il foglio attivo.
La proprietà ActiveCell (dell'oggetto Application) restituisce una singola cella attiva (oggetto Range) nel foglio di lavoro attivo, tenendo presente che la proprietà ActiveCell non funziona se il foglio attivo non è un foglio di lavoro. Quando si seleziona una cella nella finestra attiva, la proprietà Selection (dell'oggetto Application) restituisce un oggetto Range che rappresenta tutte le celle che sono attualmente selezionate nel foglio di lavoro attivo.

Una selezione può essere costituita da una singola cella o un intervallo di più celle, ma ci sarà una sola cella attiva al suo interno, che viene restituita utilizzando la proprietà ActiveCell. Quando viene selezionata una sola cella, la proprietà ActiveCell restituisce questa cella, mentre invece selezionando più celle utilizzando il metodo Select, la prima cella di riferimento diventa la cella attiva, e, successivamente, è possibile modificare la cella attiva utilizzando il metodo Activate. Sia la proprietà ActiveCell e la proprietà Selection sono di sola lettura, e non specificando l'oggetto Application cioè il qualificatore Application.ActiveCell o ActiveCell o Application.Selection o Selection , avranno lo stesso effetto. Per attivare una singola cella all'interno della selezione corrente, si deve utilizzare il metodo Activate (dell'oggetto Range) che presenta questa Sintassi: RangeObject.Activate , e la cella attivata verrà restituita utilizzando la proprietà ActiveCell.

Abbiamo discusso sopra che una selezione può essere costituita da una singola cella o un intervallo di più celle, mentre ci può essere solo una cella attiva all'interno della selezione e quando si attiva una cella al di fuori della selezione corrente, la cella attiva diventa l'unica cella selezionata. È inoltre possibile utilizzare il metodo Activate per specificare un intervallo di più celle, ma in effetti sarà attivata solo una singola cella, e questa cella attiva sarà la cella rappresentata dall’angolo superiore sinistro del campo specificato nel metodo. Se questa cella in alto a sinistra si trova all'interno della selezione, la selezione corrente non cambierà, ma se questa cella in alto a sinistra si trova al di fuori della selezione, l'intervallo specificato nel metodo Activate diventa la nuova selezione.

Vediamo del codice per illustrare i concetti di ActiveCell e Selection

Selezione contenente un intervallo di celle e la cella attiva
'selezionare il range C1:F5
Range ("C1: F5"). Select
'restituisce C1, la prima cella di riferimento come cella attiva
MsgBox ActiveCell.Address


Selezione contenente un intervallo di celle e la cella attiva
'selezionare il range F5:C1
Range ("F5: C1"). Select
'restituisce C1, la prima cella di riferimento come cella attiva
MsgBox ActiveCell.Address


Selezione contenente un intervallo di celle e la cella attiva:
'selezionare il Range C1: F5
Range ("C5: F1"). Select
'restituisce C1, la prima cella di riferimento come la cella attiva:
MsgBox ActiveCell.Address


Attivare una cella all'interno della selezione corrente
'Selezionare il range B6: F10
Range ("B6: F10"). Select
'restituisce B6, la prima cella di riferimento come la cella attiva
MsgBox ActiveCell.Address
'La selezione è sempre la stessa, ma la cella attiva è ora C8
Range ("C8"). Activate
MsgBox ActiveCell.Address


Attivare una cella al di fuori della selezione corrente
'Seleziona l’intervallo B6: F10
Range ("B6: F10"). Select
'restituisce B6, la prima cella di riferimento, come cella attiva
MsgBox ActiveCell.Address
'la selezione e la cella attiva è ora A2
Range ("A2"). Activate
MsgBox ActiveCell.Address


Selezionare una cella all'interno della selezione corrente
'Selezionare l’intervallo B6: F10
Range ("B6: F10"). Select
'restituisce B6, la prima cella di riferimento come la cella attiva
MsgBox ActiveCell.Address
'sia la selezione che la cella attiva diventano C8
Range (" C8 "). Select
MsgBox ActiveCell.Address


Attivare un intervallo di celle in cui la cella in alto a sinistra si trova all'interno della selezione corrente
'Seleziona l’intervallo B6: F10
Range ("B6: F10"). Select
'restituisce B6, la prima cella di riferimento, come cella attiva
MsgBox ActiveCell.Address
'La selezione rimane la stessa, ma la cella attiva è ora C8
Range ("C8: G12"). Activate
MsgBox ActiveCell.Address


Attivare un intervallo di celle in cui la cella in alto a sinistra si trova al di fuori della selezione corrente
'Selezionare l’intervallo B6: F10
Range ("B6: F10"). Select
'restituisce B6, la prima cella di riferimento, come la cella attiva
MsgBox ActiveCell.Address
'viene cambiato l’intervallo e la selezione, e la cella attiva è ora B1
Range ("B1: F8"). Activate
MsgBox ActiveCell.Address


La proprietà Application.Selection restituisce l'oggetto selezionato in cui la selezione determina il tipo di oggetto restituito e quando la selezione è un intervallo di celle, questa proprietà restituisce un oggetto Range , e questa selezione (che è un oggetto Range), può comprendere una singola cella, o più celle o intervalli multipli non contigui. Come detto sopra, il metodo Select (dell'oggetto Range) è usato per selezionare una cella o un intervallo di celle in un foglio, pertanto, dopo aver selezionato un intervallo, è possibile eseguire azioni sulla selezione di celle utilizzando l'oggetto Selection.
Codice:
 Sub esempio()
'Selezionare le celle del foglio attivo utilizzando il metodo Range.Select
Range("A1:B3,D6").Select
'impostare il colore di sfondo rosso alle celle della selzione
Selection.Interior.Color = vbRed
End Sub

Le proprietà Entire Row, Entire Column e Insert
La proprietà Range.EntireRow restituisce un'intera riga o le righe all'interno del Range specificato e restituisce un oggetto Range con riferimento alla intera riga. Sintassi: RangeObject.EntireRow, mentre invece la proprietà Range.EntireColumn restituisce un'intera colonna o le colonne all’interno del Range specificato e restituisce un oggetto Range con riferimento alla intera colonna. Sintassi: RangeObject.EntireColumn. Esempi di utilizzo delle proprietà EntireRow e EntireColumn

Selezionare la riga 2
Range ("A2"). EntireRow.Select

Selezionare le righe 2, 3 e 4
Range ("A2: C4"). EntireRow.Select

Inserire il valore 3 nel Range A3 esempio
Cells (3, 4). EntireRow.Cells. (1, 1). Value = 3

Selezionare la colonna A
Range ("A2"). EntireColumn.Select

Selezionare le colonne da A a C:
Range ("A2: C4"). EntireColumn.Select

Inserire il valore 4 nel Range D1
Cells (3, 4). EntireColumn.Cells (1, 1). Value = 4

Il metodo Range.Insert si utilizza per inserire una cella o un intervallo di celle in un foglio di lavoro. Sintassi: RangeObject.Insert (Shift, CopyOrigin). Entrambi gli argomenti racchiusi nelle parentesi sono facoltativi.
Quando si inseriscono dell celle, le altre vengono spostate per fare spazio a quelle inserite, ed è possibile impostare un valore per per determinare la direzione in cui le altre cellule devono spostarsi. Specificando xlShiftDown si sposteranno le celle in basso e con xlShiftToRight si spostano le celle a destra. Tralasciando questo argomento la direzione di spostamento verrà decisa in base alla forma del Range. Specificando xlFormatFromLeftOrAbove per l’argomento CopyOrigin si copierà il formato delle celle inserite dalle celle sopra a sinistra, e specificando xlFormatFromRightOrBelow si copierà il formato dalle celle sotto a destra.

Spostare le celle in basso e copiare la formattazione della cella inserita dalla cella sopra della stessa colonna
Range ("B2"). Insert

Spostare le celle a destra e copiare la formattazione delle celle inserite dalla cella a sinistra
Range ("B2: C4"). Insert

Spostare le celle in basso e copiare la formattazione delle celle inserite a partire dalle celle di inserimento
Range ("B2: D3"). Insert

Spostare le celle in basso e copiare la formattazione delle celle inserite dalle celle in basso
Range ("B2: D3"). Insert CopyOrigin: = xlFormatFromRightOrBelow

Spostare le celle a destra e copiare la formattazione delle celle inserite dalle celle a
Range ("B2: D3"). Insert shift: = xlShiftToRight

Spostare le celle a destra e copiare la formattazione delle celle inserite dalle celle a destra
Range ("B2: D3"). Insert shift: = xlShiftToRight, CopyOrigin: = xlFormatFromRightOrBelow

Inserire 2 righe (la n° 2 e 3) e copiare la formattazione delle righe inserite dalle celle di sopra
Range ("B2: D3"). EntireRow.Insert

Di seguito sono riportati alcuni esempi di inserimento riga o colonna in modo dinamico in un foglio di lavoro.

Esempio: Inserire una riga o colonna, specificando la riga/colonna da inserire
Codice:
Sub inserireRC()
    Dim ws As Worksheet
    Set ws = Worksheets("Foglio1")
‘specificare il numero di righe da inserire
ws.Rows(12).Insert
‘specificare il range sotto al quale inserire le righe
ws.Range("C3").EntireRow.Offset(1, 0).Insert
‘specificare il numero di colonne da inserire
ws.Columns(4).Insert
‘specificare l’intervallo a destra delquale inserire le colonne
ws.Range("C3").EntireColumn.Offset(0, 1).Insert
End Sub
Esempio: Inserire una riga quando un determinato valore viene trovato.
Codice:
 Sub inserisciR()
Dim ws As Worksheet
Dim cercaRNG As Range, cercaR As Range, ultimaRNG As Range
Dim ultimaR As Long

Set ws = Worksheets("Foglio1")
'si deve trovare un valore in questo range e dopo si inserisce una riga
Set cercaR = ws.Range("A1:E100")
'si inizia la ricerca dopo l'ultima cella del range di ricerca 
Set ultimaRNG = cercaR.Cells(cercaR.Cells.Count)
Set cercaRNG = cercaR.Find(What:="pippo", After:=ultimaRNG, LookIn:=xlValues, lookat:=xlWhole)
 'Procedura di uscita se il valore non viene trovato
If Not cercaRNG Is Nothing Then
ultimaR = cercaRNG.Row
MsgBox ultimaR
Else
MsgBox "Valore non trovato!"
Exit Sub
End If
'se il valore viene trovato (è nella riga 12), si inserisce una riga e passa alla n° 13
ws.Cells(ultimaR + 1, 1).EntireRow.Insert
' se il valore rilevato, si inserisce una riga 3 righe di seguito (riga n ° 15)
ws.Cells(ultimaR + 3, 1).EntireRow.Insert
'se il valore viene trovato, verranno inserite 3 righe e il valore trovato alla riga 12 sarà spostato alla riga 15
ws.Cells(ultimaR, 1).Offset(3).EntireRow.Insert
‘oppure
ws.Cells(ultimaR, 1).EntireRow.Resize(3).Insert
    ws.Range(Cells(ultimaR, 1), Cells(ultimaR + 2, 1)).EntireRow.Insert
    ws.Rows(ultimaR & ":" & ultimaR + 2).EntireRow.Insert Shift:=xlDown

    ws.Cells(ultimaR + 1, 1).EntireRow.Resize(3).Insert
    ws.Range(ws.Cells(ultimaR + 1, 1), ws.Cells(ultimaR + 3, 1)).EntireRow.Insert

ws.Cells(ultimaR + 2, 1).EntireRow.Resize(3).Insert
End Sub
Esempio: Inserire una riga, n righe sopra l'ultima riga utilizzata.
Codice:
 Sub inserisciR2()
Dim ws As Worksheet, rigaC As Long

Set ws = Worksheets("Foglio1")
'determinare l'ultima riga utilizzata nella colonna A
rigaC = ws.Cells(Rows.Count, "A").End(xlUp).Row
MsgBox rigaC
'si stabilisce il n° di righe da aggiungere sopra l'ultima riga utilizzata
n = 5
'si verifica se ci sono abbastanza righe prima dell'ultima riga utilizzato, altrimenti si otterrà un errore
If rigaC >= n Then
'se l'ultima riga utilizzata è 5 righe prima dell'inserimento, quindi si inserisce come riga n ° 1 e l'ultima riga utilizzata diventerà la n ° 6 
    ws.Rows(rigaC).Offset(-n + 1, 0).EntireRow.Insert
Else
    MsgBox "Non ci sono abbastanza righe prima dell'ultima riga utilizzata!"
End If
End Sub
Esempio: Inserire una riga ogni volta che il valore cercato viene trovato in un intervallo.
Codice:
 Sub inserisciR2()
    Dim ws As Worksheet, indirizzo1 As String
    Dim trovaR As Range, cercaR As Range, ultimaC As Range
Set ws = Worksheets("Foglio1")
'impostare intervallo di ricerca
Set cercaR = ws.Range("A1:K100")
    MsgBox "Ricerca di 'pippo' nel Range: " & cercaR.Address
'iniziare la ricerca dopo l'ultima cella nel range di ricerca
Set ultimaC = cercaR.Cells(cercaR.Cells.Count)
'trovare il valore specificato, iniziando la ricerca dopo l'ultima cella nel range di ricerca
Set trovaR = cercaR.Find(What:="pippo", After:=ultimaC, LookIn:=xlValues, lookat:=xlWhole)
 
If trovaR Is Nothing Then
    MsgBox "Valore non trovato!"
    Exit Sub
Else
indirizzo1 = trovaR.Address
Do
    Set trovaR = cercaR.FindNext(After:=trovaR)
'Riga di inserimento quando viene trovato il valore, se il valore viene trovato due volte, verranno inserite 2 righe
    trovaR.Offset(1).EntireRow.Insert
Loop While trovaR.Address <> indirizzo1
End If
End Sub
Esempio: Inserisci righe (numero definito dall'utente) all'interno di valori consecutivi che si trovano in una colonna
Codice:
Sub inserisciR3()
Dim ws As Worksheet, rng As Range
Dim ultimaRU As Long, rigaI As Long, Rcella As Long, Ccella As Long

Set ws = Worksheets("Foglio1")
ws.Activate
'impostare il numero di colonna in cui due valori consecutivi sono controllati per inserire le righe
Ccella = 1
'impostare il numero di riga da dove iniziare la ricerca dei valori consecutivi
Rcella = 1
'determinare l'ultima riga utilizzata nella colonna  
ultimaRU = Cells(Rows.Count, Ccella).End(xlUp).Row
'inserire il numero di righe da inserire tra due valori consecutivi
rigaI = InputBox("Inserisci ilnumero di righe da inserire")
 
If rigaI < 1 Then
MsgBox "Errore - inserire un valore uguale o superiore a 1"
Exit Sub
End If

MsgBox "Questo codice inserirà " & rigaI & " righe, ovunque si trovano valori consecutivi nella colonna numero " & Ccella & ", iniziando la ricerca dalla riga numero " & Rcella
'Loop fino al numero di riga corrisponde l'ultima riga utilizzata 
Do While Rcella < ultimaRU
Set rng = Cells(Rcella, Ccella)
'Nel caso di due valori consecutivi
If rng <> "" And rng.Offset(1, 0) <> "" Then
'Inserire il numero di righe definito dall'utente
Range(rng.Offset(1, 0), rng.Offset(rigaI, 0)).EntireRow.Insert
Rcella = Rcella + rigaI + 1
'Determinare l'ultima riga utilizzata in modo dinamico e cambia l'inserimento delle righe
ultimaRU = Cells(Rows.Count, Ccella).End(xlUp).Row
'Metodo alternativo per determinare l'ultima riga utilizzata
Else
Rcella = Rcella + 1
End If
Loop
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 20-06-2014, 00.19.06   #39
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Classi, oggetti ed eventi personalizzati




In VBA è possibile creare oggetti personalizzati attraverso la definizione di classi e l'inserimento di moduli di classe. È inoltre possibile creare eventi di classe e procedure di evento personalizzati integrati in Excel. Con questa premessa risulta abbastanza chiaro che tramite VBA è possibile definire e creare delle classi di oggetti che possano soddisfare le esigenze del singolo utente. Per definizione la programmazione orientata agli oggetti prevede di raggruppare in un’unica entità, ovvero in una classe, sia la struttura dati che le procedure che operano su di essa, creando un oggetto unico dotato di proprietà e metodi che operano sull’oggetto stesso.

La classe è un modello per i nuovi oggetti che verranno creati e sono utilizzate per memorizzare, elaborare e rendere disponibili i dati, in quanto oltre ai dati contengono anche il codice per gestirli con procedure e metodi come le Sub e le Function. Una classe viene creata inserendo un modulo di classe nel progetto VBA e consente di creare i propri oggetti con proprietà e metodi molto simili ad altri oggetti come Range, foglio, grafico, etc. Il modulo di classe ha una serie di procedure che includono variabili e costanti che definiscono le sue proprietà che possono essere manipolate in un modulo di classe con le procedure Property Let, Property Get e Property Set. Per accedere alle proprietà e metodi dell'oggetto classe da una routine in un modulo di codice, si dichiara una variabile oggetto del tipo della classe.

Si può programmare in VBA, senza creare oggetti personalizzati che in realtà non aumentano la funzionalità del codice, tuttavia, l'utilizzo di oggetti personalizzati rende la codifica meno complessa e più semplice avendo un collegamento nel codice rendendo la codifica auto documentata denominando le classi in modo appropriato, e questo aiuta il debug e il codice riutilizzo.


Inserire un modulo di classe
In Visual Basic Editor (VBE), per inserire un modulo di classe si deve cliccare su Inserisci - Modulo di classe, in alternativa, nella finestra dei progetti, cliccare con il pulsante destro del mouse sul nome del progetto e sul menu che appare cliccare su Inserisci e quindi scegliere Modulo di classe. In alternativa, sulla barra degli strumenti standard in VBE, cliccare sul pulsante Inserisci e quindi scegliere Modulo di classe. Questo crea una classe vuota con il nome di Class1. Per rimuovere o eliminare un modulo di classe, si deve cliccare con il tasto destro del mouse dopo aver selezionato il modulo nella finestra dei progetti e quindi fare clic su Rimuovi


Le istanze di proprietà di un modulo di classe
C’è una grande differenza tra una variabile semplice e una variabile oggetto, la variabile oggetto non è che un puntatore all’interno della memoria e si dovrà creare esplicitamente un oggetto e salvare la sua posizione nella variabile oggetto. Questo processo si chiama creare una nuova istanza di un oggetto o istanziare un oggetto.
Poiché gli oggetti sono diversi dalle variabili, Visual Basic for Applications utilizza una speciale istruzione chiamata istruzione Set che ha due forme.

1) Set VariabileOggetto = New NomeClasse

In questa forma, l’istruzione Set crea un nuovo oggetto basato su NomeClasse, ciò significa che Visual Basic allocherà memoria per l’oggetto e salverà la posizione in memoria nella classe VariabileOggetto.

2) Set VariabileOggetto = EspressioneOggetto

Nella seconda forma, l’istruzione Set fa due cose: prima di tutto rilascia l’oggetto a cui puntava, quindi salva un puntatore a un oggetto già esistente in VariabileOggetto.

La proprietà Instancing di un modulo di classe è impostata su Private di default che non permette a un progetto esterno di lavorare con le istanze di quella classe, si deve impostare la proprietà Instancing per PublicNotCreatable per consentire a progetti esterni, con un riferimento al progetto contenente la classe definita, per accedere e utilizzare istanze della classe. Notare che l'impostazione di PublicNotCreatable ancora non consente al progetto esterno di istanziare (cioè creare o chiama all'esistenza) l'oggetto classe o un'istanza della classe, che può essere istanziato solo dal progetto che contiene la definizione della classe. Si noti che il progetto esterno può utilizzare un'istanza della classe definita se il progetto di riferimento ha già creato tale istanza.

Come già accennato, in VBA è possibile creare i propri oggetti personalizzati attraverso la definizione di classi. Una classe viene creata inserendo un modulo di classe e per accedere alle proprietà e metodi della classe dell'oggetto da una routine in un modulo di codice, è necessario creare una nuova istanza dell'oggetto di classe. Si noti che possono essere create pluralità di istanze a un oggetto di classe. Ci sono due modi per creare un’istanza, uno con un codice a due-line o in alternativa con un codice a riga singola.

Per creare un'istanza di una classe Two-line si deve utilizzare l'istruzione Dim per creare una variabile (studente) e definirlo come un riferimento alla classe (Studenti): Dim studente As Studenti, mentre per creare un nuovo riferimento oggetto utilizzando la parola chiave New, indicando il nome della classe (Studenti) che si desidera creare un'istanza, dopo la parola chiave New: Set studente = New Studenti

In alternativa si può usare un codice a linea singola per creare un'istanza di una classe, in questo caso l'oggetto Studenti viene istanziato solo quando il metodo di classe viene chiamato Dim studente As New Studenti


Creare Proprietà della classe
Un modo per creare una proprietà di classe è quello di dichiarare una variabile pubblica nel modulo di classe, e questa proprietà sarà in lettura-scrittura, l'altro modo è quello di utilizzare procedure di proprietà per creare una variabile privata per contenere i valori e utilizzare istruzioni di proprietà (cioè Property Let, Property Set e Property Get). La creazione di proprietà mediante una variabile pubblica, anche se semplice, non è generalmente preferibile perché non è flessibile, mentre invece utilizzando le dichiarazioni di proprietà sarà possibile impostare una proprietà di sola lettura o sola scrittura in aggiunta a lettura-scrittura, mentre l'uso di una variabile pubblica creerà solo le proprietà in lettura-scrittura. Inoltre, utilizzando le istruzioni della struttura è possibile eseguire il codice per calcolare i valori come proprietà che utilizza, mentre una variabile pubblica non consente l'uso di codice per impostare o restituire il valore di una proprietà.


Creare metodi in un modulo di classe
Oltre alle proprietà, gli oggetti possono anche avere uno o più metodi, un metodo è definito come Sub e Funzioni ed è creato con le procedure di sub-routine e funzioni. Un metodo è una sub-routine contenente un insieme di codici che eseguono un'azione o un'operazione sui dati all'interno della classe, o una funzione che contiene un insieme di codici che restituisce un valore dopo l'esecuzione di un'operazione. In un modulo di classe, solo se il metodo è dichiarato pubblico può essere chiamato da un'istanza di questa classe, altrimenti se un metodo viene dichiarato privato può essere chiamato solo da altri metodi all'interno della classe. Si noti, che di default la procedura è pubblica se non vengono specificate le parole chiave pubbliche o private.


Utilizzo di procedure di proprietà
Le procedura di proprietà sono un insieme di codici che creano e manipolano le proprietà personalizzandole per un modulo di classe. Una procedura Property è dichiarata da una dichiarazione Property Set, Property Let o Property Get e termina con un'istruzione End Property. Property Let viene utilizzata per assegnare un valore di sola scrittura a una proprietà e Property Get restituisce o recupera il valore di una proprietà di sola lettura, che può essere solo restituito, ma non impostato. Property Set assegna un valore di sola scrittura e viene utilizzata per impostare un riferimento a un oggetto. Le procedure di proprietà sono solitamente definite in coppia, Property Let e Property Get o Property Set e Property Get, si tenga presente che una procedura creata con Property Let consente all'utente di modificare o impostare il valore di una proprietà, mentre l'utente non può impostare o modificare il valore di una proprietà di sola lettura (cioè Property Get).

Una procedura di proprietà può fare tutto ciò che è consentito all'interno di una routine, come eseguire un'azione o un calcolo sui dati. Una procedura Property Let (o Property Set) è una procedura indipendente che può passare argomenti, eseguire azioni come da un insieme di codici e cambiare il valore dei suoi argomenti, come una routine Get o una funzione, ma non restituisce un valore come loro. Una procedura per ottenere la proprietà è anche una procedura indipendente che possa passare argomenti, eseguire azioni come da un insieme di codici e cambiare il valore dei suoi argomenti, come una procedura Property Let (o Property Set), e può essere usata in modo simile a una funzione che ritorni il valore di una proprietà.

Una procedura Property Get accetta un argomento in meno della dichiarazione Property Let o Property Set e deve essere dello stesso tipo di dati come il tipo di dati dell'ultimo argomento nella dichiarazione Property Let o Property Set associata. La dichiarazione Property Get utilizzerà lo stesso nome di proprietà come utilizzato nella dichiarazione Property Let o Property Set associata.

Una procedura Property Let può accettare più argomenti, e in questo caso l'ultimo argomento contiene il valore da assegnare alla proprietà, questo ultimo argomento nella lista degli argomenti è il valore della proprietà impostata dalla procedura chiamante. Il nome e il tipo di dati di ogni argomento in una procedura Property Let e il suo corrispondente nella routine Property Get dovrebbe essere la stessa, fatta eccezione per l'ultimo argomento nella procedura Property Let che è supplementare. Nel caso di una procedura Property Let con un singolo argomento (è richiesto almeno un argomento da definire), questo argomento contiene il valore da assegnare alla proprietà ed è il valore fissato dalla procedura chiamante, in questo caso la procedura Property Get non avrà alcun argomento.

Una procedura Property Set può accettare più argomenti, e in questo caso l'ultimo argomento contiene il riferimento all'oggetto effettivo per la proprietà. Nel caso di una procedura Property Set con un singolo argomento (è richiesto almeno un argomento da definire), questo argomento contiene il riferimento all'oggetto per la proprietà. Il tipo di dati dell'ultimo argomento o il singolo argomento deve essere un tipo di oggetto o un valore Variant.

La procedura Property Set è simile e una variazione della procedura Property Let ed entrambi vengono utilizzati per impostare i valori. Una procedura Property Set viene utilizzata per creare le proprietà degli oggetti che sono in realtà puntatori ad altri oggetti, mentre una procedura Property Let assegna i valori alle proprietà scalari come stringhe, interi, date, etc.

Di seguito è riportata la sintassi per le dichiarazioni delle tre Procedura di proprietà.


Property Get
Property Get PropertyName(argomento_1, argomento_2, …, argomento_n) As Type

Property Let
Property Let PropertyName(argomento_1, argomento_2, …, argomento_n+1)

Property Set
Property Set PropertyName(argomento_1, argomento_2, …, argomento_n+1)

Esempio: Creare una classe Properties utilizzando procedure di proprietà. Inserire il codice in un modulo di classe e denominarlo class_Stud
Codice:
Private nomeStud As String, votoStud As Double

Public Property Let Name(strN As String)
'si dichiara public in modo che possa essere chiamata da un'istanza in un altro modulo
    nomeStud = strN
End Property

Public Property Get Name() As String
'restituisce la proprietà Name
    Name = nomeStud
End Property

Public Property Let voto(ivoto As Double)
'assegna la proprietà voti
    votoStud = (ivoto / 80) * 100
End Property

Public Property Get voto() As Double
'restituisce la proprietà voti
    voto = votoStud
End Property

Public Function valuT() As String
'si dichiara public in modo che possa essere chiamata da un'istanza in un altro modulo.
    Dim valuta1 As String

    If votoStud >= 80 Then
        valuta1 = "A"
    ElseIf votoStud >= 60 Then
        valuta1 = "B"
    ElseIf votoStud >= 40 Then
        valuta1 = "C"
    Else
        valuta1 = "Bocciato"
    End If

valuT = valuta1
End Function
Inserire il codice sotto riportato in un modulo standard
Codice:
Sub studenti()
'si utilizza l'istruzione Dim per creare una variabile e definirla come un riferimento alla classe.
    Dim studente As class_Stud
'si crea un nuovo riferimento a un oggetto utilizzando la parola chiave New. Indicare il nome della classe a cui si desidera creare un'istanza, dopo la parola chiave New
Set studente = New class_Stud
    studente.Name = "Marco"
'si richiama la proprietà Name nell'oggetto studente
    MsgBox studente.Name
'si imposta la proprietà voto nell'oggetto studente al valore 45, e passa questi dati alla variabile ivoti nella proprietà voto
studente.voto = 45
MsgBox studente.voto
MsgBox studente.valuT
MsgBox studente.Name & " ha ottenuto il " & studente.voto & " % di voti con valutazione " & studente.valuT
End Sub
Fig. 1

Esempio: Creare una classe utilizzando la procedura Property Let passando più argomenti. Inserire il codice in un modulo di classe e denominarlo class_rettangolo

Note: Una procedura Property Let può accettare più argomenti, e in questo caso l'ultimo argomento contiene il valore da assegnare alla proprietà. Questo ultimo argomento nella lista degli argomenti è il valore della proprietà impostata dalla procedura chiamante. Il nome e il tipo di dati di ogni argomento in una procedura Property Let e il suo corrispondente la routine Property Get dovrebbe essere la stessa, fatta eccezione per l'ultimo argomento nella procedura Property Let che è opzionale.
Codice:
Private Are_a As Double
Public Property Let Area(Ba1 As Double, Alt1 As Double, ar As Double)
Are_a = ar
MsgBox "Argomenti ricevuti - Ba1: " & Ba1 & ", Alt1: " & Alt1 & ", ar: " & ar
End Property

Public Property Get Area(Ba1 As Double, Alt1 As Double) As Double
Area = Are_a
End Property
Inserire il codice sotto riportato in un modulo standard
Codice:
Sub rettangolo()
Dim Ba As Double, Alt As Double
Dim rett As New class_rettangolo

Ba = InputBox("Inserire Base del Rettangolo")
Alt = InputBox("Inserire Altezza del Rettangolo")
rett.Area(Ba, Alt) = Ba * Alt
a = rett.Area(Ba, Alt)
MsgBox "L'area del Rettangolo con Base " & Ba & ", e Altezza " & Alt & ", è " & a
End Sub
Esempio: Creazione di sola lettura Classe proprietà con solo il blocco PropertyGet_EndProperty. Inserire il codice in un modulo di classe e denominarlo classRettangolo
Codice:
Private rett_B As Double, rett_H As Double
Public Property Let Base(k As Double)
    rett_B = k
End Property

Public Property Get Base() As Double
    Base = rett_B
End Property

Public Property Let Altez(k1 As Double)
    rett_H = k1
End Property

Public Property Get Altez() As Double
    Altez = rett_H
End Property

Public Property Get area_r() As Double
    area_r = Base * Altez
End Property
Inserire il codice sotto riportato in un modulo standard
Codice:
 Sub rettangolo1()
Dim a As Double, b As Double
Dim areaRett As New classRettangolo
a = InputBox("Inserire Base rettangolo")
b = InputBox("Inserire Altezza rettangolo")

areaRett.Base = a
areaRett.Altez = b
MsgBox areaRett.area_r
End Sub
Esempio: Utilizzare Property Set per impostare un riferimento a un oggetto. Inserire il codice in un modulo di classe e denominarlo classeAuto
Codice:
Private tipoVet As classeTipoAut
Public Property Set tipo(objtipo As classeTipoAut)
    Set tipoVet = objtipo
End Property

Public Property Get tipo() As classeTipoAut
    Set tipo = tipoVet
End Property
Inserire il codice sotto riportato in un modulo di classe e denominarlo classeTipoAut
Codice:
Private tipoCol As String, tipoNom As String, KL As Double
Property Let colore(col As String)
    tipoCol = col
End Property

Property Get colore() As String
    colore = tipoCol
End Property

Property Let nome(nom As String)
    tipoNom = nom
End Property

Property Get nome() As String
    nome = tipoNom
End Property

Property Let percorso(kmLit As Double)
    KL = kmLit
End Property

Property Get percorso() As Double
    percorso = KL
End Property

Function costoBenz(cost_benz As Double, distanza As Double) As Double
    costoBenz = (distanza / percorso) * cost_benz
End Function
Inserire il codice sotto riportato in un modulo standard
Codice:
Sub propSetCars()
Dim dist As Double, cost As Double

Dim auto As classeAuto
Set auto = New classeAuto

Set auto.tipo = New classeTipoAut

auto.tipo.colore = "Nero"
auto.tipo.nome = "Toyota Yaris"
auto.tipo.percorso = 50
dist = InputBox("Inserisci i chilometri percorsi in un mese dalla vettura")
cost = InputBox("Inserisci il costo del carburante al litro")

MsgBox "Il colore della vettura è : " & auto.tipo.colore
MsgBox "Il modello della vettura è : " & auto.tipo.nome

MsgBox "La tua auto percorre " & auto.tipo.percorso & " Km. con 1 litro di carburante"
MsgBox auto.tipo.costoBenz(dist, cost) & " Eur." & " è il costo mensile del carburante"
End Sub
Esempio: Utilizzo dell’istruzione Property Set per impostare un riferimento a un oggetto Range. Inserire il codice nel modulo di classe denominato classeRange:
Codice:
 Private coloreSF As Integer, SNome As String, vRng As Range
Public Property Set Range_At(oRng As Range)
    Set vRng = oRng
End Property

Public Property Get Range_At() As Range
    Set Range_At = vRng
End Property

Property Let Nome(nom As String)
    SNome = nom
End Property

Property Get Nome() As String
    Nome = SNome
End Property

Property Let colore(col As Integer)
    coloreSF = col
End Property

Property Get colore() As Integer
    colore = coloreSF
End Property

Sub Mcolore()
    Range_At.Interior.ColorIndex = colore
End Sub
Inserire il codice sotto riportato in un modulo standard
Codice:
 Sub classe_Range()
Dim RangeATT As classeRange
Set RangeATT = New classeRange
Set RangeATT.Range_At = ActiveCell

RangeATT.colore = 5

If RangeATT.colore < 1 Or RangeATT.colore > 56 Then
MsgBox "Errore! Inserisci un valore per il colore compreso tra 1 e 56"
Exit Sub
End If

RangeATT.Mcolore
MsgBox "colore di sfondo: ColorIndex " & RangeATT.colore & "  Inserito nella cella " & RangeATT.Range_At.Address
End Sub
Eventi di Classe Personalizzati
Un codice VBA viene attivato quando si verifica un evento come, cliccare su un pulsante, aprire la cartella di lavoro, selezionare una cella o cambiare una selezione di celle in un foglio di lavoro, e così via. Excel ha anche le sue procedure di eventi che vengono attivati da un evento predefinito e vengono installati all'interno di Excel con un nome standard e predeterminato, come la procedura di modifica del foglio di lavoro che viene installato con il foglio di lavoro come "Private Sub Worksheet_Change (ByVal Target As Range)". Quando il contenuto di una cella del foglio di lavoro cambia, VBA chiama la routine evento Worksheet_Change ed esegue il codice che contiene. Ora vediamo come è possibile creare i propri eventi personalizzati in una classe.


Definire un evento personalizzato
Il primo passo è quello di dichiarare l'evento nella sezione di dichiarazione della classe usando la parola chiave Event per definire un evento personalizzato in un modulo di classe. Questa dichiarazione può avere qualsiasi numero di argomenti, e deve essere dichiarata come Public per renderlo visibile all'esterno del modulo oggetto. Si noti che è possibile dichiarare e generare eventi solo nei moduli oggetto ThisWorkbook, fogli di lavoro e fogli grafici, moduli Form e moduli di classe, e non da un modulo di codice standard.


Generare un evento
Dopo aver dichiarato un evento, si deve utilizzare una dichiarazione RaiseEvent per attivare l'evento dichiarato e la procedura di evento viene eseguita quando viene generato o attivato l’evento. Si ricorda che l'evento è dichiarato in un procedimento pubblico all'interno del modulo di classe utilizzando la parola chiave Evente con la dichiarazione RaiseEvent vengono passati i valori agli argomenti alla routine evento che viene eseguita


Codice esterno per generare l'evento
Abbiamo bisogno di un codice esterno per chiamare la procedura pubblica nel modulo di classe, che genera l'evento e tramite questo codice si determina quando l'evento verrà generato mediante il quale la procedura di evento viene eseguita.


Creare una routine evento
Si usa la parola chiave WithEvents per dichiarare una variabile oggetto della classe personalizzata in cui è definito l'evento personalizzato, dichiarando questa variabile oggetto, l'istanza della classe personalizzata punta alle variabili che risponderanno all'evento aggiungendo l'oggetto alla lista degli eventi nella finestra del codice. Solo le variabili dichiarate a livello di modulo possono essere utilizzato con la parola chiave WithEvents. Inoltre, le variabili possono essere dichiarate utilizzando le parole chiave WithEvents solo in moduli di oggetti e non in un modulo di codice standard. Dopo la dichiarazione della variabile oggetto, la procedura di evento può essere creata in modo simile alle procedure standard di VBA - la variabile oggetto verrà visualizzato nell'elenco a discesa Oggetti e tutti i suoi eventi sono elencati nell'elenco a discesa della procedura.

Esempio: Creare un evento personalizzato utilizzando una procedura Worksheet_Change per attivare l'evento personalizzato. Inserire il codice sotto riportato nel modulo di classe denominato classe_Range:
Codice:
Private RngV As Range, coloreS As Integer, nomeS As String
Public Event selezionaC(cell As Range)

Public Property Set RangeS(objRng As Range)
    Set RngV = objRng
RaiseEvent selezionaC(RngV)
End Property

Public Property Get RangeS() As Range
Set RangeS = RngV
End Property

Property Let nome(nom As String)
nomeS = nom
End Property

Property Get nome() As String
nome = nomeS
End Property

Property Let colore(col As Integer)
coloreS = col
End Property

Property Get colore() As Integer
colore = coloreS
End Property

Sub AssColore()
RangeS.Interior.ColorIndex = colore
End Sub
Inserire il codice sotto riportato nel modulo del Foglio 1
Codice:
 Private WithEvents rang As classe_Range
Private Sub rang_selezionaC(cell As Range)
    rang.colore = 4

If rang.colore < 1 Or rang.colore > 56 Then
MsgBox "Errore! Inserire un valore valido per ColorIndex compreso tra 1 e 56"
Exit Sub
End If

rang.nome = "Prima Cella"

rang.AssColore
Dim i As Integer
i = rang.colore

rang.RangeS.Select
Selection.Offset(0, 1).Value = "Nome : " & rang.nome
Selection.Offset(0, 2).Value = "Indirizzo : " & Selection.Address
Selection.Offset(0, 3).Value = "Colore di sfondo : " & i
Selection.Offset(0, 4).Value = "Contenuto : " & Selection.Value

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ErrorHandler
Set rang = New classe_Range

If Target.Address = Range("A1").Address Then
Set rang.RangeS = Target
Else
Exit Sub
End If

ErrorHandler:
  Application.EnableEvents = True
End Sub
Esempio: Creare un evento personalizzato: All’inizializzazione della Form si attiva l'evento personalizzato.
Inserire il codice nel modulo di classe denominato classeTextBox
Codice:
 Private tb As MSForms.TextBox, strSeq As String
Public Event eTxtBx(objTxtBx As MSForms.TextBox)

Public Property Set Stesto(objTxtBx As MSForms.TextBox)
    Set tb = objTxtBx
RaiseEvent eTxtBx(tb)
End Property

Public Property Get Stesto() As MSForms.TextBox
    Set Stesto = tb
End Property

Property Let sequenza(tbSeq As String)
    strSeq = tbSeq
End Property

Property Get sequenza() As String
    sequenza = strSeq
End Property
Inserire una Form con 2 textBox (TextBox1 e TextBox2) e un CommandButton (CommandButton1) all'interno del modulo, inserire il seguente codice

Fig. 2
Codice:
 Private WithEvents tx As classeTextBox, sq1 As String, sq2 As String
Private Sub CommandButton1_Click()
Dim objControl As Control
For Each objControl In Me.Controls

If TypeName(objControl) = "TextBox" Then
    If Not objControl.Name = "TextBox1" Then
    objControl.Value = "Valore Copiato : " & tx.Stesto.Value
    objControl.BackColor = vbRed
    End If
End If
Next

MsgBox "Testo Copiato dal " & sq1 & " Al " & sq2
   
End Sub

Private Sub TextBox1_Change()
    If tx.Stesto.Value = "" Then
        tx.Stesto.BackColor = vbYellow
    Else
        tx.Stesto.BackColor = vbGreen
    End If
End Sub

Private Sub tx_eTxtBx(objTxtBx As MSForms.TextBox)
tx.Stesto.BackColor = vbYellow

With Me.TextBox1
tx.sequenza = "Primo TextBox"
sq1 = tx.sequenza
End With
    
With Me.TextBox2
tx.sequenza = "Secondo TextBox"
sq2 = tx.sequenza
End With

End Sub

Private Sub UserForm_Initialize()
Set tx = New classeTextBox
Set tx.Stesto = Me.TextBox1
End Sub
Esempio: Creare un evento personalizzato: - utilizzare la parola chiave WithEvents, all'interno del modulo di classe, per dichiarare una variabile oggetto. Inserire il codice nel modulo di classe denominato classeCombo
Codice:
 Public WithEvents ComboB As MSForms.ComboBox

Public Sub SCombo(objCbx As MSForms.ComboBox)
    Set ComboB = objCbx
End Sub

Public Sub ComboB_AddItem(strItem As String, Cancel As Boolean)
    If Cancel = False Then
        ComboB.AddItem strItem
    End If
If strItem <> "" Then
    ComboB.BackColor = vbGreen
End If
End Sub

Private Sub ComboB_Change()
    If ComboB.Value = "" Then
        ComboB.BackColor = vbWhite
    End If
End Sub
Inserire una Form, con un ComboBox (ComboBox1) e un CommandButton (CommandButton1) all'interno del modulo. Inserire codice sotto riportato nel modulo della Form

Fig. 3
Codice:
 Private cB As New classeCombo
Private Sub CommandButton1_Click()
Dim Stesto As String
    Stesto = cB.ComboB.Text
    Dim Cancel As Boolean

mess = MsgBox("Confermi di voler aggiungere la voce digitata al ComboBox?", vbYesNo)
If mess = vbNo Then
    Cancel = True
End If

Call cB.ComboB_AddItem(Stesto, Cancel)
End Sub

Private Sub UserForm_Initialize()
    cB.SCombo Me.ComboBox1
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 21-06-2014, 18.51.55   #40
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Impostazioni delle proprietà dei controlli



Mentre viene sviluppata un'applicazione in VBE (ambiente Visual Basic) viene definita come fase di progettazione (Design Time) il momento in cui si creano Form, si aggiungono controlli e si impostano le proprietà dei vari oggetti, mentre invece si definisce fase di esecuzione (Run-Time) il momento in cui il codice viene eseguito e l’applicazione è in esecuzione.

Durante il periodo di Run-Time lo sviluppatore interagisce con l'applicazione, proprio come un utente e il codice non può essere manipolato, mentre eventuali manipolazioni nella fase di progettazione non sono permanenti. Per esempio se si aggiunge un controllo CheckBox nel codice utilizzando il metodo Add Method [Set ctrl = Controls.Add("Forms.CheckBox.1")] il controllo apparirà una volta che si manda in esecuzione la UserForm, ma quando si termina l’esecuzione e si torna al VBE, l'oggetto CheckBox non è presente, allo stesso modo, se si imposta la Caption di un controllo OptionButton nel codice, viene visualizzato quando viene eseguita la UserForm, ma tornerà al suo aspetto originale quando si termina l’esecuzione. In sostanza la struttura ControlTipText si trova in fase di progettazione, ma è visibile sul controllo unicamente durante la fase di Run-Time.


Impostazione delle proprietà dei controlli
Se il codice è in una procedura nel modulo di codice della Form, si può utilizzare la sintassi: Controlname.Property = Setting/Value, ma se il codice è in un modulo standard o nel modulo di codice di un Form diverso, la sintassi diventa: UserFormName.Controlname.Property = Setting/Value. Alcuni Esempi di sintassi

Label1.Font.Name = "Arial"
Label1.ForeColor = RGB (255, 255, 0)
OptionButton1.BackColor = 255
CheckBox1.Value = false
CheckBox1.Alignment = fmAlignmentLeft
TextBox1.MultiLine = True
TextBox1.WordWrap = True
TextBox1.ScrollBars = 2
OptionButton1.AutoSize = True
Me.TextBox1.Enabled = False
TextBox1.TextAlign = fmTextAlignLeft
TextBox1.Text = "Ciao"
CommandButton1.Left = 50
TextBox1.MaxLength = 5


Proprietà Name
Si può utilizzare la proprietà Name per specificare un nome per un controllo o per specificare il nome del font del carattere utilizzato nella parte di testo di un controllo. La proprietà Name in una Form può essere impostata solo in fase di progettazione e non può essere impostata in fase di esecuzione, inoltre per i controlli può essere impostata sia in fase di progettazione o in fase di esecuzione, ma se si aggiunge un controllo in fase di progettazione, il suo nome non può essere modificato in fase di esecuzione. In genere, il nome predefinito del primo CheckBox creato è CheckBox1, il nome predefinito del secondo CheckBox sarà CheckBox2, e così via, anche per gli altri controlli.

E’ possibile modificare il nome di un controllo cliccando su "Name" nella finestra delle Proprietà, ricordando che il nome deve iniziare con una lettera, può avere qualsiasi combinazione di lettere, numeri o underscore, non può avere spazi o simboli e può avere una lunghezza massima di 40 caratteri. Potrebbe essere una buona idea utilizzare un prefisso di 3 lettere in minuscolo, per individuare il rispettivo controllo, e i caratteri che seguono il prefisso possono essere caratteristici per una più facile leggibilità. I prefissi comunemente utilizzati per diversi controlli sono: frm per UserForm; LBL per etichette; txt per TextBox; CMB per ComboBox; lst per ListBox; chk per CheckBox; opt per OptionButton; Fra per Frame; cmd per CommandButton; TBS per TabStrip; RFE per RefEdit; e così via.


La Proprietà Caption
Caption è il testo che descrive e identifica una Form o un controllo e verrà visualizzato nell'intestazione della Form, o di qualsiasi altro controllo, e può essere impostata nella finestra Proprietà o con il codice usando questa Sintassi: object.Caption = String


Le Proprietà Height e Width
L’altezza e la larghezza viene misurata in punti e queste proprietà sono applicabili sia a un oggetto Form che a tutti i controlli disponibili. È possibile inserire manualmente l'altezza e la larghezza nella finestra Proprietà, e per queste proprietà, VBA accetta solo valori che sono maggiori o uguali a zero, e possono essere impostate nella finestra Proprietà o con il codice VBA con la sintassi: object.Height = Number Object.Width = Number. È inoltre possibile ridimensionare un controllo manualmente con il mouse, quando viene selezionato il puntatore del mouse cambierà aspetto presentandosi come una freccia a due punte e il controllo mostrerà le maniglie di regolazione che sono situate negli angoli e a metà del controllo stesso e posizionando il cursore su una qualsiasi di queste maniglie e cliccando su di essa si possono modificare le dimensioni del controllo trascinando il cursore per portarlo alla dimensione desiderata, che una volta raggiunta si rilascia il pulsante del mouse


Le Proprietà Left e Top
La proprietà Left imposta la distanza tra il bordo sinistro del controllo e il bordo sinistro della Form che lo contiene, mentre invece la proprietà Top imposta la distanza tra il bordo superiore del controllo e il bordo superiore della Form e per entrambi i controlli la distanza è impostata in pixel, inoltre è possibile inserire manualmente le proprietà Left e Top nella finestra Proprietà tenendo presente che queste proprietà sono applicabili a tutti i controlli. Se il valore di Left o Top è impostato a zero, il controllo apparirà sul bordo sinistro o il bordo superiore della Form che lo contiene, e specificando un valore minore di zero in una di queste proprietà verrà tagliata una porzione del controllo riducendone la visibilità nel modulo. Queste proprietà possono essere impostate con il codice VBA con questa Sintassi: object.Left = Number object.Top = Number .


La Proprietà Value
Questa proprietà determina lo stato di selezione di un controllo o specifica il contenuto dello stesso ed è applicabile a tutti i controlli tranne Label, Frame e Image. Per quanto riguarda i controlli CheckBox, OptionButton e ToggleButton, impostando un valore di -1 (equivale a True), indica che il controllo è selezionato, un valore 0 (equivale a False), indica che il controllo è deselezionato e un valore Null indica che il controllo non è né selezionato né cancellato, e in questo caso apparirà ombreggiato. Per i controlli ScrollBar e SpinButton, la proprietà Value indica il loro valore attuale, che è un numero intero compreso tra il valore minimo e massimo specificati nelle proprietà Max e Min. Per i controlli ComboBox e ListBox (Value non può essere utilizzato con un ListBox a selezione multipla), rappresenta il valore della cella attualmente selezionata, mentre per un controllo CommandButton, equivale a un valore booleano (True o False) che indica se è stato scelto il comando e l’impostazione predefinita è False e se è impostato a True (può essere fatto solo con il codice VBA) richiamerà l'evento Click del pulsante. Per un controllo Multipage, la proprietà Value è impostata solo con il codice VBA ed è rappresentata da un numero Intero che indica se la pagina corrente è attiva, ricordando che le pagine sono numerate a partire da zero (0). Per un controllo TextBox, si riferisce al testo nella casella di testo e la proprietà Value può essere impostata nella finestra Proprietà (fatta eccezione per controlli CommandButton e Multipage) o con il codice VBA. Sintassi: Object.Value = Variant


La Proprietà Accelerator
Questa proprietà è applicabile ai controlli Label, CheckBox, OptionButton, ToggleButton, CommandButton e Multipage, imposta la chiave per accedere a un controllo, ed è indicato come la chiave di accesso (o tasto di scelta rapido) che è costituita da un singolo carattere, che premuto in combinazione con e dopo il tasto Alt è usato come scorciatoia e se usato per un controllo avvia l'evento Click. Per fare clic su un pulsante di comando in una Form, il tasto di scelta rapida può essere impostato come lettera "E" e premendo Alt + E si avvia l’evento click. Nel caso in cui Accelerator è impostato per una Label, il controllo successivo che segue la Label nell'ordine di tabulazione riceve il Focus (ma non l'esecuzione dell’evento Click). Inoltre si tenga presente che Il carattere utilizzato come valore Accelerator è key-sensitive, il che significa che l'impostazione della chiave avviene come lettera P equivale anche alla lettera p perché vengono inserite premendo lo stesso tasto.


La Proprietà Alignment
Questa proprietà è applicabile ai controlli CheckBox, OptionButton e ToggleButton e specifica come una Caption apparirà rispetto al controllo. Ci sono due impostazioni:
  • fmAlignmentLeft (valore 0) – La Caption appare a sinistra del controllo
  • fmAlignmentRight (valore 1) - Questa è l'impostazione di default in cui la Caption viene visualizzata a destra del controllo.
Si tenga presente che il controllo ToggleButton ha Alignment come una delle sue proprietà, ma è disabilitato e non può essere specificato per questo controllo e Il testo della Caption è sempre allineato a sinistra.


La Proprietà AutoSize
Questa proprietà è applicabile ai controlli Label, TextBox, ComboBox, CheckBox, OptionButton, ToggleButton, CommandButton, Image e RafEdit ed è rappresentata da un valore booleano (True o False) che specifica se il contenuto da visualizzare del controllo viene ridimensionato automaticamente oppure no. Se AutoSize viene posta a TRUE, si ridimensiona automaticamente il controllo, mentre impostandola a FALSE (opzione predefinita) mantiene la dimensione del controllo e se il contenuto supera l'area del controllo viene tagliato. Per i controlli TextBox e ComboBox, AutoSize si applica al testo visualizzato, mentre per il controllo Image, AutoSize vale per l'immagine visualizzata, mentre per altri controlli si applica alla Caption, mentre le impostazioni per il controllo TextBox sono:
  • Se il TextBox è a linea singola, AutoSize ridimensiona la larghezza del TextBox alla lunghezza del testo
  • Se il TextBox è MultiLinea, senza testo, AutoSize ridimensiona la larghezza per visualizzare una singola lettera e ridimensiona l'altezza per visualizzare l'intero testo
  • Se la TextBox è MultiLine con il testo, AutoSize non cambia la larghezza del TextBox e ridimensiona l'altezza per visualizzare l'intero testo.

La Proprietà BackColor
Questa Proprietà si applica a tutti i controlli e Form ed imposta il colore di sfondo. Per il controllo Multipage la proprietà può essere impostata solo con il codice VBA


La Proprietà BackStyle
BackStyle è applicabile ai controlli Label, TextBox, ComboBox, CheckBox, OptionButton, ToggleButton, CommandButton, Image e RafEdit e determina se lo sfondo dei controlli sarà opaco o trasparente. Ha due impostazioni:
  • fmBackStyleTransparent (valore 0) per sfondo trasparente, in cui tutto lo sfondo del controllo è visibile
  • fmBackStyleOpaque (valore 1) per lo fondo opaco, in cui nulla è visibile sullo sfondo del controllo e questo è anche il default.
Se la proprietà BackStyle (per i controlli) è impostato su fmBackStyleOpaque la proprietà BackColor non avrà nessun effetto.


La Proprietà BorderColor
Questa proprietà è applicabile alle Form e ai controlli Label, TextBox, ComboBox, ListBox, Frame, Image e RafEdit e imposta il colore del bordo. Se nella proprietà BorderStyle si imposta il valore fmBorderStyleNone, questa proprietà non avrà alcun effetto, in quanto la proprietà BorderStyle definisce i colori del bordo utilizzando la proprietà BorderColor , mentre la struttura SpecialEffect utilizza esclusivamente colori di sistema (che fanno parte del Pannello di controllo di Windows) per definire i colori del bordo.


La Proprietà BorderStyle
Questa proprietà è applicabile alle Form e controlli Label, TextBox, ComboBox, ListBox, Frame, Image e RafEdit e specifica il tipo di bordo per un oggetto (controllo o Form). Ha due impostazioni:
  • fmBorderStyleNone (valore 0) per nessun bordo
  • fmBorderStyleSingle (valore 1) per un bordo a linea singola.
Da ricordare che Form, Label, TextBox, ComboBox, ListBox e Frame hanno il valore di default pari a 0, mentre il valore predefinito per un'immagine è 1. BorderStyle definisce i colori dei bordi con la proprietà BorderColor e non è possibile utilizzare contemporaneamente BorderStyle e SpecialEffect per specificare il bordo di un controllo, inoltre se la proprietà SpecialEffect per un Frame è impostata a zero, la proprietà BorderStyle viene ignorata.


La Proprietà ControlSource
Questa proprietà è applicabile ai controlli TextBox, ComboBox, ListBox, CheckBox, OptionButton, ToggleButton, ScrollBar e SpinButton e corrisponde a una cella o un campo (intervallo di celle) che viene utilizzato per impostare o conservare la proprietà Value di un controllo. Cambiando il valore del controllo si aggiorna automaticamente la cella collegata e un cambiamento nella cella collegata aggiornerà il valore del controllo. Se nella cella A1 viene inserita la proprietà ControlSource di un CheckBox, e se la cella A1 in ActiveSheet contiene TRUE, il CheckBox apparirà selezionato all'attivazione del modulo e se si deseleziona l'opzione, la cella A1 cambierà il suo contenuto in FALSE. In una ListBox in cui il ControlSource menziona Foglio1! D2, il valore nella BoundColumn della riga selezionata vengono memorizzati nella cella D2 del Foglio1, mentre invece in una TextBox in cui il ControlSource menziona Foglio3! F2, il testo o il valore nella TextBox vengono memorizzati nella cella F2 del Foglio3 e se la cella F2 non contiene nessun testo, questo apparirà nella TextBox all'attivazione della Form. Il valore predefinito è una stringa vuota che indica che la proprietà ControlSource non è stata impostata.


La Proprietà ControlTipText
E’ applicabile a tutti i controlli e specifica il testo visualizzato quando l'utente posiziona il mouse su un controllo. E utile nel dare consigli o chiarimenti per l'utente sull'utilizzo del controllo. Il valore predefinito è una stringa vuota che indica che non verrà visualizzato alcun testo.


La Proprietà Enabled
Questa Proprietà si applica a tutti i controlli e Form e rappresenta un valore booleano (True o False) che specifica se il controllo è attivo e può rispondere a eventi generati dall'utente, (cioè l'utente può interagire con il controllo tramite mouse, i tasti o tasti di scelta rapida). Il valore predefinito è True, che indica che il controllo è attivo, mentre un valore False indica che l'utente non può interagire con il controllo. Il controllo è generalmente accessibile tramite un codice anche nel caso il valore sia impostato su False. Se Enabled è impostato su False, il controllo è inattivo (tranne che per le immagini), mentre se Enabled è impostata su false per un Form o un Frame, tutti i controlli che contengono sono disabilitato. La proprietà Enabled di una TextBox è particolarmente utile quando non si desidera consentire all'utente di digitare direttamente nella casella di testo, ma deve essere riempito solo tramite la selezione effettuata dall'utente in altro controllo, ad esempio da un ListBox.


La Proprietà Locked
Questa proprietà è applicabile ai controlli TextBox, ComboBox, ListBox, CheckBox, OptionButton, ToggleButton, CommandButton e RafEdit e rappresenta un valore booleano (True o False) che specificare se il controllo è modificabile o meno. Il valore TRUE indica che non è modificabile, mentre il valore predefinito è False in cui il controllo può essere modificato.

Alcuni esempi di utilizzo delle proprietà Enabled e Locked in combinazione:
  • Se Enabled è True e Locked è False: il controllo risponde agli eventi generati dall'utente e appare normalmente, i dati possono essere copiati e modificati nel controllo.
  • Se Enabled è True e Locked è True, il controllo risponde agli eventi generati dall'utente e appare normalmente, i dati possono essere copiati, ma non modificati nel controllo.
  • Se Enabled è False (indipendentemente dal valore di Locked), il controllo non può rispondere a eventi generati dall'utente e viene visualizzato in grigio, i dati non possono essere né copiati né modificati nel controllo.

L'Oggetto Font
Questa proprietà si applica a Form e a tutti i controlli tranne ScrollBar, SpinButton e Image e determina il tipo di carattere utilizzato in un controllo o Form. È possibile specificare il nome del font, impostare lo stile del carattere (normale, corsivo, grassetto, etc.), o sottolineare il testo barrato, e regolare la dimensione del carattere. Per i controlli TextBox, ComboBox e ListBox, il tipo di carattere del testo visualizzato è impostato, mentre per altri controlli è impostato il carattere della Caption. L'impostazione Font di una Form imposta automaticamente il carattere di tutti i controlli, se posta all’inizializzazione della Form, ma non modifica il tipo di carattere di questi controlli se fossero già presenti per i quali sarà necessario reimpostare il carattere di ogni singolo controllo separatamente. La proprietà Font per un controllo Multipage può essere utilizzata solo con il codice VBA.


La Proprietà ForeColor
Questa proprietà si applica a Form e a tutti i controlli tranne Image e specifica il colore di primo piano, cioè il colore del testo visualizzato. Per quanto riguarda i controlli Font, ForeColor determina il colore del testo, mentre in un Frame, ForeColor determina il colore della Caption e in una ScrollBar o SpinButton, ForeColor determina il colore delle frecce. Da notare che l'impostazione ForeColor di una Form imposta automaticamente la proprietà ForeColor dei controlli Label, CheckBox, OptionButton, Frame, Multipage e TabStrip se inseriti nell’inizializzazione della Form stessa, ma non cambierà la proprietà ForeColor di questi controlli se fossero già presenti, per i quali sarà necessario reimpostarla per ogni singolo controllo separatamente. La proprietà ForeColor per un controllo Multipage può essere utilizzata solo con il codice VBA.


La Proprietà MouseIcon
Questa proprietà è applicabile a Form e a tutti i controlli, ad eccezione di Multipage e assegna un'immagine a un controllo che viene visualizzato quando l'utente sposta il mouse su tale controllo. Image viene assegnato specificando il percorso e il nome del file dove è collocata l’immagine e per utilizzare la struttura MouseIcon è necessario che la proprietà MousePointer sia impostata su fmMousePointerCustom (valore 99).


La Proprietà MousePointer
Questa proprietà è applicabile a Form e a tutti i controlli, ad eccezione di Multipage e specifica che tipo di puntatore del mouse sarà visibile quando l'utente sposta il mouse sopra un controllo. Ci sono 15 impostazioni:
  • fmMousePointerDefault (valore 0) - puntatore standard, è il valore di default
  • fmMousePointerArrow (valore 1) - freccia
  • fmMousePointerCross (valore 2) - puntatore a croce
  • fmMousePointerIBeam (valore 3) - I-Beam
  • fmMousePointerSizeNESW (valore 6) - freccia a due punte punta nord-est e sud-ovest
  • fmMousePointerSizeNS (valore 7) - freccia a due punte punta nord e sud
  • fmMousePointerSizeNWSE (valore 8) - freccia a due punte punta nord-ovest e sud-est
  • fmMousePointerSizeWE (valore 9) - doppia freccia che punta a ovest e ad est
  • fmMousePointerUpArrow (valore 10) - freccia
  • fmMousePointerHourglass (valore 11) - clessidra
  • fmMousePointerNoDrop (valore 12) - cerchio con una linea diagonale, che appare come un simbolo "Not", che indica un controllo non valido
  • fmMousePointerAppStarting (valore 13) - freccia e clessidra
  • fmMousePointerHelp (valore 14) - freccia e il punto interrogativo
  • fmMousePointerSizeAll (valore 15) - freccia a quattro punte, rivolto verso nord, sud, est e ovest
  • fmMousePointerCustom (valore 99) - l'immagine specificata dalla struttura MouseIcon

La Proprietà Picture
Questa proprietà è applicabile a Form e controlli Label, CheckBox, OptionButton, ToggleButton, Frame, CommandButton, Multipage e Image e specifica l'immagine da visualizzare in un controllo, specificando il percorso e il nome del file, per rimuovere l'immagine si deve premere CANC sul valore della proprietà. Per i controlli con Caption, è possibile specificare la posizione dell'immagine utilizzando la proprietà PicturePosition mentre per altri controlli e Form, si deve utilizzare la proprietà PictureAlignment per specificare la posizione dell'immagine e utilizzare la proprietà PictureSizeMode per specificare la modalità (dimensioni, scala, etc.) per visualizzare l'immagine.


La Proprietà PicturePosition
Questa proprietà è applicabile ai controlli Label, CheckBox, OptionButton, ToggleButton e CommandButton e specifica dove deve comparire l'immagine nel controllo. Ci sono 3 impostazioni in un formato in cui la stringa fmPicturePosition è seguita dalla posizione dell'immagine rispetto alla sua voce e al successivo allineamento della Caption relativa all'immagine, cioè.
  • fmPicturePositionLeftTop - l'immagine viene visualizzata a sinistra del titolo e la Caption è allineata con la parte superiore del quadro
  • fmPicturePositionCenter - Sia l'immagine che la Caption sono concentrati nel controllo e la Caption è sulla parte superiore del quadro.
  • fmPicturePositionAboveCenter (valore 7) – E’ il valore predefinito e l'immagine appare sopra la Caption e la stessa è centrata sotto l'immagine.

La Proprietà SpecialEffect
Questa proprietà è applicabile a Form e controlli Label, TextBox, ComboBox, ListBox, CheckBox, OptionButton, ToggleButton, Frame, Image e RafEdit e determina come appare visivamente il controllo. Per un CheckBox, OptionButton, o ToggleButton, le due impostazioni sono:
  • fmButtonEffectFlat (valore 0)
  • fmButtonEffectSunken (valore 2) - di default per CheckBox e OptionButton.
Per altri controlli sono applicabili cinque impostazioni che sono:
  • fmSpecialEffectFlat (valore 0) - default per Form e i controlli Image e Label
  • fmSpecialEffectRaised (valore 1)
  • fmSpecialEffectSunken (valore 2) - di default per i controlli TextBox, ComboBox e ListBox
  • fmSpecialEffectEtched (valore 3) - di default per Frame
  • fmSpecialEffectBump (valore 6).
L'aspetto visivo di ogni impostazione è auto-esplicativo e può essere piatto, in rilievo, incassato, inciso e Bump.
Anche se ToggleButton ha SpecialEffect come una delle sue proprietà, è disabilitato e non può essere specificato, inoltre non è possibile utilizzare contemporaneamente sia la proprietà BorderStyle e SpecialEffect per specificare il bordo per un controllo in quanto per uno dei due con valore diverso da zero imposterà automaticamente l'altra proprietà a zero. Se la proprietà SpecialEffect per un Frame è impostato a zero, la proprietà BorderStyle viene ignorata.


La Proprietà TabIndex
Questa proprietà è applicabile a tutti i controlli tranne Image e TabIndex rappresenta la posizione del controllo nell'ordine di tabulazione di un Form quando l'utente preme il tasto Tab. Il valore di indice è espresso come un valore Integer, indicando con 0 la prima posizione nell'ordine di tabulazione e il valore più alto dell'Indice sarà uno in meno del numero di controlli nella Form, a cui la proprietà TabIndex è applicabile. L’immissione di un valore di indice inferiore a zero darà un errore e un valore superiore al più alto possibile resetterà al valore più alto, e ogni controllo avrà un valore di indice univoco.


La Proprietà TabStop
Questa proprietà è applicabile a tutti i controlli tranne Label e Image ed è rappresentata da un valore booleano (True o False) che specifica se il controllo può essere selezionato con il tasto Tab. Il valore True è di default, e imposta il controllo come una tabulazione, mentre invece il valore False ignora il controllo, ma la sua posizione nell'ordine di tabulazione (come specificato nella proprietà TabIndex) rimane intatto.


La Proprietà Visible
Questa Proprietà si applica a tutti i controlli e rappresenta un valore booleano (True o False) che è impostato per visualizzare o nascondere un controllo. Il valore di default è True, in cui il controllo è visibile. Questa proprietà è particolarmente utile in cui in seguito a una condizione è possibile attivare un controllo nascosto che altrimenti non si potrebbe vedere nella Form.


La Proprietà WordWrap
Questa proprietà è applicabile ai controlli Label, TextBox, CheckBox, OptionButton, ToggleButton, CommandButton e RafEdit ed è rappresentata da un valore booleano (True o False) che specifica se il testo di un controllo andrà a capo alla riga successiva. Il valore di default è True e se la proprietà MultiLine di un controllo è impostata su False, WordWrap viene ignorato nei controlli che supportano entrambe queste proprietà vale a dire TextBox.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 22-06-2014, 22.26.59   #41
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Gestione degli Eventi nel foglio di lavoro



Ci sono molti modi per eseguire una macro, possiamo “lanciarla” avviando la finestra di dialogo Macro, tramite un tasto di scelta rapida, un comando di menu o un pulsante personalizzato, la caratteristica comune di tutti questi metodi è che per eseguire la routine l’utente deve fare qualcosa, scegliere un comando, premere una combinazione di tasti o fare clic su un pulsante. In VBA vi sono tuttavia diverse tecniche che permettono di eseguire delle routine automaticamente quando si verifica un determinato evento, ad esempio l’apertura di una cartella di lavoro o l’apertura di un determinato foglio di lavoro.

Vediamo adesso come si creano routine per eventi specifici associati agli oggetti di Excel, prima di tutto però può essere utile rivedere alcuni concetti relativi alle routine di evento. L’esecuzione di una routine guidata dagli eventi è ciclica, anziché seguire un percorso lineare dall’inizio alla fine, la routine rimane in attesa che si verifichino determinati eventi e quindi rispondere a questi. Un evento è qualcosa che avviene nel programma, per esempio l’apertura di una cartella di lavoro, l’attivazione di un foglio di lavoro, il salvataggio di una cartella di lavoro. Poiché gli eventi specifici che si verificano durante l’esecuzione del programma ne determinano il comportamento, si dice che questo è guidato da tali eventi. Quando si verifica un evento il programma esegue una o più routine correlate a tale evento.


Eventi del foglio di lavoro
Gli oggetti di Excel quali Workbook, Worksheet contengono un modulo di classe in cui sono memorizzate le routine di gestione degli eventi di tali oggetti. Il modulo di classe di un foglio di lavoro di Excel (Worksheet) si raggiunge cliccando sul nome di un foglio, come si vede in figura 1 indicato dalla freccia rossa e selezionando l’oggetto Worksheet nell’apposita finestra a discesa indicata dalla freccia blu, compare nella finestra del codice la prima routine degli eventi, oltre alla quale, ne sono presenti molti altri selezionabili nella finestra a discesa indicata dalla freccia verde. Quando selezionate un evento nell’elenco routine (freccia verde), VBA inserisce una dichiarazione vuota per quella routine. Nella finestra Codice della figura 1 potete vedere la dichiarazione vuota della routine di gestione dell’evento SelectionChange del foglio di lavoro

Fig. 1

I vari eventi associati all'oggetto Worksheet sono:

Private Sub Worksheet_Activate ()
Questo evento viene innescato quando il foglio viene attivato e se al suo interno è presente del codice VBA, questo viene eseguito. Alcuni esempi di utilizzo di questo evento

Codice:
Private Sub Worksheet_Activate()
‘mostra la userform1
   UserForm1.Show
End Sub 

Private Sub Worksheet_Activate() 
 ‘ordinare il range B1:B20
 Range("B1:B20").Sort Key1:=Range("B1"), Order:=xlAscending 
End Sub

Private Sub Worksheet_Activate()
 ‘avviso che è stato attivato il foglio1
   MsgBox "Hai attivato il Foglio1"
End Sub
Private Sub Worksheet_SelectionChange (ByVal Target As Range)
Questo evento si verifica quando si seleziona una cella nel foglio ed il parametro Target corrisponde alla cella selezionata.

Codice:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
 ‘selezionare la cella A1 se è vuota
    If Range("A1") = "" Then Range("A1").Select 
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 ‘verificare se la cella selezionata si trova nel Range B5: E20
    Dim cella1 As Range
        If Target.Cells.Count > 1 Then
           MsgBox "Seleziona una sola cella"
           Exit Sub
        End If
    Set cella1 = Range("B5:E20")
    If Application.Intersect(Target, cella1) Is Nothing Then
        MsgBox "Fuori Range"
    Else
        MsgBox "Nel Range"
    End If
End Sub

Option Explicit
 ‘intercettare il cambiamento del colore di sfondo nelle celle
Dim x As Integer, Cell As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
    If Cell = "" Then
        x = Target.Interior.ColorIndex
        Cell = Target.Address
        Exit Sub
    End If
    If Range(Cell).Interior.ColorIndex <> x Then _
        MsgBox "Il Colore della cella " & Cell & " è cambiato"
    x = Target.Interior.ColorIndex
    Cell = Target.Address
End Sub
Private Sub Worksheet_Change (ByVal Target As Range)
Questo evento viene generato quando il contenuto di una cella nel foglio di lavoro viene modificato, la procedura non tiene conto dei cambiamento di formato nella cella, inoltre il parametro Target corrisponde alla cella modificata.

Codice:
Private Sub Worksheet_Change(ByVal Target As Range)
 ‘avvisare che si sta modificando una cella
    If Target.Count > 1 Then Exit Sub
    MsgBox "Vuoi Modificare la cella " & Target.Address & "  col valore   " & Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
 'converte in maiuscolo le celle modificate nel ranhe A1:A10
    If Intersect(Target, Range("A1:A10")) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Target.Value = UCase(Target.Value)
    Application.EnableEvents = True
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range)
 'cambia il colore del font della cella se viene modificata
    Target.Font.ColorIndex = 5
End Sub
Private Sub Worksheet_Deactivate ()
Questo evento viene attivato quando il foglio è spento (commutazione tra i fogli della stessa cartella di lavoro.)
La procedura non viene avviato se si attiva un'altra applicazione o un'altra cartella di lavoro di Excel.

Codice:
Private Sub Worksheet_Deactivate() 
 ‘proteggere un foglio all’uscita
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Private Sub Worksheet_Deactivate()
 ‘nascondere un foglio
    Sheets("Foglio3").Select
    ActiveWindow.SelectedSheets.Visible = False
End Sub

Private Sub Worksheet_Deactivate()
 ‘avvisare che è stato abbandonato un foglio
   MsgBox "Hai disattivato " & Name & "." & vbCrLf & "e sei passato nel " & ActiveSheet.Name & "."
End Sub
Private Sub Worksheet_BeforeDoubleClick (ByVal Target As Range, Cancel As Boolean)
Identifica il doppio click in una cella e il parametro Target corrisponde alla cella che riceve il doppio click, mentre il parametro Cancel disabilita l'azione della macro associata con un evento. Il doppio click consente di modificare la cella (il cursore lampeggia nella cella), ma se si specifica il valore di Cancel = True la modifica verrà impedita.

Codice:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 ‘restituire l’indirizzo della cella che ha ricevuto il doppio click
  MsgBox "Hai fatto Doppio click sulla cella " & Target.Address
   Cancel = True
End Sub 

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 ‘attivare il foglio 1 facendo doppio click
  If Target.Address = "$A$1" Then Worksheets("Foglio1").Activate
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 ‘restituisce l’indirizzo di riga e Colonna dove si è fatto il doppio click
    Select Case Target.Column
        Case 1   'colonna A
            MsgBox "Hai fatto doppio click nella Colonna A e nella riga  " & Target.Row
        Case 2   'colonna B
            MsgBox " Hai fatto doppio click nella Colonna A e nella riga " & Target.Row
        Case 3   'colonna C
            MsgBox " Hai fatto doppio click nella Colonna A e nella riga " & Target.Row
        Case Else
            MsgBox " Hai fatto doppio click nella Colonna A e nella riga D o altre"
    End Select
End Sub
Private Sub Worksheet_BeforeRightClick (ByVal Target As Range, Cancel As Boolean)
Questo evento si verifica quando si utilizza il pulsante destro del mouse su una cella nel foglio, il parametro Target corrisponde alla cella che riceve il tasto destro del mouse, mentre il parametro Cancel disabilita l’azione della macro associata a questo evento.

Codice:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range,Cancel As Boolean)
 ‘nasconde le colonne A-B e C cliccando col destroy sulla cella D5
  If Target.Address(0, 0) = "D5" Then
    With Columns("A:C").EntireColumn
      .Hidden = Not .Hidden
      Target.Value = IIf(.Hidden, "Colonne", "hide") & " Nascoste"
    End With
  End If
  Cancel = True
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
 ‘impedisce di copiare il contenuto del range
MsgBox "Contenuto protetto dalla copia"
Cancel = True
If Not Application.Intersect(Target, Range("A1:C20")) Is Nothing Then Exit Sub
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 
 ‘impedire la comparsa del menu pop-up del destro del mouse
    Cancel = True 
End Sub
Private Sub Worksheet_Calculate ()
Questo evento viene attivato quando il foglio di lavoro viene ricalcolato solo se l'opzione di calcolo automatico non è attivata.

Codice:
Private Sub Worksheet_Calculate() 
 ‘regolare le dimensioni delle colonne da A a F ogni volta che si ricalcola il foglio
 Columns("A:F").AutoFit 
End Sub

Private Sub Worksheet_Calculate()
    If IsNumeric(Range("A1")) Then
      If Range("A1").Value >= 100 Then
        MsgBox "Il Range A1 ha raggiunto il limite 100", vbInformation
      End If
    End If
End Sub
Private Sub Worksheet_FollowHyperlink (ByVal Target As Hyperlink)
L'evento si verifica quando un collegamento viene attivato nel foglio di lavoro, il parametro Target è il collegamento ipertestuale

Codice:
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
 ‘visualizzare l'indirizzo del link che hai appena fatto clic. 
    MsgBox Target.Address & vbCrLf & Target.SubAddress
End Sub

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
 ‘mantiene una lista, di tutti i collegamenti che sono stati visitati dal foglio di lavoro attivo.
    With UserForm1 
        .ListBox1.AddItem Target.Address 
        .Show 
    End With 
End Sub
Private Sub Worksheet_PivotTableUpdate (ByVal Target As pivot)
Questo evento si verifica quando si aggiorna una tabella Pivot contenuta nella scheda, il parametro Target è la tabella pivot.

Codice:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    MsgBox "La tabella '" & Target.Name & "' è stata aggiornata"
End Sub	

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) 
  MsgBox "La connessione della tabella Pivot è stata aggiornata" 
 End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 23-06-2014, 20.40.00   #42
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
I Controlli ScrollBar e SpinButton



Ogni volta che l'utente ha un discreto numero di scelte da fare per l'inserimento dei dati in un foglio di lavoro di Excel è possibile risparmiare tempo automatizzando il modo in cui si inseriscono questi dati. È possibile farlo in diversi modi e uno di loro è quello di utilizzare un pulsante di selezione o una barra di scorrimento.


Il Controllo ScrollBar
Un controllo ScrollBar, o barra di scorrimento, permette di cambiare incrementando o decrementando il valore visualizzato da altri controlli come UserForm, TextBox, Label, etc. o il valore in un intervallo di celle quando un utente fa clic sulle frecce di scorrimento, oppure trascina la casella di scorrimento o clicca in una zona compresa tra una freccia di scorrimento e la casella di scorrimento. Il componente ScrollBar fornisce all’utente uno strumento per gestire un valore definito dal programma e può essere rappresentato graficamente in verticale o orizzontale e al momento della sua creazione VBE lo orienta verticalmente per default, ma possono essere ridimensionati in modo da estendersi orizzontalmente e assumere tale orientamento.

Le principali proprietà di questo controllo sono:

Value: Restituisce o imposta il valore del componente utilizzando dati di tipo Long
SmallChange: Specifica il cambiamento incrementale, come un valore intero (variabile Long), che si verifica quando un utente fa clic sulla freccia di scorrimento. Il valore di default è 1.
LargeChange: Specifica il cambiamento incrementale quando l'utente fa clic tra una freccia di scorrimento e la casella di scorrimento. Il valore di default è 1.
Min e Max: Sono valori interi (Long) che specificano il valore massimo e minimo accettabili del controllo ScrollBar. In una barra di scorrimento verticale cliccando la freccia di scorrimento verso il basso, aumenta il valore e la posizione più bassa visualizza il valore massimo (sarà inverso quando si sceglie la freccia di scorrimento). In una barra di scorrimento orizzontale clic sulla freccia di scorrimento a destra aumenta il valore e la posizione più a destra visualizza il valore massimo (sarà inverso quando si fa clic sulla freccia di scorrimento a sinistra).
Orientation: Determina una barra di scorrimento verticale o una barra di scorrimento orizzontale. Dispone di 3 impostazioni:
  • fmOrientationAuto (Valore -1) - Questo è il valore predefinito in cui le dimensioni della ScrollBar sono determinare automaticamente, sia in verticale o orizzontale, nei casi in cui il valore della larghezza è più alto dell’altezza, allora la ScrollBar è orizzontale e dove l'altezza è più alta della larghezza, allora la ScrollBar è verticale
  • FmOrientationVertical (Valore 0) – La ScrollBar è verticale
  • FmOrientationHorizontal (valore 1) – La ScrollBar è orizzontale.

Codice:
Private Sub UserForm_Activate()  ‘ Mostrare un Frame con scrollBar laterale
   With Me.Frame1
        .ScrollBars = fmScrollBarsVertical ' creare barra verticale
         'Cambia questi valori per la dimensione della barra
        .ScrollHeight = .InsideHeight * 2
        .ScrollWidth = .InsideWidth * 9
    End With
End Sub
Codice:
Private Sub UserForm_Activate()  ‘Mostrare una Userform con scrollbar laterale
    With Me
        .ScrollBars = fmScrollBarsVertical
                'Cambia questi valori per la dimensione della barra
        .ScrollHeight = .InsideHeight * 2
        .ScrollWidth = .InsideWidth * 9
    End With
End Sub
Codice:
Private Sub ScrollBar1_Change()  ‘Incrementare valore Textbox dalla scrollbar
    Me.TextBox1.Text = Me.ScrollBar1.Value
End Sub
 
Private Sub UserForm_Initialize()
    With Me.ScrollBar1
        .Value = 0
        .Min = 0
        .Max = 100
        .LargeChange = 10
        .SmallChange = 5
    End With
End Sub
Codice:
Option Explicit    ‘scorrere le righe di un foglio e mostrare contenuto in Textbox
  Dim wks As Worksheet
Dim riga_I, riga_F As Long
 Private Sub ScrollBar1_Change()
    Dim row As Long
    row = CLng(Me.ScrollBar1.Value)
    With wks
        Me.TextBox1.Text = .Cells(row, 1)
        Me.TextBox2.Text = .Cells(row, 2)
        Me.TextBox3.Text = .Cells(row, 3)
        Me.TextBox4.Text = .Cells(row, 4)
        Me.TextBox5.Text = .Cells(row, 5)
    End With
End Sub
 
Private Sub UserForm_Initialize()
    Set wks = Worksheets("Foglio1")
      Riga_I = 2
    Riga_F = wks.Cells(riga_I, 1).End(xlDown).row
        With Me.ScrollBar1
        .Value = riga_I
        .Min = riga_I
        .Max = riga_F
        .LargeChange = 1
        .SmallChange = 1
    End With
    Call ScrollBar1_Change
End Sub

Il Controllo SpinButton
Un controllo SpinButton, o pulsante di selezione, viene spesso utilizzato per incrementare o decrementare il valore di un altro controllo, ad esempio un controllo Label e la proprietà SmallChange determina il valore di un controllo SpinButton quando cambia. Un controllo SpinButton è molto simile a un controllo ScrollBar e viene utilizzato per incrementare o diminuire il valore (cioè un numero, data, ora, etc.) visualizzato da altri controlli UserForm, TextBox, Label, etc. o il valore in un intervallo di celle. Un controllo SpinButton (noto anche come un controllo di selezione) funziona come un controllo ScrollBar, con proprietà simili (cioè SmallChange, Min, Max) e la proprietà SmallChange specifica il cambiamento incrementale, come un valore intero, che si verifica quando un utente fa clic sulla freccia di scorrimento. Un controllo SpinButton non ha una struttura LargeChange come in una ScrollBar e in una barra di scorrimento verticale cliccando la freccia di scorrimento diminuisce il valore mentre premendo la freccia di scorrimento su un Spinner verticale aumenta il valore.

La differenza tra i controlli ScrollBar e SpinButton è che la struttura ScrollBar può essere trascinata per modificare il valore del controllo su incrementi maggiori (pur mantenendo l'incremento basso per click), che i vantaggi di una ScrollBar per effettuare una selezione da tutto un numero di valori e coprono una gamma estremamente vasta.

Esempio: Utilizzare un controllo SpinButton per cambiare le date in una TextBox, all'interno di un intervallo specificato:

Fig. 1
Codice:
Private Sub UserForm_Initialize()
'popolare il TextBox con una data
Dim dt As Date
'Non consentire l'immissione manuale in TextBox
TextBox1.Enabled = False
dt = "10/10/2014"
TextBox1.Text = dt
End Sub
 
Private Sub SpinButton1_SpinUp()
'aumentare di un giorno alla volta, quando siamo nello stesso mese
Dim dt_su As Date
Dt_su = "30/10/2014"
 If DateValue(TextBox1.Text) < dt_su Then
TextBox1.Text = DateValue(TextBox1.Text) + 1
End If
End Sub
 
Private Sub SpinButton1_SpinDown()
 ‘diminuire di un giorno alla volta, quando siamo nello stesso mese
Dim dt_giu As Date
Dt_giu = "01/10/2014"
If DateValue(TextBox1.Text) > dt_giu Then
TextBox1.Text = DateValue(TextBox1.Text) - 1
End If
End Sub
Esempio: Spostare le voci in alto e in basso selezionate in un ListBox utilizzando il controllo SpinButton

Fig. 2
Codice:
Private Sub carica_Box()
Dim n As Integer, cell As Range, rng As Range
Set rng = Foglio1.Range("A1:A6")
For n = 1 To ListBox1.ListCount
ListBox1.RemoveItem ListBox1.ListCount - 1
Next n
For Each cell In rng.Cells
Me.ListBox1.AddItem cell.Value
Next cell
End Sub

Private Sub UserForm_Initialize()
carica_Box
End Sub

Private Sub SpinButton1_SpinUp()
'cliccare sulla freccia in alto per spostare l'elemento selezionato nel ListBox verso l’alto, sia nel 
’ListBox che nel foglio di lavoro collegato
Dim n As Long
n = ListBox1.ListIndex
If n > 0 Then
Foglio1.Range("A" & n + 1).Value = Foglio1.Range("A" & n).Value
Foglio1.Range("A" & n).Value = ListBox1.Value
carica_Box
ListBox1.Selected(n - 1) = True
ElseIf ListBox1.ListIndex = 0 Then
MsgBox "Il primo elemento non può essere spostato in alto!"
Else
MsgBox "Seleziona una voce!"
End If
End Sub

Private Sub SpinButton1_SpinDown()
'cliccare sulla freccia in basso per spostare l'elemento selezionato nel ListBox verso il basso, sia nel ’ListBox che nel foglio di lavoro collegato
Dim n As Long
n = ListBox1.ListIndex
If n >= 0 And n < ListBox1.ListCount - 1 Then
Foglio1.Range("A" & n + 1).Value = Foglio1.Range("A" & n + 2).Value
Foglio1.Range("A" & n + 2).Value = ListBox1.Value
carica_Box
ListBox1.Selected(n + 1) = True
ElseIf ListBox1.ListIndex = ListBox1.ListCount - 1 Then
MsgBox "L'ultimo elemento non può essere spostato in basso!"
Else
MsgBox "Seleziona una voce!"
End If
End Sub

Private Sub CommandButton1_Click()
Unload Me
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 24-06-2014, 15.20.24   #43
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
I Controlli Frame, Multipage e TabStrip




I frame (cornici) vengono utilizzati per i controlli di gruppo che lavorano insieme e sono correlati tra loro o hanno qualche comunanza, in una Form, inoltre per raggruppare e organizzare una serie di elementi correlati, migliorano anche il layout della Form. Ad esempio, in un modulo che contenga le caratteristiche fisiche come l'altezza, peso e colore dei capelli possono essere raggruppati in un particolare frame. I Frame sono particolarmente utili per raggruppare due o più OptionButtons e vengono utilizzati per due finalità:
  • Per raggruppare e organizzare in una Form i controlli e migliorare visivamente il layout
  • Per impostare il comportamento di un gruppo di OptionButtons, che si escludono a vicenda all'interno di un frame e selezionando un OptionButton saranno deselezionate tutte le altre OptionButtons all'interno del Frame.
Esempio: Determinare il nome e la Caption di tutte le OptionButtons in un Frame
Codice:
Private Sub CommandButton1_Click()
Dim ctrl As Control
For Each ctrl In Frame1.Controls
If TypeOf ctrl Is MSForms.OptionButton Then
If ctrl.Enabled = True Then
MsgBox ctrl.Name & " è abilitato con Caption " & ctrl.Caption
End If
End If
Next
End Sub

Il controllo MultiPage
Un controllo multipage si compone di uno o più oggetti pagina, ciascuna contenente un proprio set di controlli e viene utilizzato al meglio quando si desidera gestire una grande quantità di dati che possono essere classificati in diverse categorie, in cui è possibile creare una pagina separata per ogni categoria. Tutti i controlli che vengono aggiunti a una pagina di un controllo multipage, sono contenuti diventano una parte di quella pagina che distingue i controlli da quelli che sono in altre parti della Form. Un controllo multipagina ha diverse pagine e la selezione di una pagina la rende quella corrente (rendendola visibile), nascondendo le altre e ogni pagina di un controllo multipage ha un proprio ordine di tabulazione. Le pagine sono numerate da 0, e per selezionare la prima pagina in un controllo multipagina, si utilizza il codice: MultiPage1.Value = 0 e per impostazione predefinita, un controllo multipage ha 2 Pagine e per aggiungere delle pagine, si deve fare clic col destro del mouse sulla scheda e selezionare dal menu che appare la voce Nuova pagina


Aggiungi o Rimuovi pagina
Per aggiungere una pagina con codice VBA si utilizzo il Metodo Add che presenta questa sintassi:

Set m = MultiPage1.Pages.Add (pageName, pageCaption, pageIndex), dove:
  • pageIndex (opzionale) è un intero che specifica la posizione della pagina da inserire, a partire da 0 per la prima posizione
  • pageName imposta il nome per la pagina
  • pageCaption imposta la Caption ed entrambe sono opzionali.
Alcuni esempi di inserimento di nuove pagine:

Set m = MultiPage1.Pages.Add ("Page5", "NewPage", 1)
Questo codice aggiunge una nuova pagina con il nome Pagina5 e Caption Nuova Pagina, come seconda pagina, cioè nella seconda posizione nell'ordine di tabulazione.

MultiPage1.Pages.Add "Pagina3"
MultiPage1.Pages (2). Caption = "Nuova"

Questi 2 codici aggiungono una nuova pagina (la terza) con il nome Pagina3 e imposta la Caption Nuova

MultiPage1.Pages.Add: Questo codice aggiunge semplicemente una nuova pagina.

Per rimuovere una pagina si usa ilseguente metodo che presenta la sintassi: MultiPage1.Pages.Remove (pageIndex) .
Esempio: MultiPage1.Pages.Remove (1) :Questo codice rimuove la seconda pagina.


Individuare e Accedere a una pagina
Per modificare o impostare le proprietà di una pagina in fase di esecuzione, abbiamo bisogno di identificare quella pagina nel controllo multipage, che può essere fatto in diversi modi. Per accedere a una singola pagina in un controllo multipagina, possono essere usati i seguenti metodi
  • Numeric Index : Con Index (indice) 0 ci si riferisce alla prima pagina, l’indice 1 alla seconda pagina e così via. Il codice per impostare la Caption è : MultiPage1.Pages (Index).Caption
  • Metodo Item: L’indice (Item) 0 si riferisce alla prima pagina, l’indice 1 alla seconda pagina e così via. Il codice per impostare la Caption è : MultiPage1.Pages.Item (ItemIndex).Caption
  • Page Name: Per impostare la Caption usando il nome pagina si usa il seguente codice: MultiPage1.Pages ("Nuova Pagina"). Caption oppure MultiPage1.Pages.Item ("Nuova pagina"). Caption
  • Page Object : Il codice per impostare la Caption è MultiPage1.PageName.Caption
  • Proprietà SelectedItem : Il codice per impostare la Caption è MultiPage1.SelectedItem.Caption
Esempio: Modificare le proprietà di ogni pagina di un controllo multipage, utilizzando diversi metodi di selezione pagina.

Fig. 1 Fig. 2
Codice:
Private Sub UserForm_Activate()
MultiPage1.Pages(0).Caption = "Elisa"
MultiPage1.Pages.Item(1).Caption = "Daniele"
MultiPage1.Pages("Page3").Caption = "Mario"
MultiPage1.Page4.Caption = "Alice"
MultiPage1.Value = 4
MultiPage1.SelectedItem.Caption = "Genny"
End Sub

Il Controllo TabStrip
Un controllo TabStrip viene utilizzato per visualizzare contenuti diversi in ogni scheda per la stessa serie di controlli. Un TabStrip è una raccolta di schede in cui ogni scheda contiene una serie di controlli. Per impostazione predefinita, un controllo TabStrip ha 2 Tabs, per aggiungere delle schede, si deve fare clic col destro del mouse sulla scheda e selezionare Nuova Pagina (selezionare Elimina pagina per eliminare un Tab).


Aggiungi o rimuovi una scheda
Per aggiungere una scheda si utilizzoa il Metodo Add che ha questa sintassi: Set t = TabStrip1.Tabs.Add (tabname, tabCaption, tabIndex) dove
tabIndex (opzionale) è un numero intero che specifica la posizione della linguetta da inserire, si inizia da 0 per la prima posizione, mentre
tabname imposta il nome per la scheda e
tabCaption imposta la Caption, entrambi sono opzionali

Set t = TabStrip1.Tabs.Add ("TAB4", "newtab", 1) Questo codice aggiunge una nuova scheda con il nome TAB4 e Caption newtab, come seconda scheda (cioè seconda posizione nell'ordine di tabulazione).

TabStrip1.Tabs.Add "Tab3"
TabStrip1.Tabs (2) Caption = "Prova"
: Questi 2 codici aggiungono una nuova (terza) scheda denominata Tab3 e impostano la Caption a Prova

Per rimuovere una scheda si usa la sintassi: TabStrip1.Tabs.Remove (tabCaption) . Esempio: TabStrip1.Tabs.Remove ("Prova"), questo codice rimuove la scheda con Caption Prova


Differenza tra un controllo Multipage e TabStrip
Un controllo multipage è un contenitore per i controlli, simile a un frame e ogni pagina ha un insieme separato di controlli e selezionando una pagina si nascondono le altre pagine del controllo, mentre un controllo TabStrip contiene un insieme coerente di controlli in tutte le schede e il contenuto dei controlli cambia quando è selezionata una scheda diversa ma la visibilità o disposizione dei comandi rimangono stesso.


Selezione di una scheda
Per modificare o impostare le proprietà di una scheda a run-time, si deve identificare il Tab nel controllo TabStrip, che può essere fatto in diversi modi, si può usare la proprietà SelectedItem del controllo TabStrip che indica che è selezionata la scheda Tab. Si ricorda che per selezionare una scheda si deve impostare la proprietà Value del controllo TabStrip. I valori partono da 0, e la prima scheda in un controllo TabStrip avrà un valore 0, il valore della seconda sarà 1, e così via. Per accedere a una singola scheda in un controllo TabStrip, si possono usare i seguenti metodi
  • Numeric Index (Indice numerico): Con indice 0 si riferisce alla prima pagina, con indice 1 alla seconda e così via. Il codice per impostare la Caption è : TabStrip1.Tabs (Index).Caption
  • Metodo Item (utilizzando l'insieme Tabs): Con Indice 0 si riferisce alla prima pagina, con indice 1 alla seconda pagina e così via.Il codice per impostare la Caption è : TabStrip1.Tabs.Item (ItemIndex).Caption
  • Tab Name : Il codice per impostarela Caption è: TabStrip1.Tabs ("tabname").Caption o ppure TabStrip1.Tabs.Item ("TabName"). Caption
  • Tab Object : Il codice per impostare la Caption è: TabStrip1.TabName.Caption
  • Proprietà SelectedItem : Il codice per impostare la Caption è : TabStrip1.SelectedItem.Caption
Esempio: Cambiare impostare e proprietà di ogni scheda di un controllo TabStrip, utilizzando diversi metodi di selezione delle tabulazioni.

Fig. 3
Codice:
Private Sub UserForm_Initialize()
TabStrip1.Tabs(0).Caption = "Veneto"
TabStrip1.Tabs.Item(1).Caption = "Sicilia"
TabStrip1.Tabs("Tab3").Caption = "Lazio"
TabStrip1.Tab4.Caption = "Liguria"
TabStrip1.Value = 4
TabStrip1.SelectedItem.Caption = "puglia"
End Sub
 
Private Sub CommandButton1_Click()
    Dim i As Integer
For i = 0 To TabStrip1.Tabs.Count - 1
MsgBox TabStrip1.Tabs(i).Name & " Ha come Caption  " & TabStrip1.Tabs(i).Caption
Next i
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 26-06-2014, 18.41.40   #44
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Metodi e Proprietà del Foglio di lavoro o Worksheet



L'oggetto foglio rappresenta un singolo foglio in una cartella e si riferisce a una raccolta di tutti i fogli in una cartella di lavoro, cioè tutti i fogli di lavoro, fogli grafici, macro etc. ed è un membro sia della collezione Worksheets (oggetto foglio di lavoro) che della raccolta Sheets (oggetto Foglio). La proprietà Workbook.Worksheets restituisce un insieme Worksheets (cioè un oggetto foglio), che si riferisce a tutti i fogli di una cartella di lavoro, mentre la proprietà Workbook.Sheets restituisce un insieme Sheets, che si riferisce a tutti i fogli di una cartella di lavoro. Utilizzando il codice MsgBox ActiveWorkbook.Worksheets.Count restituirà il numero dei fogli di lavoro nella cartella di lavoro attiva, e il codice MsgBox ActiveWorkbook.Sheets.Count restituirà il numero dei fogli nella cartella di lavoro attiva.

L'oggetto Charts (grafico) rappresenta un diagramma in una cartella di lavoro, che può essere sia un grafico incorporato o un foglio grafico separato e la collezione Charts si riferisce ad una raccolta di tutti i fogli grafici in una cartella, ed esclude tutti i grafici incorporati, mentre invece l'oggetto ChartObject rappresenta un grafico incorporato e si riferisce ad una raccolta di tutti gli oggetti ChartObject in un unico foglio, cioè in un foglio grafico specifico.

Una cartella di lavoro può contenere quattro tipi di fogli, il foglio di lavoro, un foglio con grafico, fogli macro (Macro MS Excel 4.0) e un foglio di dialogo (finestra di dialogo MS Excel 5.0). I fogli macro (chiamati anche macro XLM) e i fogli di dialogo (utilizzati nelle versioni precedenti di Excel per creare finestre di dialogo personalizzate, ora sostituiti dalle UserForm), sono ancora forniti e supportati in Excel 2007 solo per compatibilità con le versioni precedenti di Microsoft Excel, mentre un foglio macro (o un foglio di dialogo) non è incluso come parte della collezione dei fogli di lavoro, ma è una parte della collezione Sheets.

Esempio: Illustrare i tipi di oggetti spiegati sopra, considerando una cartella di lavoro con tre fogli di lavoro denominati: Foglio1, Foglio2 e Foglio3), 2 grafici incorporati in Foglio1, 1 foglio grafico Chart1, 1 foglio macro Macro1 e 1 foglio di dialogo Dialog1.
Codice:
Sub prova1()
Dim ws As Worksheet, i As Integer
'Restituisce 6, in quanto ci sono: 3 fogli, 1 grafico, 1 macro e 1 foglio di dialogo
MsgBox ThisWorkbook.Sheets.Count
'Restituisce i nomi di ognuno dei 6 fogli
For i = 1 To ThisWorkbook.Sheets.Count
MsgBox ThisWorkbook.Sheets(i).Name
Next i
'Restituisce 3 (che sono i fogli di lavoro: "Foglio1", "Foglio2" e "Foglio3")
MsgBox ThisWorkbook.Worksheets.Count
'Restituisce i nomi di ciascuno dei 3 fogli di lavoro
For Each ws In ThisWorkbook.Worksheets
MsgBox ws.Name
Next
Dim sh As Object
'Restituisce i nomi di ognuno dei 6 fogli
For Each sh In ThisWorkbook.Sheets
MsgBox sh.Name
Next
'Restituisce i nomi di ognuno dei 3 fogli di lavoro ("Foglio1", "Foglio2" e "Foglio3")
For Each sh In ThisWorkbook.Worksheets
MsgBox sh.Name
Next
'restituisce 1 - c'è 1 oggetto grafico "Chart1" in questa cartella di lavoro
MsgBox ThisWorkbook.Charts.Count
'restituisce 0 - non c'è grafico incorporato ChartObject nel foglio grafico
MsgBox Sheets("Chart1").ChartObjects.Count
'restituisce 2 - ci sono 2 grafici incorporati ChartObject nel foglio di lavoro denominato "Foglio1"
MsgBox Sheets("Sheet1").ChartObjects.Count
End Sub
Riferimenti a un singolo foglio di lavoro
Per fare riferimento o restituire un oggetto foglio di lavoro (unico foglio di lavoro), usiamo le proprietà di entrambi i fogli di lavoro e l'oggetto foglio di lavoro, come illustrato di seguito. La proprietà Item dell'oggetto foglio; es. Worksheets.Item si riferisce ad un singolo foglio in una collezione e presenta la seguente sintassi: WorksheetsObject.Item (Index), dove Index è il nome del foglio di lavoro o il numero di indice, che però è anche possibile omettere utilizzando il 'punto' in una sintassi come:
Codice:
WorksheetsObject (WorksheetName)
'oppure
WorksheetsObject (IndexNumber)
Il numero di indice inizia da 1, viene visualizzato per primo ed è collocato all’estrema sinistra del foglio di lavoro nella barra delle schede della cartella di lavoro che si incrementa verso destra per ogni foglio presente, inclusi i fogli di lavoro nascosti, e l'ultimo foglio collocato all’estrema destra del foglio di lavoro viene restituito da Worksheets (Worksheets.Count) . La proprietà Count dell'oggetto fogli di lavoro restituisce il numero di fogli nella collezione (cioè nella cartella di lavoro), inoltre per riferirsi a un singolo foglio nella raccolta fogli è possibile utilizzare la proprietà Sheets.Item con la seguente sintassi: SheetsObject.Item (Index)

La scheda del foglio di lavoro visualizza il nome del foglio stesso e si utilizza la proprietà Name dell'oggetto Worksheet per impostare o restituire il nome di un foglio di lavoro usando questa sintassi: WorksheetObject.Name. Di seguito alcuni esempi di codice con riferimento a un foglio di lavoro

Esempio: Restituisce il nome del primo foglio nella cartella di lavoro attiva - sia tramite che omettendo l’istruzione "Item"
Codice:
MsgBox ActiveWorkbook.Worksheets.Item (1). Name
'oppure 
MsgBox ActiveWorkbook.Worksheets (1). Name
Esempio: Restituisce il nome del primo foglio della cartella di lavoro attiva - sia tramite che omettendo l’istruzione "Item"
Codice:
MsgBox ActiveWorkbook.Sheets.Item (1). Name
'oppure
MsgBox ActiveWorkbook.Sheets (1). Name
Esempio: Restituisce il nome del primo foglio ThisWorkbook, omettendo l’istruzione "Item"
Codice:
MsgBox ThisWorkbook.Worksheets (1). Name
Esempio: Attiva il foglio di lavoro denominato Foglio3 della cartella di lavoro attiva
Codice:
ActiveWorkbook.Worksheets ("Foglio3"). Activate
Esempio: Attiva il foglio denominato Chart1 della cartella di lavoro attiva
Codice:
ActiveWorkbook.Sheets ("Chart1"). Activate
Esempio: Non specificando una cartella di lavoro si farà riferimento alla cartella di lavoro attiva, si usa il seguente codice per restituire il nome del secondo foglio di lavoro nella cartella di lavoro attiva:
Codice:
MsgBox Worksheets (2). Name
'Oppure
MsgBox Sheets(2). Name
Esempio: Consultare il foglio attivo nella cartella di lavoro attivo
Codice:
MsgBox ActiveSheet.Name
Esempio: Restituisce il nome del secondo foglio di lavoro nella cartella di lavoro prova.xlsx
Codice:
MsgBox Workbooks ("prova.xlsx"). Worksheets (2). Name
Esempio: Restituisce il nome del primo foglio di lavoro nella seconda cartella di lavoro
Codice:
MsgBox Workbooks(2).Worksheets(1).Name
MsgBox Workbooks.Item(2).Worksheets.Item(1).Name
MsgBox Workbooks(2).Worksheets.Item(1).Name
Esempio: Consultare i fogli di lavoro della cartella di lavoro attiva contenente 3 fogli, vale a dire Foglio1, Foglio2 e Foglio3
Codice:
Sub prova2()
'Restituisce il nome del primo foglio di lavoro "Foglio1"
MsgBox ActiveWorkbook.Worksheets(1).Name
'Cambia il nome del primo foglio di lavoro da "Foglio1" a "pippo"
ActiveWorkbook.Worksheets(1).Name = "pippo"
'Restituisce il nuovo nome del primo foglio di lavoro (pippo) 
MsgBox Worksheets(1).Name
'Restituisce il nome dell'ultimo foglio (Foglio3) 
MsgBox ActiveWorkbook.Worksheets(Worksheets.Count).Name
'Restituisce 3, il n° totale dei fogli di lavoro
MsgBox ActiveWorkbook.Worksheets.Count
'Restituisce il valore -1, che indica che il foglio di lavoro "Foglio2" è visibile
MsgBox Worksheets("Sheet2").Visible
'Nasconde "Foglio2” 
Worksheets("Sheet2").Visible = False
'Restituisce il valore 0, che indica che "Foglio2" è nascosto 
MsgBox Worksheets("Sheet2").Visible
'Restituisce 3, il n° totale di fogli di lavoro contando anche quelli nascosti
MsgBox Worksheets.Count
'Rende visibile "Foglio2"
Worksheets("Sheet2").Visible = True
End Sub
Facendo riferimento a un intervallo di celle, omettendo il qualificatore oggetto – worksheet object - per impostazione predefinita assume Active Sheet, vale a dire che utilizzando il codice Range ("A1") restituirà la cella A1 del foglio attivo, e sarà lo stesso che utilizzare Application.Range ("A1") o ActiveSheet.Range ("A1").

Esempio: Immettere il valore 10 nella cella A1 del foglio di lavoro attivo
Codice:
ActiveSheet.Range ("A1"). Value = 10
Range ("A1"). Value = 10
Application.Range ("A1"). Value = 10
L'oggetto attivo o ActiveSheet
Se non viene specificata la cartella di lavoro, Excel si riferisce alla cartella di lavoro corrente o attiva di default e nel codice VBA è possibile anche consultare l'attuale cartella di lavoro attiva come ActiveWorkbook o ActiveSheet e entrambe le espressioni Worksheets (1). Name e ActiveWorkbook.Worksheets (1). Name restituiranno il nome del primo foglio di lavoro nella cartella di lavoro attiva che diventa anche l'oggetto di default in questo caso. Allo stesso modo, entrambe le espressioni Range ("A1"). Value = 56 e ActiveSheet.Range ("A1"). Value = 56 inseriranno il valore 56 nella cella A1 del foglio di lavoro attivo nella cartella di lavoro attiva. Questa è una regola generale che omettendo il riferimento di una cartella di lavoro o foglio di lavoro ci si riferisce alla cartella di lavoro attiva o di default, ma è soggetto alle seguenti condizioni:
  • Quando il codice VBA viene inserito nei moduli foglio (cioè Foglio1, Foglio2, etc.), omettere il riferimento ad un foglio di lavoro si farà riferimento al foglio specifico in cui il il codice viene inserito nel modulo e non al foglio attivo
  • Quando il codice VBA viene inserito nel modulo Workbook (ThisWorkbook) , omettere il riferimento ad una cartella di lavoro si farà riferimento alla cartella di lavoro in cui è inserito il codice e NON alla cartella di lavoro attiva. Questo significa che:
  • Omettendo il riferimento ad un foglio di lavoro si imposterà ActiveSheet quando il codice VBA viene inserito nei moduli standard di codice (Module1, Module2, etc.) oppure nel modulo della cartella di lavoro (ThisWorkbook) e NON quando il codice VBA viene inserito nei moduli Foglio (Foglio1, Foglio2, etc.) o Form o eventuali moduli di classe
  • Omettendo il riferimento a una cartella di lavoro, quella predefinita sarà ActiveWorkbook quando il codice VBA viene inserito nei moduli di codice standard (Module1, Module2, etc.) o nei moduli foglio (Foglio1, Foglio2, etc.) e NON quando il codice VBA viene inserito nel modulo Workbook (ThisWorkbook).

Codice Name e Sheet Name
Nel Progetto VBE, la cartella Objects è sempre presente e contiene un oggetto foglio per ogni foglio di lavoro esistente, e un oggetto ThisWorkbook. Ogni oggetto foglio ha come primo nome il nome in codice del foglio, che appare al di fuori delle parentesi, e come secondo nome, che compare dopo il nome in codice e tra parentesi, il nome della scheda del foglio che appare nel foglio di lavoro di Excel. Il nome in codice del foglio di lavoro selezionato viene visualizzato a destra del “nome” nella finestra Proprietà, mentre il nome del foglio viene visualizzata a destra del nome quando si scorre verso il basso nella finestra Proprietà. Per impostazione predefinita, quando si aggiunge un foglio di lavoro, il nome in codice e il nome del foglio sono gli stessi e i nomi in codice di default e i fogli di default iniziano da Foglio1, Foglio2 etc. in questo ordine da sinistra a destra.

Fig. 1

È possibile modificare sia il nome in codice che il nome del foglio, mentre il nome del foglio può essere modificato nella finestra Proprietà (in VBE) o nella scheda foglio o da codice VBA, ma il nome in codice può essere modificato solo nella finestra Proprietà e non a livello di programmazione. Sia il nome in codice che il nome del foglio possono essere utilizzati durante la scrittura del codice. Mostriamo di seguito come utilizzare questi nomi in codice VBA.

Il codice seguente inserisce il testo "ciao" nella cella A1 del foglio di lavoro il cui nome in codice è Foglio1
Codice:
Sheet1.Range ("A1"). Value = "ciao"
Il codice seguente inserisce il testo "ciao" nella cella A1 del foglio di lavoro il cui nome foglio è Foglio1
Codice:
Worksheets ("Foglio1"). Range ("A1"). Value = "ciao"
Il codice seguente inserisce il testo "ciao" nella cella A1 del primo foglio di lavoro
Codice:
Worksheets (1). Range ("A1"). Value = "ciao"
Attivare o selezionare un foglio di lavoro
Il foglio di lavoro attivo è il foglio di lavoro che si sta attualmente visualizzando o lavorare e la proprietà Workbook.ActiveSheet restituisce il foglio attualmente attivo in una cartella di lavoro: Sintassi: WorkbookObject.ActiveSheet. Per rendere un foglio attivo si deve utilizzare il metodo Worksheet.Activate con questa sintassi: WorksheetObject.Activate. Si noti che è possibile selezionare più fogli di lavoro, ma si può attivare solo un singolo foglio. Per selezionare un foglio di lavoro si utilizza il metodo Worksheet.Select con questa sintassi: WorksheetObject.Select (Replace). Replace è un argomento facoltativo, usato solo quando si utilizza il metodo Select per i fogli (il metodo Select è utilizzato anche per selezionare le celle) e ponendolo a True, questo argomento sostituirà la selezione precedente, mentre con False includerà la selezione precedente (estendendo così la selezione corrente per includere i fogli selezionati in precedenza) mentre omettendo la specifica, l'argomento sarà posto di default a True. Si utilizza il metodo Worksheets.Select (metodo Select dell'oggetto foglio di lavoro) per selezionare tutti i fogli in una cartella di lavoro. Sintassi: WorksheetsObject.Select (Replace).

Esempio: Selezionare fogli singoli o multipli considerando una cartella di lavoro contenente tre fogli di lavoro, Foglio1, Foglio2 e Foglio3
Codice:
Sub seleziona1()
'Seleziona e attiva il secondo foglio di lavoro Foglio2
ActiveWorkbook.Worksheets(2).Select
'Restituisce il foglio di lavoro attivo Foglio2
MsgBox ActiveWorkbook.ActiveSheet.Name
'Selezionare più fogli di lavoro nella cartella utilizzando un array di nomi di foglio
’dove il primo foglio nella matrice è Foglio3 che diventa il foglio di lavoro attivo
ActiveWorkbook.Sheets(Array("Foglio3", "Foglio1")).Select
'Restituisce il foglio di lavoro attivo Foglio3
MsgBox ActiveWorkbook.ActiveSheet.Name
'Seleziona e attivare il secondo foglio di lavoro Foglio2, la selezione precedente 
’viene sostituita quindi questo è l'unico foglio di lavoro selezionato
ActiveWorkbook.Worksheets("Foglio2").Select
'Restituisce il foglio di lavoro attivo Foglio2
MsgBox ActiveWorkbook.ActiveSheet.Name
'Selezionare più fogli di lavoro , tranne l'ultimo 
Dim i As Integer
For i = 1 To ThisWorkbook.Worksheets.Count - 1
ActiveWorkbook.Worksheets(i).Select (False)
Next i
'Restituisce il foglio di lavoro attivo Foglio2, che era il foglio di lavoro attivo prima del ciclo For
MsgBox ActiveWorkbook.ActiveSheet.Name
End Sub
Esempio: Selezionare e attivare i fogli di lavoro, considerando una cartella di lavoro che contenente 4 fogli, vale a dire Foglio1, Foglio2, Foglio3 e Foglio4
Codice:
Sub seleziona2()
'Seleziona e attiva il primo foglio (Foglio1) 
ActiveWorkbook.Worksheets(1).Select
'Restituisce il foglio di lavoro attivo (Foglio1) 
MsgBox ActiveWorkbook.ActiveSheet.Name
'Seleziona il secondo foglio di lavoro (Foglio2), senza attivarlo e senza deselezionare la selezione precedente
ActiveWorkbook.Worksheets(2).Select (False)
'Restituisce il foglio di lavoro attivo (Foglio1) 
MsgBox ActiveWorkbook.ActiveSheet.Name
'Seleziona il terzo foglio di lavoro (Foglio3), senza attivarlo e senza deselezionare la selezione precedente
ActiveWorkbook.Worksheets(3).Select (False)
'Restituisce il foglio di lavoro attivo (Foglio3) 
MsgBox ActiveWorkbook.ActiveSheet.Name
'Attiva il terzo foglio di lavoro (Foglio3), senza deselezionare la selezione precedente 
 ‘perché uno dei fogli selezionati viene attivato
ActiveWorkbook.Worksheets(3).Activate
'Restituisce il foglio di lavoro attivo (Foglio3) 
MsgBox ActiveWorkbook.ActiveSheet.Name
'I fogli di lavoro (Foglio1, Foglio2 e Foglio3) sono attualmente selezionati
Dim ws As Worksheet
For Each ws In ActiveWindow.SelectedSheets
MsgBox ws.Name
Next
'Attiva e seleziona il quarto foglio di lavoro (Foglio4), che è l'unico foglio selezionato ora, 
 ‘deselezionando la selezione precedente, perché il foglio attivo non è uno dei fogli di lavoro 
 ‘selezionati in precedenza 
ActiveWorkbook.Worksheets(4).Activate
'Restituisce il foglio di lavoro attivo (Foglio4) 
MsgBox ActiveWorkbook.ActiveSheet.Name
End Sub
Esempio: Selezionare tutti i fogli, considerando una cartella di lavoro contenente 3 fogli di lavoro, Foglio1, Foglio2 e Foglio3
Codice:
Sub seleziona3()
'Seleziona tutti i fogli di lavoro nella cartella di lavoro attiva
ActiveWorkbook.Worksheets.Select
'Il primo foglio diventa il foglio attivo in questo caso - restituisce Foglio1
MsgBox ActiveWorkbook.ActiveSheet.Name
'Seleziona tutti i fogli della cartella di lavoro attiva utilizzando una matrice di nomi
ActiveWorkbook.Sheets(Array("Foglio2", "Foglio3", "Foglio1")).Select
'Il primo foglio nella matrice diventa il foglio attivo e restituisce Foglio2
MsgBox ActiveWorkbook.ActiveSheet.Name
'attivare e selezionare il terzo foglio di lavoro (Foglio3), deselezionando tutti gli altri fogli
ActiveWorkbook.Worksheets(3).Activate
'Restituisce il foglio di lavoro attivo (Foglio3) 
MsgBox ActiveWorkbook.ActiveSheet.Name
'Modo alternativo per selezionare tutti i fogli della cartella di lavoro attiva 
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Visible Then ws.Select (False)
Next
'il foglio attivo rimane lo stesso di prima del ciclo For, cioè (Foglio3) 
MsgBox ActiveWorkbook.ActiveSheet.Name
End Sub
La proprietà Window.SelectedSheets
Si utilizzare la proprietà Window.SelectedSheets per determinare tutti i fogli selezionati in una finestra specificata con la seguente sintassi: WindowObject.SelectedSheets, dove Window (1) si riferisce sempre alla finestra attiva. Una sola finestra (Window Object) è un membro della Collezione di Windows e la raccolta di Windows contiene tutte le finestre dell’Applicazione Excel (raccolta di Windows per l'oggetto Application) o contiene tutte le finestre della cartella di lavoro specificata (raccolta di Windows per oggetto Workbook).


Aggiungere e rinominare Fogli di lavoro
Per creare o aggiungere un nuovo foglio di lavoro in una cartella di lavoro specificato, si utilizzare il metodo Sheets.Add, che diventa anche il foglio attivo con questa sintassi: SheetsObject.Add(Before, After, Count, Type) . I nomi di default dei fogli sono Foglio1, Foglio2 etc. in ordine da sinistra a destra e tutti gli argomenti sono opzionali. Si utilizza l’argomento Before per specificare il foglio prima del quale si desidera aggiungere il nuovo foglio, mentre si utilizza l'argomento After per specificare il foglio dopo il quale si desidera aggiungere il nuovo foglio. L’argomento Count specifica il numero di fogli che si desidera aggiungere, di default è uno, mentre si utilizza l’argomento Type per specificare un valore costante o (costante XlSheetType) che indica il tipo di foglio da aggiungere che possono essere: XlSheetType, xlWorksheet, xlChart, xlExcel4MacroSheet, xlExcel4IntlMacroSheet o xlDialogSheet. Esempi di aggiunta di un foglio:

Utilizzando il metodo Add senza specificare alcun argomento, si aggiunge un nuovo foglio di lavoro prima del foglio attivo e se gli argomenti Before e After vengono omessi il valore predefinito dell’argomento Count è 1
Codice:
ActiveWorkbook.Worksheets.Add
Utilizzando il metodo Add e specificando l’argomento After, si aggiunge un nuovo foglio dopo il foglio di lavoro denominato Foglio2
Codice:
ActiveWorkbook.Worksheets.Add After: = Worksheets ("Foglio2")
Utilizzando il metodo Add e specificando i due argomenti After e Count, si aggiungono 3 nuovi fogli di lavoro dopo il foglio di lavoro Foglio2
Codice:
ActiveWorkbook.Worksheets.Add After: = Worksheets ("Foglio2"), Count: = 3
Utilizzando il metodo Add e specificando i due argomenti After e Count, si aggiungono 2 nuovi fogli di lavoro dopo il foglio di lavoro denominato Foglio2
Codice:
ActiveWorkbook.Worksheets.Add, Worksheets ("Foglio2"), 2
Utilizzando il metodo Add e specificando i due argomenti Before e Count, si aggiungono 2 nuovi fogli di lavoro prima del foglio di lavoro denominato Foglio2
Codice:
ActiveWorkbook.Worksheets.Add Worksheets ("Foglio2"), 2
Nomi di fogli predefiniti
Abbiamo visto poco sopra come creare una nuova cartella di lavoro utilizzando il metodo Workbooks.Add (riferito all'oggetto Workbooks) e a meno che non si specifichi un file Excel come modello per la nuova cartella di lavoro, il metodo Add creerà una nuova cartella di lavoro di Excel con il default di tre fogli bianchi, in cui il numero predefinito di fogli può essere modificato utilizzando la proprietà Application.SheetsInNewWorkbook. I tre fogli bianchi avranno di default i nomi Foglio1, Foglio2 e Foglio3, in ordine da sinistra a destra.

Si utilizza la proprietà Name dell'oggetto Worksheet ( Worksheet.Name) per impostare o restituire il nome di un foglio di lavoro Sintassi: WorksheetObject.Name. Alcuni esempi di utilizzo della proprietà Nome:

Restituisce il nome del primo foglio di lavoro nella cartella di lavoro attiva
Codice:
MsgBox ActiveWorkbook.Worksheets (1). Name
Attivare il foglio di lavoro denominato Foglio1 della cartella di lavoro attiva
Codice:
ActiveWorkbook.Worksheets ("Foglio1"). Activate
Modificare il nome del foglio di lavoro denominato Foglio1 nella cartella di lavoro attiva prova1
Codice:
ActiveWorkbook.Worksheets ("Foglio1"). Name = "prova1"
Utilizzando il metodo Add e specificando l’argomento Before si aggiunge un nuovo foglio di lavoro prima del foglio di lavoro Foglio2, e utilizzando la proprietà Name, si rinomina il nuovo foglio di lavoro pippo
Codice:
ActiveWorkbook.Worksheets.Add (Before: = Worksheets ("Foglio2")). Name = "pippo"
Restituire i nomi di tutti i fogli (fogli di lavoro, grafici, fogli macro e fogli di dialogo) in ThisWorkbook
Codice:
Dim i As Integer 
For i = 1 To ThisWorkbook.Sheets.count 
MsgBox ThisWorkbook.Sheets (i). Name 
Next i
Restituire i nomi di tutti i fogli di lavoro (esclusi grafici, fogli macro e fogli di dialogo) nella cartella di lavoro attiva
Codice:
Dim ws As Worksheet 
For Each ws In ActiveWorkbook.Worksheets 
MsgBox ws.Name 
Next
Esempio: Aggiungere un nuovo foglio, e consultarlo utilizzando la sua variabile oggetto. Per utilizzare la variabile oggetto attraverso la procedura, verrà dichiarata pubblica (Public), nella prima linea del modulo.
Codice:
Sub foglio1()
Dim wsNew As Worksheet
Set wsNew = Worksheets.Add
wsNew.Name = "Pippo1"
'Riferimento al nuovo foglio - il nuovo foglio diventa il foglio attivo
Worksheets.Add
ActiveSheet.Name = "Pippo2"
End Sub
Copiare un foglio di lavoro
Si utilizza il metodo Worksheet.Copy per copiare un foglio di lavoro e posizionarlo, prima o dopo un altro foglio in una cartella di lavoro, o per creare una nuova cartella di lavoro contenente il foglio copiato utilizzando il metodo Sheets.Copy per copiare un foglio usando la seguente sintassi: WorksheetObject.Copy ( Before, After). Entrambi gli argomenti Before e After sono opzionali, ed è possibile specificare solo uno alla volta di questi e questi argomenti fanno riferimento al foglio prima o dopo dove il foglio copiato sarà posto, e omettendo entrambi gli argomenti si creerà una nuova cartella di lavoro contenente il foglio copiato. È possibile copiare un foglio di lavoro in una posizione all'interno della stessa cartella di lavoro o in un'altra cartella di lavoro.

Copiare il foglio denominato Foglio1 e posizionarlo nella cartella attiva prima di Foglio3
Codice:
Worksheets ("Foglio1"). Copy Before: = Sheets ("Foglio3")
Copiare il foglio denominato Foglio1 e posizionarlo nella cartella attiva dopo il Foglio3
Codice:
Worksheets ("Foglio1"). Copy After: = Sheets ("Foglio3")
Copiare Foglio1 dalla cartella di lavoro attiva e metterlo prima del foglio pippo nella cartella prova.xlsm
Codice:
Worksheets ("Foglio1"). Copy Before: = Workbooks ("prova.xlsm"). Sheets ("pippo")
Copiare Foglio1 dalla cartella attiva in una nuova cartella di lavoro
Codice:
Worksheets ("Foglio1"). Copy
Spostare o Cambiare Sequenza al foglio
Si utilizza il metodo Worksheet.Move per spostare un foglio di lavoro e posizionarlo, prima o dopo un altro foglio in una cartella di lavoro, o per creare una nuova cartella di lavoro contenente il foglio spostato (si utilizza il metodo Sheets.Move per spostare un foglio) con questa sintassi: WorksheetObject.Move ( Before, After). Entrambi gli argomenti Before e After sono opzionali, ed è possibile specificare solo uno di questi alla volta, inoltre questi argomenti fanno riferimento al foglio prima o dopo dove verrà inserito il foglio spostato, e omettendo entrambi gli argomenti si creerà una nuova cartella di lavoro contenente il foglio spostato. È possibile spostare un foglio di lavoro in una posizione all'interno della stessa cartella di lavoro o ad un'altra cartella di lavoro e lo spostamento di un foglio di lavoro modifica la sequenza dei fogli di lavoro, nelle schede che appaiono in una cartella di lavoro, ma non in Esplora progetti in VBE.

Spostare foglio denominato Foglio1 nella cartella attiva e posizionarlo prima del Foglio3
Codice:
Worksheets ("Foglio1"). Move Before: = Sheets ("Foglio3")
Spostare foglio denominato "Foglio1" nella cartella attiva e posizionarlo dopo il "Foglio3"
Codice:
Worksheets ("Foglio1"). Move After: = Sheets ("Foglio3")
Spostare il Foglio1 dalla cartella di lavoro attiva e metterlo prima del foglio pippo nella cartella prova.xlsm
Codice:
Worksheets ("Foglio1"). Move Before: = Workbooks ("prova.xlsm"). Sheets ("pippo")
Spostare il Foglio1 dalla cartella attiva, e verrà creata una nuova cartella di lavoro che contiene il foglio spostato
Codice:
Worksheets ("Foglio1"). Move
Nascondere o rendere visibile un foglio di lavoro
Per nascondere un foglio di lavoro o per renderlo visibile si utilizzare la proprietà Worksheet.Visible (Sheets.Visible), utilizzando semplicemente il codice Worksheets ("Foglio1"). Visible = False per nascondere e Worksheets ("Foglio1"). Visible = True per renderlo visibile. L' enumerazione
  • XlSheetVisibility viene utilizzata per impostare o restituire un valore che indica se il foglio è visibile o nascosto
  • xlSheetHidden si nasconde un foglio di lavoro
  • xlSheetVeryHidden si nasconde un foglio di lavoro che può essere reso visibile solo attraverso codice VBA
  • xlSheetVisible si renderà visibile il foglio.
Esempio: Utilizzare i metodi per nascondere, rendere visibile o rendere molto nascosto il foglio denominato Foglio1
Codice:
Sub nascondi1()
'Nasconde il foglio denominato Foglio1
Worksheets("Foglio1").Visible = False
'Restituisce il valore 0, che indica che Foglio1 è nascosto
MsgBox Worksheets("Foglio1").Visible
'Rende visibile Foglio1
Worksheets("Foglio1").Visible = True
'Restituisce il valore -1, che indica che Foglio1 è visibile 
MsgBox Worksheets("Foglio1").Visible
'Rende Foglio1 molto nascosto
Worksheets("Foglio1").Visible = 2
'Restituisce il valore 2, Foglio1 è molto nascosto
MsgBox Worksheets("Foglio1").Visible
'Rende visibile Foglio1
Worksheets("Foglio1").Visible = xlSheetVisible
'Restituisce il valore -1, che indica che Foglio1 è visibile 
MsgBox Worksheets("Foglio1").Visible
End Su
Esempio: Nascondere tutti i fogli tranne l'ultimo, tenendo presente che tutti i fogli in una cartella di lavoro non possono essere nascosti
Codice:
Sub nascondi2()
    Dim oSh As Object, i As Long
Sheets(Sheets.Count).Visible = True
For i = 1 To Sheets.Count - 1
Sheets(i).Visible = xlSheetHidden
Next i
For Each oSh In Sheets
oSh.Visible = xlSheetVisible
Next
End Sub
Rimuovere o eliminare fogli
Si utilizzare il metodo Worksheet.Delete per eliminare o rimuovere un foglio di lavoro in una cartella di lavoro (Sheets.Delete) con la seguente sintassi: WorksheetObject.Delete e usando questo metodo verrà visualizzata una finestra di dialogo che chiede all'utente di confermare o annullare l'eliminazione. Con l’impostazione della proprietà Application.DisplayAlerts a False non verrà visualizzata nessuna richiesta o avviso e in questo caso una risposta predefinita sarà scelta da Excel. Questa proprietà viene ripristinata al valore predefinito (True) dopo che la procedura è termina. Utilizzare il codice Application.DisplayAlerts = False per eliminare un foglio di lavoro senza visualizzare nessun avviso

Cancellare il Foglio1 nella cartella di lavoro attiva, senza visualizzare nessun avviso
Codice:
Application.DisplayAlerts = False 
Sheets ("Foglio1"). Delete
Fogli di lavoro e Layout di pagina
Vediamo ora brevemente alcune opzioni per il layout di pagina di un foglio di lavoro, e come personalizzare le viste della cartelle di lavoro. Per le impostazioni di pagina di un foglio di lavoro si utilizza la proprietà Worksheet.PageSetup che si occupa degli attributi della pagina per il foglio di lavoro come l’orientamento, i margini, le dimensioni della carta, e così via. Usando la proprietà PageSetup restituisce un oggetto PageSetup e gli attributi sono impostati come proprietà dell'oggetto cioè Orientaton, PrintArea, LeftMargin, RightMargin, etc che sono le proprietà dell'oggetto PageSetup. Vedere il seguente esempio sull'utilizzo di queste proprietà per impostare gli attributi della pagina.

Codice:
Sub setup_pagina()
‘impostare gli attributi e poi stampare il foglio
With Worksheets("Foglio3")
 ‘impostare le proprietà dell'oggetto PageSetup
With .PageSetup
.PrintTitleRows = Rows(1).Address
.Orientation = xlLandscape
.Zoom = 90
.PrintArea = "$D$1:$R$50"
'inserire il numero di pagina nell'intestazione e alllineato al centro 
.CenterHeader = "&P"
'Imposta il primo numero di pagina da utilizzare durante la stampa del foglio di lavoro
.FirstPageNumber = 2
.PaperSize = xlPaperA4
.LeftMargin = Application.InchesToPoints(0.25)
.RightMargin = Application.InchesToPoints(0.5)
.TopMargin = Application.InchesToPoints(1)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.25)
'Visualizza la griglia delle celle quando il foglio viene stampato
.PrintGridlines = True
End With
 ‘stampa il foglio
.PrintOut
End With
End Sub
E’ possibile visualizzare un'anteprima di come il foglio di lavoro verrà stampato utilizzando il metodo Worksheet.PrintPreview che presenta questa sintassi: WorksheetObject.PrintPreview (EnableChanges). E’ facoltativo specificare l'argomento EnableChanges, che accetta un valore booleano (il valore predefinito è True), per consentire o non consentire all'utente di modificare le opzioni di impostazione della pagina (es. orientamento della pagina, il ridimensionamento, i margini, etc) disponibili in anteprima di stampa. È inoltre possibile applicare il metodo PrintPreview a un oggetto cartella di lavoro o a un oggetto Range, per visualizzare un'anteprima di come verrà eseguita la stampa. Esempio - PrintPreview

Codice:
Sub anteprima()
'Visualizzare un’anteprima di stampa del foglio attivo della cartella di lavoro "prova.xlsm, 
 ‘non consentendo all'utente di cambiare le opzioni di pagina disponibili in anteprima di stampa
Workbooks("prova.xlsm").PrintPreview EnableChanges:=False
'Visualizzare un’anteprima di stampa del Foglio3 della cartella "prova.xlsm, permettendo 
 ‘all'utente di cambiare le opzioni di pagina disponibili in anteprima di stampa. 
Workbooks("prova.xlsm").Worksheets("Foglio3").PrintPreview EnableChanges:=True
End Sub
Inoltre utilizzando la proprietà Worksheet.DisplayPageBreaks è possibile visualizzare sia le interruzioni di pagina automatiche che manuali su un foglio di lavoro.Questa è un'impostazione booleana che può essere impostata solo se è installata una stampante e con il codice ActiveSheet.DisplayPageBreaks = True verranno visualizzate le interruzioni di pagina sul foglio attivo. Si utilizza la proprietà Window.View, per impostare o restituire una cartella di lavoro (foglio di lavoro attivo) come verrà mostrata nella finestra, utilizza questa sintassi: WindowObject.View. Si possono avere tre impostazioni per questa struttura:
  • xlNormalView (valore 1)
  • xlPageBreakPreview (valore 2)
  • xlPageLayoutView (valore 3)
che rispettivamente sono le visualizzazioni della cartella di lavoro defenite 'Normale', 'Layout di pagina' e 'interruzione di pagina'. Vedi sotto esempio

Codice:
Sub vista1()
'Attivare il foglio di lavoro
Worksheets("Foglio3").Activate
With ActiveSheet
'Utilizzando la proprietà Range.PageBreak, si imposta la posizione di un'interruzione manuale
.Rows(9).PageBreak = xlPageBreakManual
.Columns("G").PageBreak = xlPageBreakManual
With .PageSetup
.Orientation = xlPortrait
.Zoom = 100
.PrintArea = "$A$1:$L$17"
'Numero di pagina da stampare allineata al centro nell'intestazione
.CenterHeader = "&P"
.FirstPageNumber = 1
End With
End With
ActiveWindow.View = xlPageBreakPreview
'Reset alla visualizzazione normale
ActiveSheet.Rows(9).PageBreak = xlPageBreakNone
ActiveSheet.Columns("G").PageBreak = xlPageBreakNone
ActiveSheet.DisplayPageBreaks = False
'l’Intero foglio diventa l'area di stampa
ActiveSheet.PageSetup.PrintArea = ""
'Impostare la visualizzazione normale
ActiveWindow.View = xlNormalView 
'Impostare la visualizzazione Layout di pagina
ActiveWindow.View = xlPageLayoutView
End Sub
Nascondere la barra della formula
Codice:
Application.DisplayFormulaBar = False
Impostare Excel in modalità a schermo intero
Codice:
Application.DisplayFullScreen = True
Nascondere le intestazioni del foglio di lavoro
Codice:
ActiveWindow.DisplayHeadings = False
Nascondere la visualizzazione della griglia in un foglio di lavoro
Codice:
ActiveWindow.DisplayGridlines = False
Blocca riquadri in un foglio di lavoro specificato
Codice:
Range ("C2"). Select 
ActiveWindow.FreezePanes = True
Spesso è possibile utilizzare i seguenti codici per togliere la barra della formula da tutti i fogli, o all'attivazione del foglio di lavoro, oppure in altri contesti sfruttando svariati eventi e metodi come si vede dagli esempi sotto riportati

Codice:
Private Sub Workbook_Activate ()
Application.DisplayFormulaBar = False
End Sub
 
Private Sub Workbook_Deactivate ()
Application.DisplayFormulaBar = True
End Sub
 
Private Sub Workbook_Open ()
Dim ws As Worksheet, wn As Window
For Each ws In ActiveWorkbook.Worksheets
ws.activate
For Each wn In ActiveWorkbook.Windows
wn.DisplayHeadings = False
Next
Next
Sheets("Foglio1").Activate
End Sub
Calcolo nei Fogli di lavoro
La proprietà Application.Calculation restituisce o imposta la modalità di calcolo di Excel e dispone di 3 impostazioni:
  • xlCalculationAutomatic - (Default) ricalcolo automatico come i dati vengono immessi nelle celle
  • xlCalculationSemiautomatic - Ricalcolo automatico ad eccezione delle tabelle di dati
  • xlCalculationManual - Il calcolo viene fatto solo quando richiesto dall'utente facendo clic su "Calcola ora" o "Calcola foglio" o premendo F9, oppure con codice VBA.

Impostare la modalità di calcolo manuale:
Codice:
Application.Calculation = xlCalculationManual
Si applicare il metodo Calculate a un oggetto foglio per calcolare un foglio di lavoro specifico in una cartella di lavoro, oppure si può applicare questo metodo a un oggetto Application per calcolare tutte le cartelle di lavoro aperte, oppure è possibile applicare questo metodo a un intervallo di celle di un foglio di lavoro.

Metodo Calcola applicabile all'oggetto Application, calcola tutte le cartelle che sono aperte
Codice:
Application.Calculate
Calculate
Metodo Calcola applicabile all'oggetto foglio di lavoro; calcolare un foglio di lavoro denominato Foglio1
Codice:
Application.Worksheets ("Foglio1"). Calculate
Worksheets ("Foglio1"). Calculate
Metodo Calcola applicabile all'intervallo di celle specificato in un foglio di lavoro
Codice:
Worksheets ("Foglio1"). Range ("A5: B6"). Calculate
Calcolare l'intera colonna (colonna A) in un foglio di lavoro
Codice:
Worksheets ("Foglio1"). Columns (1). Calculate
Calcola celle non contigue nel foglio di lavoro attivo
Codice:
Range ("A5, A6, B7, B20"). Calculate
In Excel, la modalità di calcolo predefinita è la Modalità Automatica (Application.Calculation = xlCalculationAutomatic), in cui Excel calcola automaticamente ogni cella come si entra nel foglio, quando Excel è in modalità manuale (Application.Calculation = xlCalculationManual), il calcolo viene effettuato solo quando richiesto dall'utente, facendo clic su "Calcola Ora" o premendo F9 o cambiando la modalità di calcolo. In modalità automatica, per ciascun nuovo valore immesso da una macro, Excel ricalcolerà tutte le celle interessate dal nuovo valore rallentando notevolmente l'esecuzione del codice VBA, soprattutto nel caso di grandi macro i cui calcoli sono significativi. Per accelerare una macro e rendere l'esecuzione più veloce ed efficiente, è tipico disattivare il calcolo automatico all'inizio della macro e ricalcolare il foglio di lavoro specifico utilizzando il metodo Calculate all'interno della macro. Il seguente esempio disattiva gli aggiornamenti dello schermo e i calcoli automatici e utilizza il metodo Calculate, durante l'esecuzione del codice VBA

Codice:
Sub Calcola()
'Disattivare Aggiornamenti schermo e calcoli automatici
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'Inserisci qui il tuo codice
'Utilizzare il metodo Calculate per calcolare tutte le cartelle di lavoro aperte
Application.Calculate
'Attivare gli aggiornamenti dello schermo e calcoli automatici
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
A volte si può impostare la proprietà Application.CalculateBeforeSave a True per calcolare le cartelle di lavoro prima di salvarle su disco se la struttura di calcolo è stata impostata su manuale specificando xlCalculationManual. La proprietà CalculateBeforeSave accetta valori booleani (Ture o False) e non è influenzata dalla modifica della proprietà di calcolo. In questo caso

Codice:
Application.Calculation = xlCalculationManual 
Application.CalculateBeforeSave = True
Si imposta la proprietà Worksheet.EnableCalculation a True, per ricalcolare automaticamente il foglio di lavoro quando questa proprietà è impostata su False, Excel non ricalcola il foglio, e quando l'impostazione viene modificata da False a True, Excel esegue il ricalcolo. Si noti che questa proprietà non viene mantenuta quando la cartella di lavoro viene chiusa, e tornerà al suo valore predefinito (True) per l'apertura della cartella di lavoro e, quindi, sarà necessario resettare con il codice VBA ogni volta che si apre la cartella di lavoro. Per controllare i calcoli per ogni foglio di lavoro, è possibile impostare la proprietà EnableCalculation a False per i fogli di lavoro che non si desidera calcolare, e quindi impostare la proprietà Application.Calculation a xlCalculationAutomatic. Si noti che l'esecuzione del metodo Calculate su un foglio di lavoro per il quale la proprietà EnableCalculation è impostata su False, non calcolerà tale foglio di lavoro. Il seguente codice calcola automaticamente tutti i fogli tranne Foglio1

Codice:
Worksheets ("Foglio1"). EnableCalculation = False 
Application.Calculation = xlCalculationAutomatic
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Vecchio 28-06-2014, 15.44.30   #45
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Le Funzioni Left, Right, Mid, Len e Replace




In VBA una stringa si riferisce ad una sequenza di caratteri adiacenti all'interno di virgolette vale a dire, "Questa è un'espressione stringa racchiusa tra virgolette, in VBA." Questi caratteri sono letteralmente interpretati come caratteri, nel senso che questi rappresentano i personaggi stessi piuttosto che i loro valori numerici. Una stringa può includere lettere, numeri, spazi e punteggiatura e un’espressione stringa può avere come suoi elementi - una stringa di caratteri adiacenti, una funzione che restituisce una stringa, una variabile stringa, una stringa costante o una variante stringa.


La Funzione LEFT
La funzione Left in Excel può essere utilizzata sia come funzione di foglio che come una funzione VBA e restituisce il numero specificato di caratteri di una stringa di testo, a partire dal primo carattere più a sinistra. Si può utilizzare questa funzione per estrarre una sotto-stringa iniziando dalla parte sinistra di una stringa di testo usando la seguente sintassi:

LEFT (text_string, char_numbers)

È necessario menzionare l’argomento text_string che rappresenta la stringa di testo da cui si desidera estrarre il numero specificato di caratteri. L’argomento char_numbers è facoltativo quando si usa come una funzione del foglio di lavoro, che specifica il numero di caratteri da estrarre dalla stringa di testo, ricorda che il valore char_numbers deve essere uguale o maggiore di zero, se è maggiore della lunghezza della stringa di testo, la funzione LEFT restituirà la stringa di testo integralmente e se viene omesso, riporterà il valore predefinito che è pari a 1. Se invece si utilizza come una funzione VBA, è necessario specificare gli argomenti, e se text_string contiene Null, (cioè stringa vuota) la funzione restituisce una stringa vuota.


La Funzione RIGHT
La funzione Right in Excel può essere utilizzata sia come funzione di foglio che come una funzione VBA e restituisce il numero specificato di caratteri di una stringa di testo, a partire dall'ultimo carattere più a destra. Si può utilizzare questa funzione per estrarre una sotto-stringa iniziando dalla parte destra di una stringa di testo usando la seguente sintassi:

RIGHT (text_string, char_numbers)

È necessario inserire l’argomento text_string che rappresenta la stringa di testo da cui si desidera estrarre il numero specificato di caratteri. L’argomento char_numbers è facoltativo quando si usa come una funzione del foglio di lavoro, che specifica il numero di caratteri da estrarre dalla stringa di testo, tenendo presente che il valore char_numbers deve essere uguale o maggiore di zero, se è maggiore della lunghezza della stringa di testo, la funzione RIGHT restituirà la stringa di testo integralmente, mentre se viene omesso, verrà utilizzato il valore predefinito che è pari a 1. Se invece si utilizza come una funzione VBA, è necessario specificare gli argomenti, e se text_string contiene Null (cioè una stringa vuota), la funzione restituisce una stringa vuota


La Funzione MID
La funzione Mid può essere utilizzata sia come funzione di foglio che come una funzione VBA e restituisce il numero specificato di caratteri di una stringa di testo, a partire da una posizione specificata, cioè a partire da un numero di caratteri specificato. Si può utilizzare questa funzione per estrarre una sotto-stringa iniziando da qualsiasi parte di una stringa di testo usando la seguente Sintassi:

MID (text_string, start_number, char_numbers)

L’argomento text_string indica la stringa di testo da cui si desidera estrarre il numero specificato di caratteri, mentre l’argomento start_number specifica il numero di caratteri da cui iniziare l'estrazione della sotto stringa, dove il primo carattere della stringa di testo deve essere indicato dal valore di start_number e incrementando verso destra di 1, mentre l’argomento char_numbers specifica il numero di caratteri da estrarre dalla stringa di testo.

Se start_number è maggiore della lunghezza della stringa di testo, viene restituita una stringa vuota (lunghezza zero), mentre se è minore della lunghezza della stringa di testo ma con un valore di char_numbers maggiore della lunghezza della stringa di testo, la funzione MID restituirà la stringa di testo integralmente dalla posizione start_number fino alla fine della stringa di testo.

Quando la funzione MID viene usata come una funzione nel foglio di lavoro e se viene specificato un valore negativo per char_numbers, MID restituirà il valore di errore (numero di errore), come pure start_number, se viene posto inferiore a 1, MID restituirà il valore di errore. Quando si utilizza come una funzione del foglio di lavoro, tutti gli argomenti devono essere specificati. Quando invece la funzione MID viene usata come una funzione VBA, l'argomento char_numbers è facoltativo e se viene omesso la funzione restituisce la stringa di testo per intero dalla posizione start_number alla fine della stringa di testo e tutti gli altri argomenti devono essere specificati, inoltre se text_string contiene una stringa vuota (Null), la funzione restituisce una stringa vuota.


La Funzione LEN
La funzione Len può essere utilizzata sia come funzione di foglio che come una funzione VBA e restituisce il numero di caratteri di una stringa di testo. Si utilizzare questa funzione per ottenere la lunghezza di una stringa di testo con questa sintassi:

LEN (text_string)

ed è necessario menzionare l’argomento text_string che corrisponde alla stringa di testo di cui si desidera conoscerne la lunghezza espressa in numero di caratteri, si noti che vengono contati come caratteri anche gli spazi vuoti. Mentre usando LEN come una funzione VBA con la sintassi: Len (text_string) o Len (variable_name), è possibile utilizzare una stringa di testo o un nome di una variabile e la funzione restituisce un valore Long che rappresenta il numero di caratteri contenuti nella stringa o il numero di byte necessari per memorizzare una variabile. Utilizzando la funzione Len per una variabile di tipo Variant, VBA tratterà la variabile come una stringa e restituisce il numero di caratteri contenuti nella stessa. Si tenga presente che se l’argomento text_string o la variabile utilizzata contiene una stringa vuota (Null), anche il valore di ritorno sarà una stringa vuota.

Esempio delle funzioni Left, Right, Mid e Len
Codice:
Sub prova1()
Dim str As String, strL As String, strR As String, strM As String
str = "Bepi Rua"
strL = Left(str, 7)
'Restituisce "Bepi Ru", che sono i primi 7 caratteri
MsgBox strL
strL = Left(str, 15)
'Restituisce "Bepi Rua", che sono tutti caratteri, perché il valore 15 specificato supera la lunghezza della stringa
MsgBox strL
strR = Right(str, 7)
'Restituisce "epi Rua", che sono gli ultimi 7 caratteri (lo spazio è contato come un carattere) 
MsgBox strR
strR = Right(str, 15)
'Restituisce "Bepi Rua", che sono tutti caratteri, perché il valore 15 specificato supera la lunghezza della stringa
MsgBox strR
strM = Mid(str, 2, 6)
'Restituisce "epi Ru". Inizia dal secondo carattere “e” poi specifica 6 caratteri restituiti a partire da "e"
MsgBox strM
strM = Mid(str, 2, 15)
'Restituisce "epi Rua". Restituisce tutti i caratteri a partire dal secondo carattere "e", 
’ perché i caratteri specificati più il numero di partenza 2 superano la lunghezza della stringa
MsgBox strM
strM = Mid(str, 2)
'Restituisce "epi Rua". Restituisce tutti i caratteri a partire dal secondo carattere "e", 
’ perché il secondo argomento (char_numbers) viene omesso
MsgBox strM
strM = Mid(str, 12, 2)
'Restituisce una stringa vuota perché il numero di partenza 12 supera la lunghezza della stringa
MsgBox strM
'Restituisce 8, la lunghezza della stringa misurata dal numero di caratteri
MsgBox Len(str)
'Restituisce 8, la lunghezza della stringa misurata dal numero di caratteri. 
MsgBox Len("Bepi Rua")
End Sub
Esempio della funzione Len con le variabili
Codice:
Sub prova2()
'Restituisce 6 in entrambi i casi il numero di caratteri delle 2 stringhe
MsgBox Len("grande")
MsgBox Len("123456")
'Restituisce 11 il numero di caratteri della stringa incluso lo spazio
MsgBox Len("Roby Baggio")
'Una variabile di tipo variant viene trattata come una stringa
Dim vVar As Variant
vVar = 125
'restituisce 2, indicando una variabile di tip Integer
MsgBox VarType(vVar)
'Restituisce 3, il numero di caratteri contenuti nella variabile
MsgBox Len(vVar)
'variabile di tipo stringa
Dim strVar As String
strVar = "Roby Baggio"
 ‘ritorna 8, indicando una variabile di tipo String
MsgBox VarType(strVar)
'Restituisce 11, il numero di caratteri contenuti nella variabile di tipo String
MsgBox Len(strVar)
 ‘variabile di tipo integer
Dim iVar As Integer
iVar = 124
'Restituisce 2, il numero di byte utilizzati per memorizzare la variabile
MsgBox Len(iVar)
 ‘variabile di tipo long 
Dim lVar As Long
lVar = 145
'Restituisce 4, il numero di byte utilizzati per memorizzare la variabile
MsgBox Len(lVar)
 ‘variabile di tipo single
Dim sVar As Single
sVar = 245.567
'Restituisce 4, il numero di byte utilizzati per memorizzare la variabile
MsgBox Len(sVar)
 ‘variabile di tipo double
Dim dVar As Double
dVar = 245.567
'Restituisce 8, il numero di byte utilizzati per memorizzare la variabile
MsgBox Len(dVar)
End Sub
Esempio delle funzioni LEN e MID, per determinare i caratteri che compaiono in posizioni dispari in una stringa di testo
Codice:
Sub prova3()
Dim str As String, i As Integer
str = ActiveSheet.Range("A2")
 For i = 1 To Len(str)
'Controllare le posizioni dispari
If i Mod 2 = 1 Then
'Carattere di ritorno alla posizione dispari
MsgBox Mid(str, i, 1)
End If
Next
End Sub
Esempio delle funzioni LEFT, LEN e MID, per restituire le iniziali da una stringa di testo contenente una frase composta da più parole considerando una stringa contenente il nome, il cognome, lo stato e l’occupazione con spazi e restituire le iniziali del parole seguite da un punto e uno spazio.
Codice:
Sub prova4() 
Dim Snome As String, iniz As String, i As Integer
'Stringa di testo in cui fare la ricerca
Snome = "   Maria Stuarda regina     Scozia"
'Se il primo carattere non è uno spazio vuoto, sarà una iniziale
For i = 1 To Len(Snome)
If i = 1 Then
If Left(Snome, i) <> " " Then
iniz = Left(Snome, 1) & "."
End If
Else
'Eventuale carattere dopo il primo carattere, se è preceduto da uno spazio, sarà una iniziale
If Mid(Snome, i - 1, 1) = " " And Mid(Snome, i, 1) <> " " Then
'Per la prima iniziale
If Len(iniz) < 1 Then
iniz = Mid(Snome, i, 1) & "."
'Per più iniziali
Else
'Per più iniziali, aggiungere alla iniziale precedente
iniz = iniz & " " & Mid(Snome, i, 1) & "."
End If
End If
End If
Next i
 ‘Convertire tutte le iniziali in maiuscolo
iniz = UCase(iniz)
'Restituisce "M. T. R. S." 
MsgBox iniz
'Restituisce 11-4 lettere, 4 punti e 3 spazi
MsgBox Len(iniz)
End Sub
La Funzione Replace
La funzione Replace in vba viene utilizzata per restituire una stringa in cui una sottostringa specificata viene sostituita, un determinato numero di volte, con un'altra sottostringa,la sintassi è la seguente:

Replace (expression, find, replace, start, count, compare)

è necessario specificare gli argomenti di expression, find e replace, mentre start, count e compare sono argomenti opzionali.

L'argomento expression (espressione) è la stringa che viene sostituita da una stringa specifica, si ricordi che per un valore di expression con lunghezza zero viene restituita una stringa di lunghezza zero, e per un'espressione Null la funzione darà un errore, mentre l’argomento Find specifica la stringa che deve essere sostituita e se il valore di Find è una stringa di lunghezza zero, allora viene restituita una copia di expression. L’argomento Replace specifica la stringa di sostituzione), notare che la stringa di sostituzione se ha lunghezza zero ha l'effetto di eliminare tutte le occorrenze dell’espressione Find e l’argomento Start specifica la posizione (cioè il numero di caratteri) nell'espressione da cui si desidera iniziare la ricerca della sottostringa specificata in Find. Se questo argomento viene omesso, per impostazione predefinita assume il valore 1 (cioè la ricerca partirà dalla prima posizione del carattere) e la stringa restituita dalla funzione Replace inizia da questa posizione di partenza fino all'ultimo carattere della stringa di expression.

Specificando una posizione di partenza che è maggiore della lunghezza dell'espressione, verrà restituita una stringa di lunghezza zero. L’argomento Count specifica il numero di sostituzioni che si desidera fare, omettendo di specificare questo valore per default assumerà il valore -1, che farà tutte le possibili sostituzioni e specificando zero per l’argomento Count avrà l'effetto di non effettuare nessuna sostituzione e restituirà una copia dell'espressione. L’argomento Compare specifica il tipo di confronto da utilizzare per la valutazione delle sottostringhe, può essere un valore numerico o una costante.

È possibile specificare i seguenti argomenti per l’argomento Compare:
  • vbUseCompareOption (valore: -1) che esegue un confronto utilizzando l'impostazione di Option Compare
  • vbBinaryCompare (valore: 0) esegue un confronto binario tra le stringhe basato su un ordinamento binario.
  • vbTextCompare (valore: 1) esegue un confronto testuale tra le stringhe che non si basano su un ordinamento testuale case-sensitive
  • vbDatabaseCompare (valore: 2) esegue un confronto basato sui dati di un database.
Se non si specifica l'argomento Compare, il confronto viene fatto sulla base Option definito nella dichiarazione, cioè l’istruzione Option Compare può essere Option Compare Binary oppure Option Compare Text e per essere utilizzato deve essere impostato il metodo di confronto specificando specificando 'Option Compare Binary' o 'Option Compare Text' a livello di modulo, prima di qualsiasi altra procedura. Se l'Istruzione Option Compare non è specificato, il metodo di confronto testo predefinito è Binary.

Esempio: Come utilizzare la funzione Replace
Codice:
Sub sostituisci1()
    Dim str As String, strF As String, strR As String
'Trovare tutte le occorrenze di "a" da sostituire 
strF = "s"
strR = ""
str = "Laura non c'è è Andata via!"
'Restituisce 27
MsgBox Len(str)
'Restituisce la stringa dopo l'eliminazione di tutte le occorrenze di' a’, notare che
’il valore A non viene rimosso
str = Replace(str, strF, strR)
MsgBox str
'Restituisce 22
MsgBox Len(str)
str = "Laura non c'è è Andata via!"
'Restituisce 27
MsgBox Len(str)
'Restituisce la stringa dopo l'eliminazione di tutte le occorrenze di' a ' notare che anche il carattere ‘A’
‘ anche il carattere ‘A’ viene sostituito perché il valore di confronto è vbTextCompare
str = Replace(str, strF, strR, , , 1)
MsgBox str
MsgBox Len(str)
'Restituisce 21
str = "Laura non c'è è Andata via!"
'Restituisce 27
MsgBox Len(str)
'Eliminazione di tutte le occorrenze di' a ' notare che il numero di caratteri 
’6 è uno spazio vuoto e viene restituito. 
'La stringa restituita dalla funzione inizia dalla posizione di partenza fino all'ultimo 
’carattere della stringa di espressione. 
str = Replace(str, strF, strR, 6)
MsgBox str
'Restituisce 16
MsgBox Len(str)
str = "Laura non c'è è Andata via!"
'Restituisce 27
MsgBox Len(str)
'Specifica una posizione di partenza che è maggiore della lunghezza dell'espressione, 
’restituirà una stringa di lunghezza zero. 
str = Replace(str, strF, strR, 28)
'Restituisce una stringa di lunghezza zero
MsgBox str
'restituisce 0: 
MsgBox Len(str)
str = "Laura non c'è è Andata via!"
'Restituisce 27
MsgBox Len(str)
str = Replace(str, strF, strR, 8, 2)
MsgBox str
MsgBox Len(str)
End Sub
Esempio: Sostituire tutte le occorrenze di una stringa in un'espressione stringa con un'altra stringa
Codice:
Function sostituisci2(var As Variant, varF As Variant, varR As Variant, optI As Integer) As Variant
    Dim posF As Integer
'Posizione della prima occorrenza di varFind, entro var 
posF = InStr(var, varF)
'Se posF non viene trovato all'interno var 
If posF < 1 Then
'restituisce var
sostituisci2 = var
Else
'Sostituire tutte le istanze di varF
sostituisci2 = Replace(var, varF, varR, , , optI)
End If
End Function

Sub cambia()
Dim var As Variant, varF As Variant, varR As Variant, optI As Integer
'var è la stringa all'interno della quale varF viene cercato e sostituito 
var = "Laura non c’è è Andata via!"
'varF è la stringa da cercare all'interno di var e che sarà sostituito
varF = "a"
'varR è la stringa che sostituisce tutte le istanze di varF entro var
varR = "?"
'Per eseguire un confronto binario (case-sensitive),  si utilizza il valore 0 (optI=0) 
'Per eseguire un confronto di testo (case insensitive), si utilizza il valore 1
optI = 1
'Se var è Null, si esce
If IsNull(var) Then
MsgBox "Var è nullo, esco dalla procedura"
Exit Sub
'Se var non è Null
Else
'Se uno fra varF o varR sono Null o varFè una stringa di lunghezza zero
If IsNull(varF) Or IsNull(varR) Or varF = "" Then
'Ritorno var senza sostituzioni e esco dalla procedura
MsgBox var
Exit Sub
Else
'Se var, varF, varR non sono Null, eseguo la funzione di sostituire tutte le istanze di varF
MsgBox sostituisci2(var, varF, varR, optI)
End If
End If
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato  
Chiudi discussione


Utenti attualmente attivi che stanno leggendo questa discussione: 12 (0 utenti e 12 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
riserca del corso rene' Software applicativo 1 04-04-2008 10.30.22
Formare Gruppo di Studio a Napoli Scognamiglio Windows 7/Vista/XP/ 2003 0 14-02-2008 20.46.49
Corso su DVD di Tedesco Downloader Chiacchiere in libertà 17 26-01-2007 08.46.21
Win XP e corso di inglese che non va più Raboso Windows 7/Vista/XP/ 2003 8 11-11-2005 10.16.04
svendo corso Cisco alxdvc Internet e Reti locali 0 27-01-2005 12.03.45

Orario GMT +1. Ora sono le: 15.48.18.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.