2010-07-02 67 views
0

我可能错过了一些简单的事情,但ListRows.Add让我感到悲伤。这里的功能:Excel VBA ListRows.Add Failed

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后的行都不会执行(至少这是调试器指示的内容),并且该行不会添加到表中。任何想法/想法?

更新:

这是我从帖子后学到的。如果我提供存根数据的Sub它工作正常。例如:

Sub driver() 
    Dim myTable As ListObject 
    Set myTable = getTableObject("myTableName") 
    Call addEmployee("myName", myTable) 
End Sub 

注意:通过工作表getTableObject循环,并返回具有匹配名称的的ListObject。

它似乎是一个处理代码被调用的上下文的问题。在失败的情况下,公式(函数调用)被放置在各种工作表的各个单元格中。该公式包含对其他单元格中的数据的引用。当其他单元格中的数据发生更改时,会调用该公式,然后调用上面给出的addEmployee Sub。这是失败的情况。

+0

你的代码工作正常,所以它必须是ListObject。你能否提供更多关于这可能与其他ListObjects不同的细节? – 2010-07-02 18:53:18

+0

宅男:看到我上面更新的帖子。 – Adam 2010-07-02 20:29:23

回答

1

看来,我试图做的是不可能的。

当你开发自定义功能, 理解函数之间的关键区别 但重要的是从其他VBA程序,您在工作表中使用公式 功能 你 电话。 工作表公式中使用的函数程序必须是被动的。 例如,功能 过程中的代码无法操作范围,或者 在工作表上发生更改。一个 的例子可以帮助明确这一点。

您可能很想写一个自定义的 工作表函数,它可以更改 单元格的格式。例如,它 可能会有用,具有 使用自定义函数根据 单元格的值更改单元格中的文本颜色的公式。尽可能地尝试, 然而,这样的功能是不可能的 写。无论你做什么, 函数都不会更改工作表。请记住,函数仅返回 值。它不能用 对象执行操作。

这就是说,我应该指出一个 值得注意的例外。 可以通过使用自定义VBA函数更改单元格中的文本评论 by 。

Walkenbach,J.(2007)。微软 办公室Excel 2007功率编程 与VBA。 John Wiley & Sons,第280页。

1

我明白这是一个非常古老的问题,但这是我在尝试回答自己时遇到过很多次的问题。我仍然不明白为什么会发生这种情况,但这是我的解决方法。

Sub AddRow() 
    Dim Tbl as ListObject 
    Dim MyColumn as Integer 

    Tbl.ListRows(1).Range.EntireRow.Insert 
    Tbl.ListColumns(MyColumn).DataBodyRange.Cells(1,1).Value = "My Value" 
End Sub 

通过添加新行的第一个现有条目上方,该表将自动调整下来如预期,那么我就可以开始写我的价值观到表中。

再一次,对于重振旧帖子感到抱歉,但我无法在其他地方找到适当的解决方案,所以这是我自己的解决方法,我希望在未来对其他人有所帮助。

0

在我的情况表是由一个列表框

Dim intClientRow As Integer 
Dim strLstSource As String 
strLstSource = frmHNW.lstB01People_List.RowSource 
frmHNW.lstB01People_List.RowSource = "" 
intClientRow = UpdateTableFromFrame(frmHNW.fraB01People, "Clients_tblClientDetails", True) 
If intClientRow > 0 Then 
    UpdateTableFromList frmHNW.lstB01Contact_Method, "ClientPeople_tblClientContactMethod", "=getClientID(" & intClientRow & ")" 
    UpdateTableFromList frmHNW.lstB01Pref_Days, "ClientPeople_tblClientPrefDay", "=getClientID(" & intClientRow & ")" 
    UpdateTableFromList frmHNW.lstB01Pref_Time, "ClientPeople_tblClientPrefTime", "=getClientID(" & intClientRow & ")" 
End If 

frmHNW.lstB01People_List.RowSource = strLstSource 

UpdateTableFromFrame形式适用lisrows.add方法列表框的源表的约束。经过数小时的测试后,我发现当我不删除列表来源时,我的listrows.add方法失败。所以我在调用UpdateTableFromFrame之前删除了列表框的rowsource,并在行添加完成后恢复。这解决了这个问题

0

这也困扰了我一段时间。 对我来说,似乎是在循环中调用ListRows.Add多次 - 导致发生此错误,并且有时会使Excel崩溃。 为我工作的解决方案:我添加的DoEvents的ListRows.Add命令后命令:

tbl.ListRows.Add 
DoEvents 
0

我知道这是一个古老的线程,我不想再后,我beleive我有一个解决方案这可能会帮助其他人。

我的剧本, 信息的快速一点我有ListRows.Add私人小组BTN_Save_DblClick 我打消了我所有的代码只留下这个模块,这让我吃惊的工作,所以我开始实施的每个子并发挥作用,直到我找到导致问题的那个人。

事实证明,(对我来说),因为我有UserForm_Initialize()私人小组代替公用Sub,这引起了ListRows设为失败,在这个过程中崩溃的Excel ..

因此,如果您遇到此问题,并且您有UserForm_Initialize(),请确保将其设置为Public而非Private。

无论如何,如果不工作,那么它消除一个简单的过程,删除所有的代码,除了一个与ListRows设为并添加每个子/函数每一次测试,直到找到造成问题的一个。

希望这会有所帮助。

编辑因此,这是一个临时的解决办法,它再次开始崩溃,所以我删除了userform_initialize内的代码行并再次将其固定它..这是太奇怪了,因为它是所有ComboBox1.RowSource =命名范围

我从来没有在Excel VBA之前出现过这类问题。

1

对不起,这个问题没有关系,但这是Google搜索类似的崩溃时出现的唯一一个StackOverflow帖子,由于其他原因。在ListRows.Add的崩溃广泛地困扰了我很长一段时间,所以分享了造成它的问题。

在工作表上有一个表格(比如MySourceTable)。在我的用户窗体中,ComboBox的RowSource是该表(MySourceTable [ColName])中的一列。在单击同一个用户窗体上的另一个按钮时,我使用ListRows.Add将新行插入此表并崩溃了Excel。如果这种情况与您的情况类似,请继续阅读。

崩溃是由ComboBox引起的,它仍然附着在表上,并且无法处理行的插入(请注意,它仍然是实例化的,因为在插入新行时我仍然在UserForm上)。很多的痛苦后,上方和下方插入以下行解决了这个问题为好:

comboSetSelect.RowSource = "" 
    Set newRow = myTable.ListRows.Add 
    comboSetSelect.RowSource = "MySourceTable[ColName]" 'col set in properties 

这分离从表中组合框插入新行之前,一旦插入后,再次更新组合框。此外,新插入的行的值(如果插入后立即更新)显示在ComboBox中。

+0

这发生在我身上(虽然有一个列表框),你的评论解决了它,谢谢!也许你可以发布这个作为维基问题,发布问题和答案?我相信很多人会喜欢它! – Variax 2017-11-20 10:56:37

0

ListObject.ListRows.Add失败的另一个原因可能是工作表保护。由于我没有在我的任何搜索结果中看到这一点,所以我想在此添加它以供将来参考。

如果工作表已被保护与应用ListObject.ListRows.Add

worksheet.Protect 

一定要

worksheet.Unprotect 

之前!