Discussione: Corso VBA
Visualizza messaggio singolo
Vecchio 27-07-2014, 09.14.36   #50
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
Metodi e Proprietà per gestire le righe del foglio di lavoro





La Proprietà Range.End
In VBA sarà spesso necessario fare riferimento a una cella alla fine di un blocco, ad esempio, per determinare l'ultima riga utilizzata in un intervallo. La struttura finale è utilizzata con riferimento a un oggetto Range e restituisce la cella che si trova alla fine della regione in cui il range di riferimento è contenuto in una determinata direzione, ed è simile a premere CTRL + freccia SU’, CTRL + freccia GIÙ, CTRL + freccia Sinistra o CTRL + freccia Destra. La sintassi è la seguente: RangeObject. End (Direction). È necessario specificare l'argomento Direction, che indica la direzione di movimento, per esempio .End (xlDown) indica lo spostamento verso il basso, mentre .End (xlToRight) indica lo spostamento verso destra.


Utilizzare End (xlUp) per determinare l’ultima riga con i dati in una colonna
End (xlUp) è uno dei metodi più comunemente utilizzati per determinare l'ultima riga utilizzata, contenente dei dati.Rows.Count restituisce l'ultima riga del foglio di lavoro, se consideriamo che Excel 2007 dispone di 1.048.576 righe, l’istruzione .Cells (Rows.Count, "B") restituisce la cella B1048576, vale a dire l’ultima cella della colonna B, e il codice parte da questa cella e scorre tutta la colonna verso l'alto fino a trovare una cella che contiene dei dati
Codice:
Sub ultima_1()
Dim ultimaR As Long
ultimaR = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row
MsgBox ultimaR
End Sub
 
Sub ultima_2()
Dim ultimaR As Long
ultimaR = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
MsgBox ultimaR
End Sub
Utilizzare End (xlToLeft) per determinare l’ultima colonna con i dati
Restituisce il numero dell’ultima colonna con i dati in una riga specificata, nel caso di una riga vuota restituirà il valore 1. Non vengono considerate le celle formattate, ma senza dati, mentre si considerano costanti e formule. Se l'ultima colonna con i dati è nascosta, questa colonna viene ignorata
Codice:
Sub ultima_3()
Dim ultimaC As Integer
ultimaC = ActiveSheet.Cells(2, Columns.Count).End(xlToLeft).Column
MsgBox ultimaC
End Sub
La proprietà UsedRange per trovare l'ultima riga
Per restituire l'intervallo utilizzato in un foglio di lavoro, si utilizza la proprietà Worksheet.UsedRange che presenta la seguente sintassi: WorksheetObject.UsedRange e include anche le celle formattate con dati o celle con dati il cui contenuto è stato eliminato, e in questo caso potrebbe includere apparentemente celle vuote visibili. Ad esempio, se si applica il formato data a una cella, in questo caso, cancellare il contenuto e la formattazione potrebbe non essere sufficiente per re-impostare la riga o cella e in questo caso si dovrà eliminare la riga.
Codice:
Sub ultima_4()
Dim ultimaR As Long
ultimaR = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
MsgBox ultimaR
End Sub
 
Sub ultima_5()
Dim ultimaR As Long
ultimaR = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
MsgBox ultimaR
End Sub
La Proprietà UsedRange per trovare l'ultima colonna
Codice:
Sub ultima_6()
Dim ultimaC As Integer
ultimaC = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count
MsgBox ultimaC
End Sub
 
Sub ultima_7()
Dim ultimaC As Integer
ultimaC = ActiveSheet.UsedRange.Columns(ActiveSheet.UsedRange.Columns.Count).Column
MsgBox ultimaC
End Sub
La Proprietà UsedRange per contare il numero di righe utilizzate
Codice:
Sub prova_RU()
Dim rigaU As Long
rigaU = ActiveSheet.UsedRange.Rows.Count
MsgBox rigaU
End Sub
La Proprietà UsedRange per contare il numero di colonne utilizzate
Codice:
Sub prova_CU()
Dim colonnaU As Integer
colonnaU = ActiveSheet.UsedRange.Columns.Count
MsgBox colonnaU
End Sub
La proprietà UsedRange per trovare la prima riga utilizzata
Codice:
Sub prima_RU1()
Dim primaR As Long
primaR = ActiveSheet.UsedRange.Cells(1).Row
MsgBox primaR
End Sub
 
