Tag: listobject

Excel列表 – 对象VBA性能错误?

我在使用列表对象(AKA Excel表格)的Excel应用程序中遇到问题。 我怀疑这可能是一个错误,但尽pipe我谷歌search我找不到任何参考。 我已经为我的应用程序开发了一个解决方法,但是我感兴趣的是如果任何人都可以提供任何洞察,为什么会发生这种情况。 注意:我在Windows Vista上使用Excel 2007。 设置如下:我有一个电子表格,其中保存的数据列表对象,VBA代码可以通过命令button启动; 此代码可能会对工作表上的任意数量的单元格进行多次编辑,因此在任何编辑之前,Excel的“计算”模式都设置为“手动”。 我遇到的问题是,如果当前活动的单元格在列表对象中,那么将计算模式设置为手动似乎没有任何效果。 所以,如果用户在同一个实例中碰巧有一个繁重的计算工作簿打开,那么VBA代码运行非常缓慢。 我实际上不得不拉我的申请,发现这是由活动单元格造成的; 我用这个场景的简单版本创build了一个新的工作簿,以确认我的应用程序没有某种forms的损坏。 我已经做了一些testing用例,下面是我发现的结果: 虽然看起来一般与计算有关,但当计算模式在“手动”和“自动”之间切换时,仍然存在时间差… 手动= 7.64秒 自动= 9.39秒 手动模式比自动模式less了20%。 但我的期望是他们会差不多,考虑到即使在手动模式下,问题似乎也是开始计算。 比较,当活动单元格不在列表对象,并且结果是巨大地不同… 手动= 0.14秒 自动= 3.23秒 现在,“手动”运行速度提高了50倍,“自动运行”显示计算时间不应超过3.2秒! 所以现在第一个testing看起来好像在手动模式下可能运行了两次计算,在自动模式下运行了近三次。 再次重复这个testing,这次是在没有任何单元格的计算公式的情况下,突然它似乎不是很糟糕, 活动单元格是List Object&Calc手动= 0.17秒 活动单元格是List Object&Calc是Automatic = 0.20秒 活动单元格为空并且Calc是手动= 0.14秒 活动单元格为空并且Calc自动= 0.18秒 这个速度还是比较慢,但是现在只有10-20%,不会让人觉察。 但是这确实表明这个问题必须以某种方式与计算相关,否则就应该和第一次testing一样长。 如果有人想创build这些testing来自己看,设置如下: 添加了List对象的新工作簿(不必链接到任何数据) 加一些计算公式(我刚做'= 1 * 1'重复了3万次) 写一个快速的VBA代码, (i)循环数百次单元格的简单编辑,(ii)并logging花费的时间 然后在更改列表对象和空单元格之间的活动单元的同时运行代码 我会非常感兴趣的是,如果有人能够解释为什么Excel会以这种方式行事,并且是一个错误,或者是否有一些与List对象有关的function,这些function实际上有一些真正的用途? 谢谢,斯图尔特

如何在没有任何数据行的情况下读取Excel Table / ListObject中的计算列公式

我有一个ListObject与外部查询作为数据源,它返回18列。 ListObject先前已经添加了4个计算列。 现在,ListObject有0个数据行,但是,有0个数据行,我似乎无法读取计算列的预定义公式。 如果我刷新数据源,并且数据源至less返回1行,则计算列的公式变得可读。 同样,如果我手动在其中一个非计算列中input数据,以便至less有一行,则计算的列公式是可读的。 有没有办法确定什么是计算列公式是没有添加任何数据到列表对象?

Excel VBA:如何检查计算列?

