我可能缺少一些简单的东西,但是 ListRows.Add 给我带来了悲伤。功能如下:
Sub addEmployee(employeeName As String, tableToAddTo As ListObject)
Dim newRow As ListRow
Set newRow = tableToAddTo.ListRows.Add()
newRow.Range.Cells(1, 1).Value = employeeName
tableToAddTo.Sort.Apply
End Sub
在大多数情况下,这可以正常工作。但是,只要函数在我的工作表中的某个表上运行,就永远不会执行对 ListRows.Add 的调用之后的行(至少这是调试器指示的行),并且该行也不会添加到表中。有 thoughts/ideas 吗?
更新:
这是自发布以来我学到的东西。如果我向 Sub 提供存根数据,则可以正常工作。例如:
Sub driver()
Dim myTable As ListObject
Set myTable = getTableObject("myTableName")
Call addEmployee("myName", myTable)
End Sub
注意:getTableObject 在工作表中循环,并返回具有匹配名称的 ListObject。
在处理调用代码的上下文时,这似乎是一个问题。在失败的情况下,公式(函数调用)已放置在各个工作表的各个单元格中。该公式包含对其他单元格中数据的引用。当其他单元格中的数据更改时,将调用该公式,该公式依次调用上面给出的 addEmployee Sub。这是失败的情况。
8 回答
看来我试图做的事是不可能的。
您可能很想编写一个可更改单元格格式的自定义工作表函数。例如,使用自定义函数的公式可以根据单元格的值更改单元格中文本的颜色,这可能会很有用。但是,请尽量尝试,但无法编写此类函数。无论您做什么,该功能都不会更改工作表。记住,一个函数只是返回一个值。它无法对对象执行操作。
也就是说,我应该指出一个值得注意的例外。通过使用自定义 VBA 功能,可以更改单元格注释中的文本。
Walkenbach,J。(2007)。使用 VBA 的 Microsoft Office Excel 2007 Power 编程。约翰·威利父子(John Wiley&Sons),第 280 页。
抱歉,这个问题无关紧要,但这是 Google 在搜索类似崩溃时出现的唯一 StackOverflow 帖子,原因是另一个原因。
ListRows.Add
上的崩溃在很长一段时间内都困扰着我,因此请与我分享引起该问题的原因。工作表上有一个表(例如 MySourceTable)。在我的用户窗体中,组合框的行来源是此表中的一列(MySourceTable [2])。在单击同一用户窗体上的另一个按钮时,我正在使用
ListRows.Add
将新行插入此表中,并使 Excel 崩溃。如果这种情况与您的情况相似,请继续阅读。崩溃是由仍连接到表的 ComboBox 引起的,并且无法处理行的插入(请注意,由于插入新行时我仍在 UserForm 上,因此仍在实例化)。经过很多痛苦之后,插入上方和下方的以下几行将其彻底解决:
这将在插入新行之前将 ComboBox 与表分离,一旦插入完成,请再次更新 ComboBox。此外,新插入的行的值(如果在插入后立即更新)也会显示在 ComboBox 中。
我知道这是一个非常老的问题,但这是我在尝试自己回答时遇到的许多次问题。我仍然不了解为什么会发生这种情况的具体信息,但这是我的解决方法。
通过在第一个现有条目上方添加新行,该表将自动按预期向下调整,然后可以开始将值写入该表。
再次,很抱歉恢复了旧帖子,但是我在其他地方找不到合适的解决方案,所以这是我自己的解决方法,希望对以后的其他人有所帮助。
在我的情况下,表由列表框绑定
UpdateTableFromFrame 窗体将 lisrows.add 方法应用于列表框的源表。经过数小时的测试,我发现当我不删除列表源时,我的 listrows.add 方法会失败。因此,在调用 UpdateTableFromFrame 之前,我删除了列表框的 rowsource,并在完成行添加后将其恢复。这样解决了问题
这也困扰了我一段时间。对我来说,似乎在一个循环中多次调用 ListRows.Add-导致发生此错误,有时会使 Excel 崩溃。适用于我的解决方案:我在 ListRows.Add 命令之后添加了 DoEvents 命令:
我知道这是一个旧线程,我不想 re-post,并且我相信我有一个可以帮助他人的解决方案。
关于脚本的快速信息,我在Private Sub BTN_Save_DblClick中有ListRows.Add,我删除了所有代码,只留下了这个模块,这让我惊讶,所以我开始实现每个子和函数,直到我到引起问题的那一个。
事实证明(对我而言)是因为我使用UserForm_Initialize()作为Private Sub而不是Public Sub,这导致ListRows失败,从而使 excel 崩溃。 。
因此,如果您遇到此问题,并且您拥有UserForm_Initialize(),请确保将其设置为 Public 而不是 private。
无论如何,如果那行不通,那就是一个简单的消除过程,删除除带有ListRows的代码之外的所有代码,并每次添加每个 sub/function 测试,直到找到导致问题的代码。
希望这可以帮助。
编辑这是一个临时修复,它再次崩溃,因此我删除了 userform_initialize 中的代码行,并再次对其进行了修复。这很奇怪,因为它所做的只是ComboBox1.RowSource=NamedRange。
我以前从未遇到过 Excel VBA 这样的问题。
ListObject.ListRows.Add
失败的另一个原因可能是工作表保护。由于我没有在任何搜索结果中看到此内容,因此我想在此处添加它以供将来参考。如果工作表已被保护
务必
先申请
ListObject.ListRows.Add
!简而言之
tab_.ListRows(1).Range.EntireRow.Insert可以(!)代替
tab_.ListRows.Add
使用。(就像SandPiper 的答案中已经建议的一样)
将其封装在一个更通用的函数中,该函数还返回
ListRow
:您可以这样使用它:**TabRowAdd(tab _)**而不是
tab_.ListRows.Add
可能的原因
如果当前表之下(或什至之下)还有其他 non-table 单元格,它将无法正常工作,因为(我猜)此其他内容的“ shifting-down”可能会导致 side-effects 变坏或变得更加复杂。
所以 e.g. 想象下面的表格布局,并且如何在表格 1 中插入一行 straight-forward? (通常 bad/stupid 布局-我知道:))
=>这并不容易,这就是为什么我想他们可能只检查 to-be-manipulated(插入 row/col,删除 row/col)表之下或之下是否存在 non-table 东西,并因此引发
1004
异常的原因。(也许甚至跟随“非
A
-column-starting”表也已经存在该问题-我没有检查)