Sub prima_RU2()
Dim primaR As Long
primaR = ActiveSheet.UsedRange.Row
MsgBox primaR
End Sub
La Proprietà UsedRange per trovare la prima colonna utilizzata
Codice:
Sub prima_CU1()
Dim primaC As Integer
primaC = ActiveSheet.UsedRange.Cells(1).Column
MsgBox primaC
End Sub
 
Sub prima_CU2()
Dim primaC As Integer
primaC = ActiveSheet.UsedRange.Column
MsgBox primaC
End Sub
La Proprietà Row e Column
Per restituire il numero della prima riga in un intervallo, si utilizza la proprietà Range.Row e se l'intervallo specificato contiene più aree, questa proprietà restituirà il numero della prima riga della prima area. La sintassi utilizzata è la seguente: RangeObject.Row, mentre invece per restituire il numero della prima colonna in un intervallo, si utilizza la proprietà Range.Column e se l'intervallo specificato contiene più aree, questa proprietà restituirà il numero della prima colonna nella prima area. La sintassi è: RangeObject.Column

Esempi della proprietà Row
Applicare il colore giallo a tutte le righe dell’intervallo B2:D4
Worksheets ("Foglio1"). Range ("B2: D4"). Rows.Interior.Color = vbYellow

Applicare il colore verde alla prima riga del range B2:D2
Worksheets ("Foglio1"). Range ("B2: D4"). Row (1) Interior.Color = vbGreen

Se l'oggetto specificato contiene più zone, le righe 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 sarà "F3: G6", il seguente codice applica il colore rosso alle celle alla prima riga della prima area (B2:D4)

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

Esempi della proprietà Columns
Applicare il colore giallo a tutte le colonne dell’intervallo specificato, cioè B2:D4
Worksheets ("Foglio1"). Range ("B2: D4"). Columns.Interior.Color = vbYellow

Applicare il colore verde alla 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à. Per esempio se abbiamo 2 aree nell'intervallo specificato, e la prima area sarà "B2: D4" mentre la seconda area sarà "F3: G6", il seguente codice applica il colore rosso alle celle dalla prima colonna della prima area alle celle da B2 a B4

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


Utilizzare la proprietà End (xlDown) per determinare l’ultima riga
Codice:
Sub ultimaR1()
Dim ultimaR As Long
ultimaR = ActiveSheet.Range("D2").End(xlDown).Row
MsgBox ultimaR
End Sub
Utilizzare End (xlToRight) per determinare l’ultima colonna
Codice:
Sub ultima8()
Dim ultimaC As Integer
ultimaC = ActiveSheet.Range("C4").End(xlToRight).Column
MsgBox ultimaC
End Sub
Esempi di utilizzo della proprietà Range.End: Selezione di una particolare riga o colonna come da Figura 1

Fig. 1

Codice:
Sub prova1()
Dim ws As Worksheet
Set ws = Worksheets("Foglio1")
ws.activate
 
'seleziona la cella C12 (Elena)
Range("C5").End(xlDown).Select
'seleziona la cella C17 (55), la cella C12 è l'ultima cella di dati in un blocco
‘in questo caso si seleziona la cella successiva con dati che è C17
Range("C12").End(xlDown).Select
'seleziona la cella C18 (66)
Range("C17").End(xlDown).Select
'seleziona la cella C17 (55), la cella C14 è una cella vuota
‘e in questo caso seleziona la cella successiva con i dati
Range("C14").End(xlDown).Select
'seleziona l'ultima riga del foglio di lavoro se la colonna è vuota
‘che è la cella F1048576 in quanto Excel 2007 ha 1.048.576 righe
Range("F1").End(xlDown).Select
'seleziona la cella E7 (7)
Range("C7").End(xlToRight).Select
'seleziona la cella G7 (22)
Range("E7").End(xlToRight).Select
'seleziona cella XFD7, che è l'ultima colonna della riga 7, in quanto 
‘la cella I7 è l'ultima cella con i dati in questa riga
Range("I7").End(xlToRight).Select
'seleziona la cella I7 (26)
Range("I14").End(xlUp).Select
'seleziona la cella E6 (Luca)
Range("E18").End(xlUp).Select
'seleziona il range C5:C12
Range("C5", Range("C5").End(xlDown)).Select
End Sub
Il metodo Find per determinare l'ultima riga
Restituisce l’ultima riga con i dati in un foglio di lavoro. In caso di un foglio di lavoro vuoto darà un errore di run-time.
Per cercare un articolo specifico o un valore in un intervallo, si utilizza il metodo Find che restituisce il Range, vale a dire, la prima cella, dove si trova l'elemento o valore. Se non viene trovata alcuna corrispondenza, restituisce Nothing.