无论如何检查VBA是否Excel中的一个表(ListObject)的特定列是一个计算列(如在http://office.microsoft.com/en-us/excel-help/use-calculated-columns- in-an-excel-table-HA010342380.aspx )? 请注意,计算的列不仅将为每行设置相同的R1C1公式集,还将在添加新行时自动展开(如果删除整个数据体范围,然后重新创build一些新行,它甚至会重新填充)。 因此检查具有一致公式的列与检查计算公式不同。 甚至可以计算一列,但是可以用其他公式或值覆盖其中一行,并使自动扩展function保持不变。 所以我相当确信这是列的一些属性,我只是不知道在哪里可以通过VBA访问它。 如果它没有通过VBA对象模型暴露出来,是否有一些workarround来获得这个信息? 在此先感谢,卡洛斯 编辑:我做了一些挖掘Excel Office打开XML文件,事实certificate,我正在寻找的是<tableColumn> xl \ tables \ table * .xml文件的<tableColumn>定义的元素。 有没有办法通过VBA来实现? 编辑2:这是一个与我可以想出testing用例的示例文件 。 VBA应该表示第1,2和3列是计算列,第4列和第5列不是。

循环遍历ListObject中的行来删除它们是非常缓慢的

我有一个〜500行的ListObject表,我也有一个命名的范围内的4个值。 对于500行,可能会重复(随机)出现30个唯一值,我想删除其值不在指定范围内的所有行。 我有以下的工作,但它比预期的运行速度慢(约2分钟): Sub removeAccounts() Dim tbl As ListObject Dim i As Integer Set tbl = ThisWorkbook.Sheets("TheSheet").ListObjects("TheTable") i = tbl.ListRows.Count While i > 0 If Application.WorksheetFunction.CountIf(Range("Included_Rows"), tbl.ListRows(i).Range.Cells(1).Value) = 0 Then tbl.ListRows(i).Delete End If i = i – 1 Wend End Sub 我不确定是对工作表函数的依赖,还是只是循环放慢行速度。 有没有办法来过滤listobject并放弃其余的? 我正在考虑只是夹一个进度条,让用户可以看到发生的事情…

在Excel Listobject / Table中通过VBA添加/修改/删除计算的列公式

如果我手动将公式input到Excel表(即ListObject)的列中,自动更正将此公式应用于整个列。 有没有办法通过VBA来控制这种行为,即我可以以某种方式修改/删除/添加此公式? 我知道我可以简单地改变ListObject.ListColumns(1).DataBodyRange对象的公式 – 但是这将覆盖之前input的任何手动值 – 而在UI中更改公式将离开这个原封不动的…

如何在处理表格时编写清晰且可维护的代码?

在我的项目中,我经常利用表和底层的ListObjects和ListColumns。 我喜欢它们,因为它们比裸露的Range对象更容易引用和更新。 然而,我仍然没有find一种理智和可维护的方式来处理由多个ListColumns组成的多个ListObjects,并在项目中的所有Worksheet中被引用。 比方说,我有工作表(与(名称)属性设置为“WorksheetA”)包含表(称为TableA)与less数列(称为Column1,Column2,…,Column10)。 现在我想引用另一个Worksheet的代码中的一列。 我可以这样做: WorksheetA.ListObjects("TableA").ListColumns("Column7") 现在,直接使用string是一个糟糕的做法,因为它很难维护,容易出错。 所以现在怎么办? 我可以创build专用的模块来存储我的string作为常量。 例如,称为“常量”的模块: Public Const TABLE_A As String = "TableA" Public Const COLUMN7 As String = "Column7" 然后我的参考可以转换为: WorksheetA.ListObjects(Constants.TABLE_A).ListColumns(Constants.COLUMN7) 但是,这个解决scheme有一些缺点: 在添加每个表格和列的情况下,常量模块会快速增长。 引用本身增长,变得不太可读。 所有与所有工作簿中的表相关的常量被扔进一个巨大的坑里。 我可以在WorksheetA中存储常量,并通过公共函数使其可用: Private Const TABLE_A As String = "TableA" Private Const COLUMN7 As String = "Column7" Public Function GetTableAName() As String GetTableAName = TABLE_A End […]

CurrentRegion.SpecialCells(xlCellTypeVisible)太慢 – 提高性能的提示?

我试图自动化有5个不同的信息来源的报告。 我尝试使用ListObjects将不同的表组合成一个单独的表,除非当我复制第一个ListObject的第一列时,一切正常。 复制第一列大约需要2分钟,接下来的列不到1秒。 每次运行VBA脚本时,我都会删除目标表中的所有行,以便使用带有0行的ListObject来启动VBA脚本。 我会试着解释它是如何工作的: Sub ProcesarPresupuesto() 'This is the first macro that process and copy the information of the first source Application.ScreenUpdating = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManual '<Here> I add several columns and process the information of this first source, I keep all the rows as values using the Function: AddColumnFormula […]