教程 | Excel性能优化方法(七)

01

使用 SUBTOTAL

使用 SUBTOTAL 函数可以 SUM 筛选的列表。 SUBTOTAL 函数很有用,因为与 SUM 不同,它会忽略以下内容:

  • 因筛选列表导致的隐藏行。从 Excel 2003 开始,还可以使 SUBTOTAL 忽略所有隐藏行,而不仅仅是筛选掉的行。

  • 其他 SUBTOTAL 函数。

02

使用 AGGREGATE

AGGREGATE 函数是一种计算 19 种不同聚合数据方法的强大而高效的方法(如 SUMMEDIANPERCENTILE 和 LARGE)。 AGGREGATE 具有选项来忽略隐藏行或筛选掉的行、错误值和嵌套的 SUBTOTAL 和 AGGREGATE 函数。

03

避免使用 DFunctions

DSUMDCOUNTDAVERAGE 等 DFunctions 的速度比等效的数组公式快得多。DFunctions 的缺点是条件必须在一个单独的区域内,这使得在许多情况下使用和维护它们都不切实际。从 Excel 2007 开始,应使用 SUMIFSCOUNTIFS 和 AVERAGEIFS 函数而不是 DFunctions。

04

代码运行时禁用某些功能

为了提高 VBA 宏的性能,在执行代码时显式关闭不需要的功能。通常,在代码运行后进行一次重新计算或一次重绘就足够了,并且可以提高性能。在代码执行之后,将功能恢复到其原始状态。

在执行 VBA 宏时,通常可以禁用以下功能:

  1. Application.ScreenUpdating 关闭屏幕更新。

    如果将 Application.ScreenUpdating 设置为 False,Excel 不会重绘屏幕。在代码运行时,屏幕会快速更新,通常用户不需要查看每个更新。在代码执行之后更新一次屏幕,可以提高性能。

  2. Application.DisplayStatusBar关闭状态栏。

    如果将 Application.DisplayStatusBar 设置为 False,Excel 将不显示状态栏。状态栏设置与屏幕更新设置是分开的,这样即使屏幕没有更新,也可以显示当前操作的状态。但是,如果不需要显示每个操作的状态,在代码运行时关闭状态栏也可以提高性能。

  3. Application.Calculation 切换到手动计算。

    如果将 Application.Calculation 设置为 xlCalculationManual,则 Excel 仅在用户显式启动计算时才计算工作簿。在自动计算模式下,Excel 决定何时进行计算。例如,每当与公式相关的单元格值发生变化时,Excel 都会重新计算该公式。如果将计算模式切换到手动,则可以等到与公式相关的所有单元格更新后再重新计算工作簿。通过在代码运行时仅在必要的情况下重新计算工作簿,可以提高性能。

  4. Application.EnableEvents 禁用事件。

  5. 如果将 Application.EnableEvents 设置为 False,Excel 将不引发事件。如果有加载项在侦听 Excel 事件,这些加载项在记录事件时将消耗计算机上的资源。如果加载项没有必要记录代码运行时发生的事件,则关闭事件可以提高性能。

  6. ActiveSheet.DisplayPageBreaks 禁用分页符。

    如果将 ActiveSheet.DisplayPageBreaks 设置为 False,Excel 将不显示分页符。不需要在代码运行时重新计算分页符,并且在代码执行后计算分页符可以提高性能。

05

单个操作读写大数据块

通过显式减少数据在 Excel 和代码之间传输的次数来优化代码。与其一次循环单元格来获取或设置一个值,不如在一行中获取或设置整个单元格区域内的值,根据需要使用包含二维数组的变体来存储值。下面的代码示例比较这两个方法。

以下代码示例显示了未优化的代码,它以一次一个的方式循环遍历单元格来获取和设置单元格 A1:C10000 的值。这些单元格不包含公式。

  Dim DataRange as Range  Dim Irow as Long  Dim Icol as Integer   Dim MyVar as Double   Set DataRange=Range("A1:C10000")   For Irow=1 to 10000       For icol=1 to 3          ' Read the values from the Excel grid 30,000 times.          MyVar=DataRange(Irow,Icol)           If MyVar > 0 then               ' Change the value.              MyVar=MyVar*Myvar               ' Write the values back into the Excel grid 30,000 times.              DataRange(Irow,Icol)=MyVar          End If       Next Icol   Next Irow

以下代码示例显示了优化后的代码,它以一次全部的方式使用数组来获取和设置单元格 A1:C10000 的值。这些单元格不包含公式。

Dim DataRange As Variant  Dim Irow As Long   Dim Icol As Integer   Dim MyVar As Double   ' Read all the values at once from the Excel grid and put them into an array.  DataRange = Range("A1:C10000").Value2   For Irow = 1 To 10000       For Icol = 1 To 3           MyVar = DataRange(Irow, Icol)           If MyVar > 0 Then               ' Change the values in the array.              MyVar=MyVar*Myvar               DataRange(Irow, Icol) = MyVar           End If       Next Icol   Next Irow   ' Write all the values back into the range at once.  Range("A1:C10000").Value2 = DataRange

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容