Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
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:





  • Archivio:ndexed
    Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
    Proponi un argomento

    Visual Basic Italia© copyright 2000 - tutti i diritti riservati
    E-mail:
    vbitalia@libero.it