2015-04-15 30 views
6

Sto cercando di scrivere alcuni VBA in Excel che possono assumere il nome di una tabella (oggetto elenco) come parametro e restituire il numero di righe.VBA: conteggio delle righe in una tabella (oggetto elenco)

Il seguente funziona, ma non mi permette di passare in una stringa con il nome della tabella.

MsgBox ([MyTable].Rows.Count) 

Di seguito dà l'errore: "Oggetto richiesto"

v_MyTable = "MyTable" 
MsgBox (v_MyTable.Rows.Count) 

Di seguito dà l'errore: "Oggetto variabile o variabile del blocco non set"

v_MyTable_b = "[" & "MyTable" & "]" 
MsgBox(v_MyTable_b.Rows.Count) 

Ho anche provato lavorare con ListObjects, di cui sono nuovo. Ho ricevuto l'errore: "Oggetto non supporta questa proprietà o metodo"

Dim tbl As ListObject 
Set tbl = ActiveSheet.ListObjects("MyTable") 
MsgBox(tbl.Rows.Count) 

Grazie per qualsiasi aiuto!

risposta

10

È necessario approfondire un livello in quello che si sta recuperando.

Dim tbl As ListObject 
Set tbl = ActiveSheet.ListObjects("MyTable") 
MsgBox tbl.Range.Rows.Count 
MsgBox tbl.HeaderRowRange.Rows.Count 
MsgBox tbl.DataBodyRange.Rows.Count 
Set tbl = Nothing 

Maggiori informazioni su:

ListObject Interface
ListObject.Range Property
ListObject.DataBodyRange Property
ListObject.HeaderRowRange Property

+1

Nota che se la tabella è vuota, 'tbl .DataBodyRange.Rows.Count' genera un errore – Dan

+6

Invece 'tbl.listrows.count' può essere usato per ottenere il numero di righe anche se la tabella è vuota. Ciò non produrrebbe alcun errore in un codice –

2

È possibile utilizzare questo:

Range("MyTable[#Data]").Rows.Count 

Bisogna distinguere tra una tabella che ha sia una fila di dati o nessun dato, come il il codice precedente restituirà "1" per entrambi i casi. Usare questo per verificare un tavolo vuoto:

If WorksheetFunction.CountA(Range("MyTable[#Data]")) 
+0

In che modo migliora la risposta accettata da oltre 1 anno? –

+0

Beh, mi dispiace che @Jalal anser fosse in ritardo per te, ma sono davvero contento che l'abbia pubblicato! –

0

È possibile utilizzare:

Sub returnname(ByVal TableName As String) 

MsgBox (Range("Table15").Rows.count) 

End Sub 

e chiamare la funzione, come di seguito

Sub called() 

returnname "Table15" 

End Sub 
Problemi correlati