VBA listobject 不会添加行
VBA listobject won't add rows
我有一个包含几张纸的 wb,每张纸有两个 tables(列表对象)。我还有一个用户表单,允许用户添加、编辑、删除 table 中的行。这些 table 是静态的,永远意味着它们永远存在并且永远不会被删除,它们位于同一个地方并且永远不会移动。我还通过索引或名称以不同方式引用了这些对象,以查看是否有所不同。
有时,当用户对任何 table 添加、编辑或删除时,我会收到 1004 运行时错误。不确定为什么,因为我知道该对象存在的事实。错误发生后,excel 似乎失控并关闭而不保存任何已完成的工作。在下面的代码中,错误发生在 tbl.ListRows.Add AlwaysInsert:=True
和许多其他类似的地方。
我读过有些情况 excel 忘记了那些对象,甚至忘记了 table 中有多少条记录。
我不确定我是否会得到关于为什么 Excel 这样做的答案...
我的问题是如何有效地捕获此错误并进行重置,这样 excel 就不会关闭。
Private Sub pg1AddDoCode_Click()
Dim tbl As ListObject
Dim lrow As Integer
Set tbl = ThisWorkbook.Worksheets("Constants").ListObjects("DoCode")
tbl.ListRows.Add AlwaysInsert:=True
lrow = tbl.ListRows.count
With tbl.ListRows(lrow)
.Range(1) = UCase(Me.pg1DoCode)
.Range(2) = UCase(Me.pg1DoName)
End With
ClearValues Me.MultiPage1.Pages(1).Controls
Me.pg1AddDoCode.Enabled = True
Me.pg1EditDoCode.Enabled = False
Me.pg1DelDoCode.Enabled = False
Me.pg1Query.RowSource = tbl.Name
Set tbl = Nothing
End Sub
我想我知道答案了:
您正在使用 Listobject 作为 RowSource。
这是我最近发现的危险。 喜欢硬撞危险。
执行以下操作:在操作列表对象之前,确保用户窗体的 ALL 元素的 Rowsource 设置为“”:
Me.pg1Query.RowSource = ""
因此行源设置为空字符串。因为如果你调整 table 的大小,那么 excel 的行源就会崩溃。
操作后您可以再次重置行源:
Me.pg1Query.RowSource = tbl.name
聚会迟到了,但我自己的问题是我将 sheet 滚动区域设置为 table 的尺寸,以防止用户滚动到我想隐藏的数据。不幸的是,这会阻止将行添加到 table。像这样的代码解决了这个问题(sWks
保存工作名称sheet):
ThisWorkbook.Worksheets(sWks).ScrollArea = "" 'Unlock table scroll to add a row
With ThisWorkbook.Worksheets(sWks).ListObjects(1)
.ListRows.Add AlwaysInsert:=True
End With
'Write to the added row, then lock scroll area to table again using:
With ThisWorkbook.Worksheets(sWks)
.ScrollArea = .ListObjects(1)
End With
我也有这个问题。参考@Lucas Raphael Pianegondas 的回答,下面的代码没有操纵行源,而是帮助我解决了问题:
tbl.ListRows.Add Position:=1, AlwaysInsert:=True
我还没有尝试过不同的姿势。
我有一个包含几张纸的 wb,每张纸有两个 tables(列表对象)。我还有一个用户表单,允许用户添加、编辑、删除 table 中的行。这些 table 是静态的,永远意味着它们永远存在并且永远不会被删除,它们位于同一个地方并且永远不会移动。我还通过索引或名称以不同方式引用了这些对象,以查看是否有所不同。
有时,当用户对任何 table 添加、编辑或删除时,我会收到 1004 运行时错误。不确定为什么,因为我知道该对象存在的事实。错误发生后,excel 似乎失控并关闭而不保存任何已完成的工作。在下面的代码中,错误发生在 tbl.ListRows.Add AlwaysInsert:=True
和许多其他类似的地方。
我读过有些情况 excel 忘记了那些对象,甚至忘记了 table 中有多少条记录。
我不确定我是否会得到关于为什么 Excel 这样做的答案...
我的问题是如何有效地捕获此错误并进行重置,这样 excel 就不会关闭。
Private Sub pg1AddDoCode_Click()
Dim tbl As ListObject
Dim lrow As Integer
Set tbl = ThisWorkbook.Worksheets("Constants").ListObjects("DoCode")
tbl.ListRows.Add AlwaysInsert:=True
lrow = tbl.ListRows.count
With tbl.ListRows(lrow)
.Range(1) = UCase(Me.pg1DoCode)
.Range(2) = UCase(Me.pg1DoName)
End With
ClearValues Me.MultiPage1.Pages(1).Controls
Me.pg1AddDoCode.Enabled = True
Me.pg1EditDoCode.Enabled = False
Me.pg1DelDoCode.Enabled = False
Me.pg1Query.RowSource = tbl.Name
Set tbl = Nothing
End Sub
我想我知道答案了:
您正在使用 Listobject 作为 RowSource。 这是我最近发现的危险。 喜欢硬撞危险。
执行以下操作:在操作列表对象之前,确保用户窗体的 ALL 元素的 Rowsource 设置为“”:
Me.pg1Query.RowSource = ""
因此行源设置为空字符串。因为如果你调整 table 的大小,那么 excel 的行源就会崩溃。
操作后您可以再次重置行源:
Me.pg1Query.RowSource = tbl.name
聚会迟到了,但我自己的问题是我将 sheet 滚动区域设置为 table 的尺寸,以防止用户滚动到我想隐藏的数据。不幸的是,这会阻止将行添加到 table。像这样的代码解决了这个问题(sWks
保存工作名称sheet):
ThisWorkbook.Worksheets(sWks).ScrollArea = "" 'Unlock table scroll to add a row
With ThisWorkbook.Worksheets(sWks).ListObjects(1)
.ListRows.Add AlwaysInsert:=True
End With
'Write to the added row, then lock scroll area to table again using:
With ThisWorkbook.Worksheets(sWks)
.ScrollArea = .ListObjects(1)
End With
我也有这个问题。参考@Lucas Raphael Pianegondas 的回答,下面的代码没有操纵行源,而是帮助我解决了问题:
tbl.ListRows.Add Position:=1, AlwaysInsert:=True
我还没有尝试过不同的姿势。