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

In questo quinto articolo si andrà ad analizzare la proprietà RangeSelection come area selezionata dall'utente.
Come si vedrà in seguito esiste una differenza sostanziale tra la gestione di un Range, controllato dallo sviluppatore e di un RangeSelection le cui dimensioni e posizione sono invece affidate alle scelte dell'utente.
Prima di iniziare con tale argomento, essendo stati già chiariti i fondamenti del concetto di cella e di Range è possibile semplificare ulteriormente le cose utilizzando il metodo utilizzato da Excel per l'individuazione delle celle.
Si può infatti indicare una cella indicandone le coordinate in base all'intestazione di riga e di colonna.
Così la cella che finora chiamavamo (3,3) per indicare la cella nella terza riga e nella terza colonna può essere indicata come "C3".
C infatti corrisponde all'intestazione della terza colonna e 3 all'intestazione della terza riga. Proprio come si vede dall'immagine che segue:


Quindi, riportando quanto appena visto al concetto di Range è possibile semplificarne la definizione indicando anche qui per ogni cella l'intestazione di riga e di colonna.
Ad esempio se volessimo selezionare l'area (1,1) - (4,3) invece della scrittura finora utilizzata ossia:

foglioExcel.Range(foglioExcel.Cells(1, 1), foglioExcel.Cells(4, 3)).Select

potremmo utilizzare come indicatori di cella rispettivamente "A1" e "D3" nel modo che segue:

foglioExcel.Range("A1", "D3").Select

rendendo così molto più agevole la scrittura e la comprensione del codice.
Terminata questa parentesi vediamo adesso come recuperare le informazioni relative ad un'area di selezione, introducendo in questo modo il concetto di RangeSelection. Se volessimo infatti visualizzare in una finestra di messaggio la formula che indica il Range selezionato, dovremo fare riferimento alla proprietà ActiveWindow dell'oggetto Application.
ActiveWindow ha la funzione di spostare l'attenzione sulla finestra attiva dell'applicazione Excel, nel caso ne siano state aperte più di una.
Nel caso in cui nessuna finestra dell'applicazione sia aperta, la proprietà ritornerà il valore Nothing.
Un sistema per evitare errori di questo tipo consiste nel verificare immediatamente che almeno una finestra sia aperta. Ecco come fare:

If appExcel.ActiveWindow Is Nothing Then
Msgbox "Nessuna finestra è attiva"
End If

Insieme a tale proprietà dovremo fare uso anche della RangeSelection che restituisce un oggetto Range rappresentante le celle selezionate nel foglio di lavoro nella finestra specificata (nel nostro caso la finestra attiva).
Una volta compreso il significato di tali proprietà aggiungiamo che per raggiungere il risultato prefissato, si dovrà utilizzare anche la proprietà Address della quale per adesso non faremo un'analisi dettagliata in quanto non ancora necessaria.
Unendo le tre proprietà possiamo quindi recuperare la formula che individua il Range attraverso il codice qui sotto:

MsgBox appExcel.ActiveWindow.RangeSelection.Address

Un esempio di formula visualizzato dalla finestra di messaggio potrebbe essere il seguente:


In questo caso è stato impostato prima un Range di celle "A1","D3" come mostrato dal codice riportato sotto:

foglioExcel.Range("a1", "d3").Select
MsgBox appExcel.ActiveWindow.RangeSelection.Address

Naturalmente nel caso in cui non sia stato selezionato espressamente un Range, il risultato mostrato dalla finestra di messaggio corrisponde alla formula di selezione di una sola cella, o la "A1" per impostazione predefinita (formula $A$1), oppure quella selezionata dall'utente.
Le proprietà appena viste ed il codice analizzato sopra hanno uno scopo ben specifico. Indicando un Range da codice si suppone che chi sviluppa l'applicazione conosca quali celle andrà a selezionare l'utente, cosa pressochè impossibile.
Attraverso la proprietà RangeSelection che per semplificarne il concetto si può considerare come un vero e proprio oggetto indipendente ossia l'oggetto "area selezionata dall'utente" a differenza di Range che può essere considerato più come l'oggetto "area selezionata dallo sviluppatore", si può appunto lavorare con le celle via via selezionate dall'utente dell'applicazione.
Così risulta semplice applicare i concetti visti negli articoli precedenti a tale area di selezione: prendiamo il caso del metodo Taglia. Ecco come si adatta a RangeSelection:

appExcel.ActiveWindow.RangeSelection.Cut

Lo stesso vale per il metodo Copy:

appExcel.ActiveWindow.RangeSelection.Copy

e per Incolla Speciale, di cui per comodità si riporta sotto la sintassi completa:

ApplicazioneExcel.ActiveWindow.RangeSelection.PasteSpecial xlPasteType, xlPasteSpecialOperation, Skip Blanks, Transpose

Se però dal punto di vista della sintassi i tre metodi appena visti a Range e RangeSelection non sono granchè dissimili, per l'organizzazione del codice le cose sono molto diverse.
Negli esempi fatti negli articoli precedenti (e negli esercizi finora proposti) non ha senso sostituire semplicemente il codice relativo a RangeSelection al codice relativo a Range perchè in questo modo non si lascerebbe all'utente la possibilità di eseguire la selezione.
Il metodo migliore per ovviare al problema è quello far eseguire all'utente la selezione ed applicare poi i metodi Taglia, Copia ed Incolla Speciale nel momento desiderato dall'utente.
Tutto ciò può essere realizzato con l'inserimento nel progetto di un semplice pulsante.
E questo è proprio il testo dell'esercizio proposto al termine dell'articolo.

Soluzione dell'esercizio precedente:

Dim appExcel As New Excel.Application
Dim cartExcel As Excel.Workbook
Dim foglioExcel As Excel.Worksheet
Private Sub Form_Load()
With Combo1
.Text = "xlPasteSpecialOperationAdd"
.AddItem "xlPasteSpecialOperationAdd"
.AddItem "xlPasteSpecialOperationSubtract"
.AddItem "xlPasteSpecialOperationMultiply"
.AddItem "xlPasteSpecialOperationDivide"
End With
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

Private Sub Command1_Click()
foglioExcel.Range(foglioExcel.Cells(1, 1), foglioExcel.Cells(10, 10)).Copy
Select Case Combo1.Text
Case Is = "xlPasteSpecialOperationAdd"
foglioExcel.Range(foglioExcel.Cells(1, 1), foglioExcel.Cells(10, 10)).PasteSpecial xlPasteAll, _
xlPasteSpecialOperationAdd
Case Is = "xlPasteSpecialOperationSubtract"
foglioExcel.Range(foglioExcel.Cells(1, 1), foglioExcel.Cells(10, 10)).PasteSpecial xlPasteAll, _
xlPasteSpecialOperationSubtract
Case Is = "xlPasteSpecialOperationMultiply"
foglioExcel.Range(foglioExcel.Cells(1, 1), foglioExcel.Cells(10, 10)).PasteSpecial xlPasteAll, _
xlPasteSpecialOperationMultiply
Case Is = "xlPasteSpecialOperationDivide"
foglioExcel.Range(foglioExcel.Cells(1, 1), foglioExcel.Cells(10, 10)).PasteSpecial xlPasteAll, _
xlPasteSpecialOperationDivide
Case Else
End Select
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:

  • attivare e visualizzare il foglio di calcolo 2 e copiarvi la selezione indicata dall'utente partendo dalla cella (1,1). Ricordarsi di utilizzare questa volta RangeSelection al posto di Range e di copiare la selezione del primo foglio di lavoro negli Appunti prima di cambiare foglio;

    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