MS Excel - ListObject.

Een tabel en het ListObject

Een tabel in de Excel gebruikers interface wordt in VBA voorgesteld door het Listobject. De voornaamste properties zijn :

Onderstaande code geeft de namen van alle tabellen, ListObjecten, in het werkbook, en toont hoe de voornaamste properties kunnen benaderd worden.

            Public Sub sTabelNamen()
                Dim shtData As Worksheet
                Dim lsoTabel As ListObject
                Dim lsoMaand As ListObject
            
                Set shtData = ThisWorkbook.Worksheets("Data")
                    For Each lsoTabel In shtData.ListObjects
                        Debug.Print lsoTabel.DisplayName
                    Next
                Set lsoMaand = shtData.ListObjects("tblMaand")
            
                Debug.Print "Naam van de tabel: " & lsoMaand.DisplayName
                Debug.Print "Range property: " & lsoMaand.Range.Address
                Debug.Print "HeaderRowRange property: " & lsoMaand.HeaderRowRange.Address
                Debug.Print "HeaderRowRange property waarde rij1 kol1: " & lsoMaand.HeaderRowRange.Cells(1, 1)
                Debug.Print "DataBodyRange property waarde: " & lsoMaand.DataBodyRange.Address
                Debug.Print "Aantal data-rijen:" & lsoMaand.DataBodyRange.Rows.Count
                Debug.Print "ListRows: " & lsoMaand.ListRows.Count
                Debug.Print "ListColums: " & lsoMaand.ListColumns.Count
                Debug.Print "Waarde van cel rij 2 kolom 1 :" & lsoMaand.DataBodyRange.Cells(2, 1).Value
            End Sub
            

Veel eigenschappen van het Listobject geven een Range

Hier beschouwen wij een tabel met 3 kolommen en 34 rijen waarvan 33 data rijen.

            Public Sub sTabel3Kol()
            Dim shtData As Worksheet
            Dim lsoItem As ListObject
            Set shtData = ThisWorkbook.Worksheets("Data")
            Set lsoItem = shtData.ListObjects("tblItem")
            
            Dim rngData As Range
            Set rngData = lsoItem.DataBodyRange
            Debug.Print rngData.Areas.Count ' geeft 1 
            Debug.Print rngData.Address ' geeft $K$2:$M$34 en is een stringwaarde 
            Debug.Print rngData.Cells(1, 1) ' geeft Agenda 
            Debug.Print rngData.Cells.Count ' geeft het totaal aantal data cellen 99 
            Debug.Print rngData.Columns.Count ' geeft 3 
            Debug.Print rngData.Count 'geeft het totaal aantal data cellen 99 
            Debug.Print rngData.Rows.Count 'geeft 33 
            End Sub
            

Waarden van een specifieke kolom

Hier beschouwen wij een tabel met 3 kolommen en 34 rijen waarvan 33 data rijen.

            Public Sub sTabel3Kol_1()
            Dim shtData As Worksheet
            Dim lsoItem As ListObject
            Set shtData = ThisWorkbook.Worksheets("Data")
            Set lsoItem = shtData.ListObjects("tblItem")
            Dim rngKol3 As Range   'beschouwen enkel kolom 3 
            Set rngKol3 = lsoItem.ListColumns(3).DataBodyRange
            Dim rngCel As Range
            For Each rngCel In rngKol3
                Debug.Print rngCel.Value  'waarde van ieder veld van kolom 3 
            Next
            End Sub
            

Tabel inlezen in een Array

Hier beschouwen wij een tabel met 3 kolommen en 34 rijen waarvan 33 data rijen.

            Public Sub sTabel3KolArray()
            Dim shtData As Worksheet
            Dim lsoItem As ListObject
            Dim aData() As Variant
            Dim lngTel As Long
            Set shtData = ThisWorkbook.Worksheets("Data")
            Set lsoItem = shtData.ListObjects("tblItem")
            aData = lsoItem.DataBodyRange
            For lngTel = LBound(aData) To UBound(aData)
                Debug.Print aData(lngTel, 2)  'waarde van ieder veld van kolom 2 
            Next
            End Sub
            

Zoeken in een tabel

Hier beschouwen wij een tabel met 3 kolommen en 34 rijen waarvan 33 data rijen.
Men moet het adres van de cel waar eerst gezocht wordt noteren en het zoeken stoppen wanneer wij opnieuw op deze cel komen

             Public Sub sTabelZoeken1(strGezocht As String)
            Dim shtData As Worksheet
            Dim lsoItem As ListObject
            Set shtData = ThisWorkbook.Worksheets("Data")
            Set lsoItem = shtData.ListObjects("tblItem")
            Dim rngKol1 As Range
            Set rngKol1 = lsoItem.ListColumns(1).DataBodyRange
            Dim rngZoek As Range
            Dim intTel As Integer
            intTel = 0
            Dim strAdres As String
            With rngKol1
                Set rngZoek = .Find(strGezocht, LookIn:=xlValues)
                    If Not rngZoek Is Nothing Then
                        strAdres = rngZoek.Address
            
                    Do
                    Set rngZoek = .FindNext(rngZoek)
            
                            If rngZoek Is Nothing Then
                            GoTo Verlaten
                            End If
                        intTel = intTel + 1
                    Loop While Not rngZoek Is Nothing And rngZoek.Address <> strAdres
                    End If
            End With
            Verlaten:
            MsgBox "Aantal gevonden: " & intTel
            End Sub
            

hallo