Forum Discussion
How do you create table that automatically add or delete rows?
- Aug 14, 2021
One way is to use VBA in order to achieve this functionality.
In the attached, you will find two tables named "Main" and "Change" where table "Main' contains some records. And once you start adding records in the Change Table, the Main Table will update accordingly.
The Sheet1 Module Contains the following Change_Event Code in it.
Private Sub Worksheet_Change(ByVal Target As Range) If Target.CountLarge > 1 Then Exit Sub Dim tblMain As ListObject Dim tblChange As ListObject Dim n As Variant Dim r As ListRow Set tblMain = ActiveSheet.ListObjects("Main") Set tblChange = ActiveSheet.ListObjects("Change") On Error GoTo Skip If Not Intersect(Target, tblChange.DataBodyRange.Cells) Is Nothing Then Application.EnableEvents = False If Target.Column = tblChange.DataBodyRange.Columns(1).Column Then n = Application.Match(Target.Value, tblMain.DataBodyRange.Columns(1), 0) If IsError(n) Then If tblMain.DataBodyRange.Cells(1) = "" Then Set r = tblMain.ListRows.Add(1) Else Set r = tblMain.ListRows.Add End If r.Range(1, 1).Value = Target End If Target.Offset(0, 2).Value = Date Target.Offset(0, 2).NumberFormat = "dd-mmm-yyyy" ElseIf Target.Column = tblChange.DataBodyRange.Columns(2).Column Then n = Application.Match(Target.Offset(0, -1).Value, tblMain.DataBodyRange.Columns(1), 0) If Not IsError(n) Then Set r = tblMain.ListRows(n) r.Range(1, 2).Value = r.Range(1, 2).Value + Target.Value If r.Range(1, 2).Value = 0 Then tblMain.ListRows(n).Delete End If End If Target.Offset(0, 1).Value = Date Target.Offset(0, 1).NumberFormat = "dd-mmm-yyyy" End If End If Skip: Application.EnableEvents = True End Sub
2nd, although I recognize those formula, but I have no idea how it is supposed to be implemented on the sheet.
I'm not that great with Excel so I can't comment on whether if this works the way I wanted it to. The commentor above, however, did achieve what I wanted it to do with bugs.
Still, thanks for looking into this. I'll have to revisit this sometime later. I'm still in the middle of learning VBA.
You are not alone. It happens frequently that the Excel 365 formulas I publish are not even recognised as spreadsheet formulas! I have tidied up the naming a little to make the quantities a little clearer.
= LET(
tool, UNIQUE(Change[Tool]),
stockQty, SUMIFS(Change[Qty], Change[Tool], tool),
stockTbl, CHOOSE({1,2}, tool, stockQty),
FILTER(stockTbl, stockQty>0))The formula that generates the table is in cell F3. A fairly normal trick for debugging a LET formula, is to return one of the local names at a time as the result of the calculation
= LET(
tool, UNIQUE(Change[Tool]),
stockQty, SUMIFS(Change[Qty], Change[Tool], tool),
stockTbl, CHOOSE({1,2}, tool, stockQty),
result, FILTER(stockTbl, stockQty>0),
stockTbl)By inspecting each name in turn, one is able to gain insight and debug the formula. So far, this only applies to Excel 365, but it represents the most profound change to occur in spreadsheet technology since they were first introduced in the 1980s.
This may represent the emergent butterfly, but many will continue to admire and play only with the caterpillars!