Lavorare con
gli oggetti Excel (quarta parte)
Premessa
Come già visto nelle lezioni precedenti,
i requisiti fondamentali per poter interagire con gli oggetti di Excel
sono due: avere installato una copia di Microsoft Excel ed aver precedentemente
caricato la libreria oggetti di Excel disponibile nella finestra di dialogo
Riferimenti. Per una maggiore comprensione, la finestra si apre cliccando
sulla voce Progetto del menu principale e selezionando dal menu Progetto
che si aprirà, la voce Riferimenti che è quella accompagnata dall'icona
dei libri. Basterà poi selezionare la voce Microsoft Excel Object Library
per poter utilizzare tutti gli oggetti di cui la libreria in questione
si compone.
Riprendendo le conclusioni alle quali si era arrivati nel corso dell'articolo precedente,
è possibile vedere ora come agire sul Range attraverso le operazioni tipiche di Taglia,
Copia ed Incolla.
La struttura di queste operazioni è simile per tutte e tre e molto comprensibile: sarà infatti
sufficiente utilizzare i rispettivi metodi.
Vediamone il primo, ossia il metodo Cut. Cut permette di tagliare una selezione
ossia tutte le caselle che fanno parte di un Range.
La struttura da utilizzare segue il modello indicato qui sotto:
OggettoExcel.Range(cella1, cella2).Cut destinazione
|
Non è tuttavia assolutamente necessario operare una selezione di un Range e poi
richiamare il metodo Cut, sebbene nulla vieti di compiere entrambi i passaggi.
Una cosa infatti è la selezione di un Range, un'altra è l'operazione di taglio delle
caselle che lo compongono.
Così, selezionando e tagliando un Range si ottiene il risultato mostrato dalla figura
seguente:
considerando il fatto che l'immagine è stata prodotta da un codice nel quale non è stata
indicata alcuna destinazione, ossia:
Riga1 = 1: Colonna1 = 1: Riga2 = 5: Colonna2 = 5
foglioExcel.Range(foglioExcel.Cells(Riga1, Colonna1), foglioExcel.Cells(Riga2, Colonna2)).Select
For i = Riga1 To Riga2
foglioExcel.Cells(i, i).Characters().Text = "Cella " & i & " " & n
Next i
foglioExcel.Range(foglioExcel.Cells(Riga1, Colonna1), foglioExcel.Cells(Riga2, Colonna2)).Cut
|
Eliminando invece la selezione del Range (ossia la seconda linea del codice
mostrato sopra) si otterrà un risultato di questo tipo:
Dove vanno a finire le selezioni tagliate? Nel caso in cui non si indichi
la destinazione verranno memorizzate nella Clipboard ossia negli Appunti.
In caso contrario, si dovrà scegliere un Range di pari dimensioni. Ad esempio se la selezione
è foramata da un rettangolo di 5x5 come nella figura riportata sopra, sarà sufficiente indicare
una destinazione di dimensioni 5x5.
Ad esempio, proviamo a traslare le caselle del Range (1,1) - (5,5) di tre caselle
più a destra, semplicemente aggiungendo il valore 3 ad ogni riga e colonna come mostrato
dal codice sotto:
Riga1 = 1: Colonna1 = 1: Riga2 = 5: Colonna2 = 5
foglioExcel.Range(foglioExcel.Cells(Riga1, Colonna1), foglioExcel.Cells(Riga2, Colonna2)).Select
For i = Riga1 To Riga2
foglioExcel.Cells(i, i).Characters().Text = "Cella " & i & " " & n
Next i
foglioExcel.Range(foglioExcel.Cells(Riga1, Colonna1), foglioExcel.Cells(Riga2, Colonna2)).Cut _
foglioExcel.Range(foglioExcel.Cells(Riga1 + 3, Colonna1 + 3), foglioExcel.Cells(Riga2 + 3, Colonna2 + 3))
|
Si otterrà un risultato simile a quello mostrato in figura:
Tale risultato è possibile perchè è stato indicato un Range di destinazione
delle stesse dimensioni di quello di origine.
L'operazione di copia, ottenibile attraverso il metodo Copy e del tutto simile a quella
appena vista. Ed anche la sintassi da utilizzare non cambia di molto:
OggettoExcel.Range(cella1, cella2).Copy destinazione
|
Anche in questo caso infatti se destinazione non viene indicato, le caselle facenti
parte del Range vengono copiate negli Appunti.
L'operazione Incolla ottenuta attraverso il metodo PasteSpecial incolla il contenuto
degli Appunti sul foglio utilizzando un formato specifico, in modo tale da poter utilizzare
dati di formato differente in base all'applicazione di provenienza degli stessi.
Non è detto infatti che necessariamente si debba incollare i dati presenti nelle caselle dello
stesso foglio di lavoro all'interno del quale si sta lavorando.
La sintassi è del tipo:
OggettoExcel.Range(cella1, cella2).PasteSpecial xlPasteType, xlPasteSpecialOperation, Skip Blanks, Transpose
|
dove xlPasteType è un argomento facoltativo di tipo Variant che
indica una delle operazioni disponibili tra quelle elencate nella tabella
sottostante:
xlPasteAll |
Incolla tutto il contenuto degli Appunti
se i dati sono stati memorizzati in essi oppure tutto il Range di origine se indicato.
|
xlPasteAllExceptBorders |
Incolla tutto il contenuto degli Appunti
se i dati sono stati memorizzati in essi oppure tutto il Range di origine se indicato,
senza i bordi o le linee eventualmente disegnate tra le caselle nel Range di origine.
|
xlPasteComments |
Incolla tutti i commenti aggiunti alle
celle che compongono il Range e solo essi. Quindi il contenuto delle celle non viene
incollato.
|
xlPasteFormats |
Incolla il formato del Range
di origine (ad esempio con rientro, senza rientro, con tabulazioni incrociate eccetera). Anche
questa operazione non incolla il contenuto delle celle.
|
xlPasteValues |
Incolla il valore delle celle specificate.
Se l'oggetto Range contiene più celle,
verrà restituita una matrice di valori.
|
Se si passa a considerare il gruppo di operazioni indicato come xlPasteSpecialOperation
nella struttura vista prima, si può notare che anch'esso è un argomento facoltativo di
tipo Variant che specifica l'operazione di incollamento.
Può essere rappresentato da una delle costanti mostrate nella tabella sottostante:
xlPasteSpecialOperationAdd |
Incolla tutto il contenuto degli Appunti
se i dati sono stati memorizzati in essi oppure tutto il Range di origine se indicato in
un nuovo Range sommando i valori delle caselle già presenti a quelli delle caselle che
devono essere incollate.
|
xlPasteSpecialOperationSubtract |
Incolla tutto il contenuto degli Appunti
se i dati sono stati memorizzati in essi oppure tutto il Range di origine se indicato,
in un nuovo Range sottraendo i valori delle caselle che
devono essere incollate da quelli delle caselle già presenti.
|
xlPasteSpecialOperationMultiply |
Incolla tutto il contenuto degli Appunti
se i dati sono stati memorizzati in essi oppure tutto il Range di origine se indicato in
un nuovo Range moltiplicando i valori delle caselle già presenti per quelli delle caselle che
devono essere incollate.
|
xlPasteSpecialOperationDivide |
Incolla tutto il contenuto degli Appunti
se i dati sono stati memorizzati in essi oppure tutto il Range di origine se indicato in
un nuovo Range dividendo i valori delle caselle già presenti per quelli delle caselle che
devono essere incollate.
|
xlPasteSpecialOperationNone |
E' l'impostazione predefinita, l'operazione
PasteSpecial corrisponde ad una semplice sostituzione tra i valori esistenti e quelli da
incollare.
|
E' importante notare che se i parametri xlPasteType e xlPasteSpecialOperation devono
essere compatibili se si decide di indicare espressamente quest'ultimo.
C'è incompatibilità ad esempio se xlPasteType è costituito dalla costante xlPasteFormats
siccome risulterebbe impossibile compiere operazioni matematiche sulla formattazione delle caselle.
Pienamente accettati sono invece xlPasteValues e xlPasteAll.
Prima di continuare facciamo un piccolo esempio: copiamo il solito Range (1,1) - (5,5)
su sè stesso ossia sul Range di destinazione (1,1) - (5,5).
Se volessimo ad esempio sommare i valori dovremmo utilizzare la costante xlPasteSpecialOperationAdd,
con l'accortezza di sostituire ai valori testuali che si utilizzavano prima ("Cella1", "Cella2"...),
dei valori numerici:
Riga1 = 1: Colonna1 = 1: Riga2 = 5: Colonna2 = 5
For i = Riga1 To Riga2
foglioExcel.Cells(i, i).Characters().Text = i & n
Next i
foglioExcel.Range(foglioExcel.Cells(Riga1, Colonna1), foglioExcel.Cells(Riga2, Colonna2)).Copy
foglioExcel.Range(foglioExcel.Cells(Riga1, Colonna1), foglioExcel.Cells(Riga2, Colonna2)).PasteSpecial _
xlPasteAll, xlPasteSpecialOperationAdd
|
I valori iniziali delle celle erano 1,2,3,4,5. Dopo il copia-incolla con la somma dei valori
il risultato è il seguente:
mentre una moltiplicazione (quindi l'utilizzo della costante xlPasteSpecialOperationMultiply
produrrebbe il seguente risultato:
Passando oltre, Skip Blanks permette, se indicato con valore True di non incollare
le celle vuote del Range di origine nel Range di destinazione.
Infine Transpose, anch'esso elemento facoltativo. Se è indicato ed
ha valore True, le righe e le colonne vengono trasposte quando viene
incollato l'intervallo.
Soluzione dell'esercizio precedente:
Dim appExcel As New Excel.Application
Dim cartExcel As Excel.Workbook
Dim foglioExcel As Excel.Worksheet
Private Sub Command1_Click()
Dim Colonna1, Colonna2, Riga1, Riga2 As Integer
appExcel.Visible = True
Set cartExcel = Excel.Workbooks.Add
Set foglioExcel = Excel.Worksheets.Item(3)
foglioExcel.Activate
Riga1 = Val(Text1.Text): Colonna1 = Val(Text2.Text)
Riga2 = Val(Text3.Text): Colonna2 = Val(Text4.Text)
foglioExcel.Range(foglioExcel.Cells(Riga1, Colonna1), foglioExcel.Cells(Riga2, Colonna2)).Select
For i = Riga1 To Riga2
For n = Colonna1 To Colonna2
foglioExcel.Cells(i, n).Characters().Text = "Cella " & i & n
Next n
Next i
End Sub
|
Esercizio:
Proponiamo in questa lezione un semplice esercizio per
cominciare a prendere confidenza con i concetti appresi nell'articolo corrente e in tutti
i precedenti. La soluzione dell'esercizio sarà pubblicata nel corso del prossimo articolo.
1) utilizzare il seguente codice per attivare sessione, cartella e foglio e popolare parte del foglio
di lavoro
Dim appExcel As New Excel.Application
Dim cartExcel As Excel.Workbook
Dim foglioExcel As Excel.Worksheet
Private Sub Form_Load()
Dim Colonna1, Colonna2, Riga1, Riga2 As Integer
appExcel.Visible = True
Set cartExcel = Excel.Workbooks.Add
Set foglioExcel = Excel.Worksheets.Item(1)
foglioExcel.Activate
For i = 1 To 10
For n = 1 To 10
foglioExcel.Cells(i, n).Characters().Text = i & n
Next n
Next i
End Sub
|
2) alla pressione del tasto Command1:
copiare tutte le caselle non vuote ossia il Range (1,1) - (10,10) negli Appunti;
eseguire l'operazione Incolla Speciale (PasteSpecial) sullo stesso Range di
origine (1,1) - (10,10) utilizzando la costante xlPasteAll ed un operazione (xlPasteSpecialOperationAdd,
xlPasteSpecialOperationSubtract, xlPasteSpecialOperationMultiply, xlPasteSpecialOperationDivide) scelta
dall'utente attraverso una ComboBox.
Ecco un esempio di come può essere impostata l'applicazione:
|
|
Visual
Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail: vbitalia@libero.it
|
|