L’istruzione SearchDirection
È possibile specificare l’argomento xlNext per indicare di eseguire ricerche verso il basso (cioè al valore corrispondente successivo) o xlPrevious per ricerche verso l'alto o all'indietro (cioè al valore corrispondente precedente) nel campo di ricerca. Il valore predefinito è xlNext. Se si specifica After: = Range ("A13"), in cui il campo di ricerca è il Range ("A1: A20") e si imposta la direzione di ricerca in SearchDirection: = xlNext, allora la funzione di ricerca inizierà a cercare dalla cella A14 fino alla A20 per poi ricercare dal Range ("A1") fino al Range ("A13”)
Codice:
Sub prova2()
Dim ultimaC As Long, rng As Range
Set rng = ActiveSheet.Cells
ultimaC = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
MsgBox ultimaC
End Sub
Il metodo Find per determinare l’ultima colonna
Codice:
Sub prova3()
Dim ultimaC As Integer, rng As Range
Set rng = ActiveSheet.Cells

ultimaC = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column
 
MsgBox ultimaC
End Sub
Il metodo SpecialCells per trovare l’ultima riga
Codice:
Sub prova4()
Dim ultimaR As Long
ultimaR = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
MsgBox ultimaR
End Sub
  
Sub prova5()
Dim ultimaR As Long
ultimaR = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row
MsgBox ultimaR
End Sub
Il Metodo Range.SpecialCells
Si utilizza il metodo Range.SpecialCells con la sintassi: RangeObject.SpecialCells (Type, Value), dove l'argomento type specifica il tipo di cella come costanti XlCellType, da restituire ed è obbligatorio specificare questo argomento, mentre invece l’argomento Value è facoltativo e specifica i valori come per le costanti XlSpecialCellsValue, nel caso di xlCellTypeConstants o xlCellTypeFormulas viene specificato nell'argomento Type. Non specificando l'argomento Value per impostazione predefinita vengono inclusi tutti i valori delle costanti o formule, nel caso di xlCellTypeConstants o xlCellTypeFormulas rispettivamente. Usando questo metodo viene restituito un oggetto Range, composto da celle corrispondenti agli argomenti type e value specificati

I vari tipi di Costanti XlCellType
  • xlCellTypeAllFormatConditions: Si riferisce a tutte le celle con formattazione condizionale (valore -4172)
  • xlCellTypeAllValidation: Fa riferimento alle celle che contengono una convalida (valore -4.174)
  • xlCellTypeBlanks: Si riferisce a celle vuote (valore 4)
  • xlCellTypeComments: Fa riferimento alle celle con commenti (valore di -4144)
  • xlCellTypeConstants: Fa riferimento alle celle che contengono costanti (valore 2)
  • xlCellTypeFormulas: Fa riferimento alle celle che contengono formule (valore -4.123)
  • xlCellTypeLastCell: Si riferisce all'ultima cella nell'intervallo utilizzato (valore 11)
  • xlCellTypeSameFormatConditions: Si riferisce a celle con lo stesso formato (valore -4173)
  • xlCellTypeSameValidation: Si riferisce a celle con la stessa convalida (valore -4175)
  • xlCellTypeVisible: Si riferisce a tutte le celle che sono visibili (valore 12)

Il Metodo SpecialCells per trovare l’ultima colonna
Codice:
Sub prova6()
Dim ultimaC As Integer
ultimaC = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
MsgBox ultimaC
End Sub

Sub prova7()
Dim ultimaC As Integer
ultimaC = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Column
MsgBox ultimaC
End Sub
___________________________________

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