Come posso eseguire il ciclo di una tabella di Excel 2010 utilizzando il suo nome e il riferimento di colonna?

Da Excel 2010 sto utilizzando molte tabelle in Excel. Ad esempio, ho una tabella “tabWorkers” con 3 colonne: “ID”, “Firstname”, “Lastname”.

Ho già scoperto che posso fare riferimento a una tabella in VBA usando []. Per esempio:

Dim row As Range For Each row In [tabWorkers].Rows MsgBox (row.Columns(2).Value) Next 

Questo mi darà il nome di ogni riga che funziona alla grande .. ma voglio renderlo più dinamico usando il nome della sua colonna in questo modo:

 Dim row As Range For Each row In [tabWorkers].Rows MsgBox (row.Columns("Firstname").Value) Next 

Ovviamente potrei fare una sorta di ricerca che lega l’indice della colonna ‘2’ a una var come FirstnameIndex, ma voglio la syntax corretta. Sono sicuro che è ansible ma non proprio documentato (come con [tabWorkers] .Rows)

Non ho molta familiarità con il metodo stenografico di riferimento alle tabelle. Se non si ottiene una risposta, è ansible trovare questo metodo a mano lunga, che utilizza il modello ListOject, utile:

 Sub ListTableColumnMembers() Dim lo As Excel.ListObject Dim ws As Excel.Worksheet Dim lr As Excel.ListRow Set ws = ThisWorkbook.Worksheets(2) Set lo = ws.ListObjects("tabWorkers") For Each lr In lo.ListRows Debug.Print Intersect(lr.Range, lo.ListColumns("FirstName").Range).Value Next lr End Sub 

prova questo:

 Dim row as Range For Each row in [tabWorkers[first name]].Rows MsgBox row.Value Next 

Anch’io ho meditato su questa domanda e ho cercato e cercato senza trovare una risposta davvero buona

Finalmente oggi il penny è caduto e ho trovato qualcosa che mi piacerebbe condividere per aiutare chi segue con la stessa domanda che mi dava fastidio.

In breve la domanda era: come fare riferimento alle righe di una tabella in vba usando i nomi standard delle parti di una tabella. Risulta essere abbastanza facile. È ansible fare riferimento a determinate righe della tabella e chiamare le colonne con il loro vero nome senza la necessità di ridefinire ulteriori variabili.

Il costrutto è il seguente: Range (“TableName [ColumnName]”) (RowNumber)

dove TableName e ColumnName sono i nomi di tabelle e colonne standard di Excelside e RowNumber è l’indice intero semplice del numero di riga da 1 a Range (“Table1”). Rows.Count

Per una tabella a due colonne denominata Tabella1 con colonne denominate ID e Dati, è ansible eseguire il ciclo degli elementi della tabella utilizzando questa struttura

 For Rw = 1 To Range("Table1").Rows.Count MsgBox(Range("Table1[ID]")(Rw) & "has value" & Range("Table1[Data]")(Rw) ) Next Rw 

Ciò mantiene costrutti molto simili a quelli utilizzati in Excel e non richiede alcuna denominazione aggiuntiva. Ed è molto leggibile! È anche ansible aggiungere i modificatori di intervallo appropriati come .Text, .Value, .Formula ecc. Dopo quella (Rw), se necessario.

Si noti che se si dispone di una tabella a riga singola (ad esempio per i parametri) o si desidera fare riferimento alla prima riga di una tabella più grande, è ansible saltare il bit (Rw) e utilizzare direttamente l’intervallo. Quindi una tabella chiamata Params con colonne chiamate Color, Size e Height può essere riferita a Range (“Params [Color]”) o Range (“Params [Height]”) ecc. Non ti piace? 🙂

Questa scoperta mi ha davvero appassionato alle tabelle. Ora mi forniscono un collegamento molto ordinato tra vba e le tabs in un modo leggibile e compatibile.

Grazie Microsoft!

Bob JordanB

Di solito lo faccio in questo modo

 Dim rng as Range Set rng = Application.Range("Tablename[Columnname]") 

È sufficiente fare riferimento alla cartella di lavoro perché i nomi delle tabelle sono univoci in tutta la cartella di lavoro. Ma se si hanno tabelle con nomi identici in cartelle di lavoro aperte diverse, ciò influenzerà la cartella di lavoro triggers, non entrambe o quella in background. Per evitare che tu debba chiamare l’object intervallo del foglio reale in cui risiede la tua tabella.

Spero che questo dimostrerà che può essere fatto nel modo in cui ho descritto sopra:

Ad esempio, ho un metodo in un database di Access che applica la formattazione condizionale a una tabella in un documento Excel che avrei appena creato e popolato utilizzando CopyFromRecordSet .

Che ha una firma di

 Private Function HighlightBlankOrZeroColumn(RangeToFormat As Range, HighlightColor As Long) 

e io chiamo così

 HighlightBlankOrZeroColumn ApXL.Range("Table1[" & SoucreRst.Fields(intCount).Name & "]"), BlankOrZeroColor 

dove ApXL è un New Excel.Application e SoucreRst è un recordset ADO.

A quel punto avevo già creato il mio Recordset -> Range a table chiamando questi due metodi:

 xlWSh.ListObjects.Add(xlSrcRange, xlWSh.UsedRange, , xlYes).Name = "Table1" xlWSh.ListObjects("Table1").TableStyle = "TableStyleLight16" 

Più conciso, testato in Excel 2007:

 Dim row As Range For Each row In [tabWorkers].Rows MsgBox Intersect (row,[tabWorkers[FirstName]]).Value Next 

Grazie Doug! Questo ha aiutato molto. un esempio funzionante:

 Dim row As Range For Each row In [tabWorkers].Rows MsgBox (row.Columns(row.ListObject.ListColumns("Firstname").Index).Value) Next 

Questo è anche il mio primo post. È passato molto tempo da quando è stata posta la domanda, ma spero comunque che sia di aiuto.

L’idea principale è di mantenere il pezzo di codice pulito come si ottiene.

 Set selrange = Selection.EntireRow For Each rrow In selrange.Rows selrange.Parent.Parent.Names.Add "rrow", rrow name = [table1[name] rrow].Text age = [table1[age] rrow].Text gender = [table1[gender] rrow].Text Next selrange.Parent.Parent.Names("rrow").Delete