Forum Discussion
How do you create table that automatically add or delete rows?
- Aug 15, 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
Are you able to point me to some sources for learning what it is you did and maybe the topics that can quickly guide me. Or should I learn whatever it is from scratch? Thank you,
It is just a regular Excel formula. OK, not so regular since most users will not recognise the formula as Excel! The following announces that LET is now generally available on Excel 365.
LET Generally Available (microsoft.com)
Searches of the Microsoft site should give links to the introduction of Dynamic Arrays (2018), the Announcement of LET and, still on insider beta channels the announcement of Lambda functions and Lambda helper functions that feed array parameters into Lambda functions and collect the results to form an array of results.
It all represents the most dramatic change imaginable.
- MailutorontoAug 17, 2021Copper ContributorI have gathered some answers to my question above, but was your Tools table adding rows and deleting rows depending on the changes in the tools?
- PeterBartholomew1Aug 18, 2021Silver Contributor
Sadly some of my naming was not helpful. In the following
FILTER(stockQty, stock>0)the first term was a two column array of tool name and its total quantity. The second was the stock quantity. What FILTER does is retain the rows that satisfy the condition
stock > 0so giving a fully dynamic result that changes as the data is revised. I used LET simply because that is the way I program Excel. In this instance it would be pretty easy to do without by nesting the variable definitions within the final formula.
= FILTER( CHOOSE( {1,2}, UNIQUE(Change[Tools]), SUMIFS(Change[Qty], Change[Tools], tool)), SUMIFS(Change[Qty], Change[Tools], tool)>0) )- MailutorontoAug 24, 2021Copper ContributorWhere are you entering these codes? They look very much like VBA (I'm in the middle of learning).
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.