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