|
| 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 » | |
01-06-2014, 10.50.35 | #31 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 Codice:
Workbooks(Workbooks.Count).Close SaveChanges:=True Codice:
MsgBox Workbooks(2).Name Codice:
Workbooks(2).PrintPreview Codice:
MsgBox Workbooks(Workbooks.Count).Name Codice:
Sub workbookNames() Dim i As Integer For i = 1 To Workbooks.Count msgbox Workbooks(i).Name Next i End Sub 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 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 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 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
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 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 Codice:
Workbooks ("prova.xlsx"). Close SaveChanges: = True 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 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 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 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 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 Codice:
Workbooks(Workbooks.Count).Close SaveChanges:=True Codice:
FileFormat: = xlOpenXMLWorkbookMacroEnabled 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 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 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 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 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 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" 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 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 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 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 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 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 Codice:
MsgBox ActiveWorkbook.ActiveSheet.Name 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 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 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 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 - |
02-06-2014, 11.16.56 | #32 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
#2
Introduzione agli Oggetti Il termine Excel Objects (collettivamente denominato Excel Object Model) fa riferimento alle entità che costituiscono una cartella di lavoro di Excel, come fogli di lavoro, righe, colonne, intervalli di celle e la stessa cartella di lavoro di Excel. Ogni oggetto in Excel ha delle proprietà, che sono memorizzate come parte di quell'oggetto. Ad esempio, le proprietà di un foglio di lavoro di Excel includono il nome del foglio, la protezione, la proprietà visibile, l'area di scorrimento, etc. pertanto, se durante l'esecuzione di una macro, volessimo nascondere un foglio di lavoro Excel, potremmo farlo accedendo all'oggetto Foglio di lavoro, e alterando la proprietà Visible. È possibile accedere ai principali oggetti di Excel dall'oggetto "Cartelle di lavoro", che è una raccolta di tutte le cartelle di lavoro attualmente aperte e ogni oggetto "Cartella di lavoro" contiene l'oggetto "Fogli" (costituito da tutti i fogli della cartella di lavoro) e, a sua volta, ciascun oggetto "Foglio di lavoro" contiene un oggetto "Righe" (composto da tutte le righe del foglio) e un oggetto "Colonne" (costituito da tutte le colonne del foglio), etc. E’ facile intuire che gli oggetti nel modello di programmazione di Excel sono organizzati in una gerarchia in quanto, come abbiamo appena visto, un oggetto può contenere un altro oggetto, e quell'oggetto può contenerne un altro ancora, ed il capostipite è Excel stesso, definito Application che contiene la cartella di lavoro WorkBook che a sua volta contiene il foglio di lavoro, WorkSheet che contiene le celle, Range. In sostanza l'oggetto Application contiene tutti i file che vengono creati (Workbook) e un file (Workbook) contiene tutti i fogli di lavoro (Worksheet) che si possono creare, i quali contengono l'oggetto Range che individua le celle. Fig. 1 Per lavorare con gli oggetti in VBA è essenziale per prima cosa, sapere come fare riferimento a loro durante la scrittura del codice VBA in quanto per iniziare a lavorare con un particolare oggetto VBA, si deve identificarlo con la seguente sintassi OGGETTO. Identificatore Un identificatore può essere uno dei tre tipi seguenti: 1. Proprietà 2. Metodo 3. Evento Simile agli oggetti fisici come un'auto o una sedia, gli oggetti dell'applicazione, come elencato sopra, hanno proprietà e metodi (così come eventi). Dalla sintassi sopra esposta (Oggetto.Identificatore) vediamo come fare riferimento ad un oggetto (per es. Range) passando attraverso l'intera gerarchia di oggetti VBA e questo è noto deve essere fatto come riferimento completo perché comunichi a Excel esattamente su quale oggetto si vuole lavorare facendo riferimento a tutti i suoi “genitori”. Di solito è possibile semplificare i riferimenti completi, tuttavia, si deve comprendere come funzionano. Sappiamo già che l'oggetto nella parte superiore della gerarchia degli oggetti VBA di Excel è Application, fare riferimento a questo oggetto è molto semplice, nel Visual Basic Editor, si fa il riferimento digitando: Application Da lì in poi, è necessario iniziare a spostarsi lungo la gerarchia utilizzando l'operatore punto (.) in altre parole, si collega ogni oggetto VBA a quello precedente (l'oggetto principale) usando un punto. Questi punti (.) vengono utilizzati per connettere e fare riferimento ai membri del modello di oggetti VBA di Excel "dall'alto verso il basso". Per vedere questo in pratica, supponiamo di voler fare riferimento a un oggetto Range, questo oggetto si trova nella parte inferiore della piramide gerarchica, si vede dalla Fig. 1 che ci sono 2 oggetti (WorkBook e WorkSheet) tra l’oggetto Application e l'oggetto Range, per cui se vogliamo fare riferimento al valore nella cella B5 possiamo usare una sintassi nel seguente formato: Application.Workbooks(“Prova.xlsx”).Worksheets(“Fo glio1”).Range(“B5”).Value Dove, Prova.xlsx è il file nome del file Excel che abbiamo aperto, e stiamo raggiungendo la cella B5 del Foglio 1. Va inoltre ricordato che in VBA l'oggetto Application è sempre assunto. Ciò significa che il nostro riferimento può essere scritto come: Workbooks(“Prova.xlsx”).Worksheets(“Foglio1”).Rang e(“B5”).Value Và ricordato che con Workbooks(“Prova.xlsx”) e Worksheets(“Foglio1”) si individuano rispettivamente la cartella e il foglio di lavoro (notare i loro nomi virgolettati dentro le parentesi) che abbiamo aperto. Si deve però tenere presente che un elemento può anche venire individuato tramite un indice, il quale può essere o il numero di ordine o il nome fra virgolette, per capire meglio il concetto di indice possiamo dire che la sintassi Workbooks(2) e Workbooks("prova.xlsx") puntano entrambe alla stessa cartella prova.xlsx a patto che questa sia la seconda fra quelle aperte contemporaneamente da Excel, infatti se abbiamo solo la cartella prova.xlsx aperta, la sintassi esatta diventa Workbooks(1). A questo punto è chiaro che l'indice che usiamo fra parentesi nell'oggetto Workbooks varia ed è strettamente legato al numero di cartelle aperte nel momento dell'esecuzione di questa istruzione, pertanto possiamo far notare che è possibile scrivere questa istruzione in tre diversi modi:
Si deve tenere presente che i membri più elevati, nel nostro caso WorkBook e WorkSheet si possono omettere quando sono attivi, per cui:
Poiché la proprietà Value viene considerata come proprietà predefinita, in questo caso possiamo anche creare un riferimento senza il riferimento e pertanto il tutto si può esprimere in un semplice: Range(“B5”) Si deve inoltre prestare attenzione alle proprietà "pluralistiche", le prime volte è facile scordarsi del plurale, scrivendo Workbook("prova.xlsx") anziché Workbooks("prova.xlsx") oppure Worksheet("Foglio1") invece di Worksheets("Foglio1"). Riassumendo abbiamo visto che ci sono tre elementi principali che un oggetto può avere. Questi sono
Come spiegato sopra, per manipolare un oggetto è possibile impostarne le proprietà e chiamarne i metodi. Per accedere alla proprietà di un oggetto si deve indicare il Nome dell’oggetto seguito dalla proprietà inserendo un punto tra di loro. Per esempio: Worksheets(1).Name restituisce il nome del primo foglio di lavoro Alcuni oggetti hanno proprietà predefinite, per esempio la proprietà di default dell'oggetto Range è Value e si può omettere di menzionare Value. In questo caso, utilizzare Range ("A1"). Value o solo Range ("A1") è lo stesso e restituirà il valore o il contenuto della cella A1. Per accedere al metodo di un oggetto, si usa la stessa sintassi delle proprietà, indicando il Nome dell’oggetto seguito dal Metodo inserendo un punto tra di loro. Per esempio: Worksheets(1).Activate attiva il primo foglio di lavoro chiamando il metodo Activate. Un metodo può avere argomenti che devono essere specificati e può avere argomenti facoltativi che è possibile omettere. Gli argomenti visualizzati tra parentesi quadre nella sintassi del metodo sono facoltativi mentre altri sono obbligator e possono essere forniti nell'ordine della posizione in cui sono definiti nella sintassi del metodo, separando il valore di ogni argomento con una virgola anche per gli argomenti facoltativi che potrebbero non essere specificati. In alternativa, gli argomenti possono essere forniti dal nome dell'argomento (indicato come argomenti con nome) nel qual caso la posizione in cui sono specificati diventa irrilevante. Gli oggetti hanno anche procedure di eventi ad essi collegate che sono azioni eseguite o occorrenze che attivano un codice VBA o una macro. Una procedura evento viene attivata quando si verifica un evento come apertura / chiusura / salvataggio / attivazione / disattivazione della cartella di lavoro, selezione di una cella o modifica della selezione di celle in un foglio di lavoro, modifica del contenuto di un foglio di lavoro cella, selezionando o attivando un foglio di lavoro, quando viene calcolato un foglio di lavoro e così via. Excel ha fornito la procedura di evento integrata- una procedura di evento viene automaticamente richiamata quando un oggetto riconosce il verificarsi di un evento. Le procedure degli eventi sono associate a oggetti come cartella di lavoro, foglio di lavoro, grafici, applicazione o controlli. Le Procedure evento vengono attivate da un evento predefinito e vengono installate in Excel con un nome standard e predefinito. come la procedura di modifica del foglio di lavoro è installata con il foglio di lavoro - "Private Sub Worksheet_Change (ByVal Target As Range)". Nella procedura evento Modifica foglio di lavoro, l'oggetto Foglio di lavoro è associato all'evento Modifica, il che significa che con l'evento di modifica del foglio di lavoro, una sotto procedura contenente codice personalizzato viene eseguita automaticamente quando si modifica il contenuto di una cella del foglio di lavoro. Eventi personalizzati: puoi anche definire i tuoi eventi in classi personalizzate (moduli di classe),
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
08-06-2014, 01.11.10 | #33 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 Codice:
Sub nome_routine (param1 As tipo, param2 As tipo) ‘istruzioni della subroutine End Sub 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 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 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 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 Codice:
Function calcola_area(Raggio As Double) As Double calcola_area = Raggio * Raggio * 3.14 End Function 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 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 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 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 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 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 - |
08-06-2014, 01.46.46 | #34 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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 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 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 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 Codice:
Function fileExist(filePath As String) As Boolean fileExist = IIf(Dir(filePath) <> vbNullString, Vero, Falso) End Function 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" 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 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 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 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 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 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 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 - |
08-06-2014, 16.19.08 | #35 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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 Codice:
Private Sub CommandButton1_Click () ClearForm End Sub Private Sub ClearForm () Textbox1.value = "" ComboBox1.Value = "" CheckBox1.Value = False OptionButton1.Value = False End Sub 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":
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 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 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 - |
16-06-2014, 23.01.19 | #36 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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 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 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 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 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 - |
17-06-2014, 11.00.14 | #37 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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 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 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 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 - |
19-06-2014, 14.32.01 | #38 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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à 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 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 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 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 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 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 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 - |
20-06-2014, 00.19.06 | #39 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 - |
21-06-2014, 18.51.55 | #40 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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:
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:
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:
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:
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:
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:
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è.
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:
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 - |
22-06-2014, 22.26.59 | #41 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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 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 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 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 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 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 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 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 - |
23-06-2014, 20.40.00 | #42 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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:
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 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 - |
24-06-2014, 15.20.24 | #43 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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à:
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:
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
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
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 - |
26-06-2014, 18.41.40 | #44 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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) 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 Codice:
MsgBox ActiveWorkbook.Sheets.Item (1). Name 'oppure MsgBox ActiveWorkbook.Sheets (1). Name Codice:
MsgBox ThisWorkbook.Worksheets (1). Name Codice:
ActiveWorkbook.Worksheets ("Foglio3"). Activate Codice:
ActiveWorkbook.Sheets ("Chart1"). Activate Codice:
MsgBox Worksheets (2). Name 'Oppure MsgBox Sheets(2). Name Codice:
MsgBox ActiveSheet.Name Codice:
MsgBox Workbooks ("prova.xlsx"). Worksheets (2). Name Codice:
MsgBox Workbooks(2).Worksheets(1).Name MsgBox Workbooks.Item(2).Worksheets.Item(1).Name MsgBox Workbooks(2).Worksheets.Item(1).Name 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 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 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:
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" Codice:
Worksheets ("Foglio1"). Range ("A1"). Value = "ciao" Codice:
Worksheets (1). Range ("A1"). Value = "ciao" 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 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 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 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 Codice:
ActiveWorkbook.Worksheets.Add After: = Worksheets ("Foglio2") Codice:
ActiveWorkbook.Worksheets.Add After: = Worksheets ("Foglio2"), Count: = 3 Codice:
ActiveWorkbook.Worksheets.Add, Worksheets ("Foglio2"), 2 Codice:
ActiveWorkbook.Worksheets.Add Worksheets ("Foglio2"), 2 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 Codice:
ActiveWorkbook.Worksheets ("Foglio1"). Activate Codice:
ActiveWorkbook.Worksheets ("Foglio1"). Name = "prova1" Codice:
ActiveWorkbook.Worksheets.Add (Before: = Worksheets ("Foglio2")). Name = "pippo" Codice:
Dim i As Integer For i = 1 To ThisWorkbook.Sheets.count MsgBox ThisWorkbook.Sheets (i). Name Next i Codice:
Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets MsgBox ws.Name Next 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 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") Codice:
Worksheets ("Foglio1"). Copy After: = Sheets ("Foglio3") Codice:
Worksheets ("Foglio1"). Copy Before: = Workbooks ("prova.xlsm"). Sheets ("pippo") Codice:
Worksheets ("Foglio1"). Copy 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") Codice:
Worksheets ("Foglio1"). Move After: = Sheets ("Foglio3") Codice:
Worksheets ("Foglio1"). Move Before: = Workbooks ("prova.xlsm"). Sheets ("pippo") Codice:
Worksheets ("Foglio1"). Move 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
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 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 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 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 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
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 Codice:
Application.DisplayFormulaBar = False Codice:
Application.DisplayFullScreen = True Codice:
ActiveWindow.DisplayHeadings = False Codice:
ActiveWindow.DisplayGridlines = False Codice:
Range ("C2"). Select ActiveWindow.FreezePanes = True 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 La proprietà Application.Calculation restituisce o imposta la modalità di calcolo di Excel e dispone di 3 impostazioni:
Impostare la modalità di calcolo manuale: Codice:
Application.Calculation = xlCalculationManual Metodo Calcola applicabile all'oggetto Application, calcola tutte le cartelle che sono aperte Codice:
Application.Calculate Calculate Codice:
Application.Worksheets ("Foglio1"). Calculate Worksheets ("Foglio1"). Calculate Codice:
Worksheets ("Foglio1"). Range ("A5: B6"). Calculate Codice:
Worksheets ("Foglio1"). Columns (1). Calculate Codice:
Range ("A5, A6, B7, B20"). Calculate 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 Codice:
Application.Calculation = xlCalculationManual Application.CalculateBeforeSave = True Codice:
Worksheets ("Foglio1"). EnableCalculation = False Application.Calculation = xlCalculationAutomatic
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
28-06-2014, 15.44.30 | #45 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
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 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 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 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 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:
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 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 - |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
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 |