This is a real-world scenario - you need to implement some sophisticated manipulation of Excel tables in VBA, and then you need to extract the data from the Open XML spreadsheet using the Open XML SDK. This screen-cast was based on a real-world project that I completed a short while ago. The customer wanted some slick behavior inside a spreadsheet. They wanted to automatically create tables, delete tables, and in some circumstances, to maintain the tables. After the data was as desired, then the user would save the macro-enabled workbook, and run an Open XML program that processed the data in an interesting way (that would be very difficult using VBA).
This screen-cast and example code are related to two other videos:
Using Open XML Package Editor to Create a Ribbon Button that runs a VBA Function
Using Open XML Package Editor to Customize Ribbon, Deploy as VBA Add-In
Code is attached.
For convenience, here is the VBA code listing, if you want to see the code that I show in the video without opening the XLSM and looking at the code in the VBA editor:
Private Sub btnClearTable1_Click() On Error Resume Next Table1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error GoTo 0 If IsEmpty(Table1) Then MsgBox "Table does not exist", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") Dim nbrRows As Integer nbrRows = .Range.Rows.Count .Range.Range("$A$2:$C$" & nbrRows).Delete End With End If End Sub Private Sub btnClearTable2_Click() On Error Resume Next Table2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error GoTo 0 If IsEmpty(Table2) Then MsgBox "Table does not exist", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") Dim nbrRows As Integer nbrRows = .Range.Rows.Count .Range.Range("$A$2:$C$" & nbrRows).Delete End With End If End Sub Private Sub btnCopy1to2_Click() On Error Resume Next Table1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error GoTo 0 If IsEmpty(Table1) Then MsgBox "Table 1 does not exist", vbOKOnly, "Error" Else On Error Resume Next Table2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error GoTo 0 If IsEmpty(Table2) Then MsgBox "Table 2 does not exist", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") nbrRows = .Range.Rows.Count On Error Resume Next .Range.Range("$A$2:$C$" & nbrRows).Delete On Error GoTo 0 nbrRowsTable1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList").Range.Rows.Count ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList").Range.Range("$A$2:$C$" & nbrRowsTable1).Copy .Range.Range("$A$2").Resize(nbrRowsTable1 - 1, 3) End With End If End If End Sub Private Sub btnCopy2to1_Click() On Error Resume Next Table1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error GoTo 0 If IsEmpty(Table1) Then MsgBox "Table 1 does not exist", vbOKOnly, "Error" Else On Error Resume Next Table2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error GoTo 0 If IsEmpty(Table2) Then MsgBox "Table 2 does not exist", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") nbrRows = .Range.Rows.Count On Error Resume Next .Range.Range("$A$2:$C$" & nbrRows).Delete On Error GoTo 0 nbrRowsTable2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2").Range.Rows.Count ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2").Range.Range("$A$2:$C$" & nbrRowsTable2).Copy .Range.Range("$A$2").Resize(nbrRowsTable2 - 1, 3) End With End If End If End Sub Private Sub btnCreateTable1_Click() On Error Resume Next Table1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error GoTo 0 If Not IsEmpty(Table1) Then MsgBox "Table already exists", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1") .Cells(1, 1).Value = "Nbr" .Cells(1, 2).Value = "Name" .Cells(1, 3).Value = "Age" .Cells(2, 1).Value = "1" .Cells(2, 2).Value = "Eric" .Cells(2, 3).Value = "50" .Cells(3, 1).Value = "2" .Cells(3, 2).Value = "Bob" .Cells(3, 3).Value = "46" .Cells(4, 1).Value = "4" .Cells(4, 2).Value = "Jill" .Cells(4, 3).Value = "34" End With ActiveWorkbook.Sheets("Sheet1").ListObjects.Add(xlSrcRange, _ ActiveWorkbook.Sheets("Sheet1").Range("$A$1:$C$4"), , xlYes).Name = _ "AgeList" ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList").TableStyle = "TableStyleLight2" End If End Sub Private Sub btnCreateTable2_Click() Dim StartingRow As Integer StartingRow = 20 On Error Resume Next Table2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error GoTo 0 If Not IsEmpty(Table2) Then MsgBox "Table already exists", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1").Range("$A$" & StartingRow) .Cells(1, 1).Value = "Nbr" .Cells(1, 2).Value = "Name" .Cells(1, 3).Value = "Age" .Cells(2, 1).Value = "6" .Cells(2, 2).Value = "Autumn" .Cells(2, 3).Value = "33" .Cells(3, 1).Value = "7" .Cells(3, 2).Value = "Joe" .Cells(3, 3).Value = "56" .Cells(4, 1).Value = "8" .Cells(4, 2).Value = "Mary" .Cells(4, 3).Value = "48" End With ActiveWorkbook.Sheets("Sheet1").ListObjects.Add(xlSrcRange, _ ActiveWorkbook.Sheets("Sheet1").Range("$A$" & StartingRow & ":$C$" & (StartingRow + 3)), , xlYes).Name = _ "AgeList2" ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2").TableStyle = "TableStyleLight2" End If End Sub Private Sub btnDeleteRowTable1_Click() On Error Resume Next Table1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error GoTo 0 If IsEmpty(Table1) Then MsgBox "Table does not exist", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error Resume Next .Range.Rows(2).Delete On Error GoTo 0 End With End If End Sub Private Sub btnDeleteRowTable2_Click() On Error Resume Next Table2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error GoTo 0 If IsEmpty(Table2) Then MsgBox "Table does not exist", vbOKOnly, "Error" Else With ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error Resume Next .Range.Rows(2).Delete On Error GoTo 0 End With End If End Sub Private Sub btnDeleteTable1_Click() On Error Resume Next Table1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error GoTo 0 If Not IsEmpty(Table1) Then ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList").Delete Else MsgBox "Table does not exist", vbOKOnly, "Error" End If End Sub Private Sub btnDeleteTable2_Click() On Error Resume Next Table2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error GoTo 0 If Not IsEmpty(Table2) Then ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2").Delete Else MsgBox "Table does not exist", vbOKOnly, "Error" End If End Sub Private Sub btnInsertRowTable1_Click() On Error Resume Next Table1 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList") On Error GoTo 0 If IsEmpty(Table1) Then MsgBox "Table does not exist", vbOKOnly, "Error" Else Dim newRow As ListRow Set newRow = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList").ListRows.Add(AlwaysInsert:=True) With newRow.Range .Cells(1, 1).Value = 999 .Cells(1, 2).Value = "Bill" .Cells(1, 3).Value = 11 End With End If End Sub Private Sub btnInsertRowTable2_Click() On Error Resume Next Table2 = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2") On Error GoTo 0 If IsEmpty(Table2) Then MsgBox "Table does not exist", vbOKOnly, "Error" Else Dim newRow As ListRow Set newRow = ActiveWorkbook.Sheets("Sheet1").ListObjects("AgeList2").ListRows.Add(AlwaysInsert:=True) With newRow.Range .Cells(1, 1).Value = 888 .Cells(1, 2).Value = "Aaron" .Cells(1, 3).Value = 38 End With End If End Sub Private Sub btnListAllData_Click() Dim list As ListObject Dim out As String out = "" For Each list In ActiveWorkbook.Sheets("Sheet1").ListObjects out = out & "Table: " & list.Name & ": " & list.Range.Address & Chr(13) Dim nbrRows As Integer nbrRows = list.Range.Rows.Count For i = 1 To nbrRows out = out & list.ListColumns("Nbr").Range(i).Value & "|" & _ list.ListColumns("Name").Range(i).Value & "|" & _ list.ListColumns("Age").Range(i).Value & _ Chr(13) Next i Next lblDisplay.Caption = out End Sub Private Sub btnListAllTables_Click() Dim list As ListObject Dim out As String out = "" For Each list In ActiveWorkbook.Sheets("Sheet1").ListObjects out = out & "Table: " & list.Name & ": " & list.Range.Address & Chr(13) Next lblDisplay.Caption = out End Sub