Foxtable(狐表)用户栏目专家坐堂 → 请教vba


  共有2229人关注过本帖树形打印复制链接

主题:请教vba

帅哥哟,离线,有人找我吗?
hb8888
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:392 积分:2927 威望:0 精华:0 注册:2020/1/22 20:48:00
请教vba  发帖心情 Post By:2021/7/16 17:52:00 [只看该作者]

大师:请问一个excel文件中的各表之间公式较多,打开文件较慢,有何办法能快速打开文件?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106665 积分:542508 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/17 8:48:00 [只看该作者]

我没有办法。去execl论坛咨询一下哪些老execl用户

 回到顶部
帅哥哟,离线,有人找我吗?
tommargq2
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:57 积分:437 威望:0 精华:0 注册:2021/5/12 16:59:00
  发帖心情 Post By:2021/7/17 9:06:00 [只看该作者]

excel公式数量多或者经常使用SUMIFS或Sumproduct这种遍历函数会严重拖慢EXCEL的运算,几点开发建议给你(我自己搭建系统亲测过的):

1、将Excel的公式改为手动计算,并在前提信息录入完成后统一计算。

2、使用代码+公式结合的形式,例如如果有多个工作表结构一样,可将标准结构设置成Model1工作表,预留某个单元格记录各级别名称,并将涉及级别差异带来的计算差异,用公式指向该单元格。然后根据前提中多个级别信息,利用宏自动复制Model1工作表名并改名为各级别名称,并在固定的单元格位置记录级别名称。

3、非固定的跨工作表计算(比如各级别汇总计算),采用宏计算比公式计算要快。

 

亲测我公司一项目,采用上述思维,将35分钟的运行速度,优化到了1.5分钟


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106665 积分:542508 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/17 9:55:00 [只看该作者]

以下是引用tommargq2在2021/7/17 9:06:00的发言:

excel公式数量多或者经常使用SUMIFS或Sumproduct这种遍历函数会严重拖慢EXCEL的运算,几点开发建议给你(我自己搭建系统亲测过的):

1、将Excel的公式改为手动计算,并在前提信息录入完成后统一计算。

2、使用代码+公式结合的形式,例如如果有多个工作表结构一样,可将标准结构设置成Model1工作表,预留某个单元格记录各级别名称,并将涉及级别差异带来的计算差异,用公式指向该单元格。然后根据前提中多个级别信息,利用宏自动复制Model1工作表名并改名为各级别名称,并在固定的单元格位置记录级别名称。

3、非固定的跨工作表计算(比如各级别汇总计算),采用宏计算比公式计算要快。

 

亲测我公司一项目,采用上述思维,将35分钟的运行速度,优化到了1.5分钟

图片点击可在新窗口打开查看,用多了就有经验。我很少使用execl,对这个基本没有发言权

 回到顶部
帅哥哟,离线,有人找我吗?
hb8888
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:392 积分:2927 威望:0 精华:0 注册:2020/1/22 20:48:00
  发帖心情 Post By:2021/7/17 10:37:00 [只看该作者]

谢谢!兄台如果能提供一个实例那就万分感谢了!

 回到顶部
帅哥哟,离线,有人找我吗?
tommargq2
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:57 积分:437 威望:0 精华:0 注册:2021/5/12 16:59:00
  发帖心情 Post By:2021/7/17 11:26:00 [只看该作者]

公司的文件都是自动加密且内部流通,解密权在领导那里,没办法发上来,抱歉

 回到顶部
帅哥哟,离线,有人找我吗?
tommargq2
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:57 积分:437 威望:0 精华:0 注册:2021/5/12 16:59:00
  发帖心情 Post By:2021/7/17 11:36:00 [只看该作者]

不太明白你在foxtable论坛中咨询这个问题的原因,

猜想是后台调用Excel时,由于Excel有大量的公式,导致文档打开速度过慢?

在EXCEL文件->选项->公式页面中,将自动计算改为手动计算,可以加速文件的打开速度。

另外有一些复杂的公式,可以采用在文件中设置宏进行计算的方式,这样可以避免大量的计算情况,需要计算时直接运行宏即可。

比如,我有一项工作,是根据不同的项目(每个子项目一张工作表,每个项目子项目数不固定),有一个汇总页批量加权计算所有子项目的和。

由于公式的跨表计算太复杂,就写成了宏进行该项计算,然后通过foxtable调用该VBA完成计算,测试该计算时间从10+min,变到了30s左右。

 

Sub Refsh_date()
On Error Resume Next
Dim inum As Double
Dim xn As Double
Debug.Print Time
Application.Calculate
Application.Calculation = xlCalculationManual
ThisWorkbook.Worksheets("Carline").Unprotect Password:="Pec8888!!"
For irow = 11 To 147
    With ThisWorkbook.Worksheets("Carline")
        If .Cells(irow, 4) = "" Then GoTo SkipLable:
        If .Cells(irow, 5) = "A" Then
            For icol = 10 To 138
                If .Cells(7, icol).Value <> 0 Then
                    inum = 0
                    For J = 6 To 25
                        sheet_name = Sheets("商品").Cells(J, 3)
                        If sheet_name <> "" Then
                            If Sheets(sheet_name).Cells(irow, icol) <> "" Then
                                inum = Sheets(sheet_name).Cells(irow, icol) + inum
                            End If
                        Else
                            Exit For
                        End If
                    Next
                    .Cells(irow, icol) = inum
                    inum = 0
                End If
            Next
        End If
            
        If .Cells(irow, 5) = "B" Then
            For icol = 10 To 138
                If .Cells(7, icol).Value <> 0 Then
                    inum = 0
                    xn = .Cells(11, icol).Value
                    For J = 6 To 25
                        sheet_name = Sheets("商品").Cells(J, 3)
                        If sheet_name <> "" Then
                            If Sheets(sheet_name).Cells(irow, icol) <> "" Then
                                inum = Sheets(sheet_name).Cells(irow, icol) * Sheets(sheet_name).Cells(11, icol) / xn + inum
                            End If
                        Else
                            Exit For
                        End If
                    Next
                    .Cells(irow, icol) = inum
                    inum = 0
                End If
            Next
        End If
       
SkipLable:
    End With
Next

Debug.Print Time
Dim sh As Worksheet
sh = ThisWorkbook.Worksheets("Carline")
ThisWorkbook.Worksheets("Carline").Protect Password:="Pec8888!!", DrawingObjects:=True, Contents:=True, Scenarios:=True, userInterFaceonly:=True, AllowFormattingColumns:=True
sh.EnableOutlining = True
On Error Resume Next
     For Each sh1 In Sheets
     sh1.Outline.ShowLevels RowLevels:=0, ColumnLevels:=2
     Next
Application.Calculation = xlCalculationAutomatic
End Sub


 回到顶部
帅哥哟,离线,有人找我吗?
tommargq2
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:57 积分:437 威望:0 精华:0 注册:2021/5/12 16:59:00
  发帖心情 Post By:2021/7/17 11:48:00 [只看该作者]

简而言之,打开表慢主要是每次打开时公式自动计算,且复杂公式较多导致的。

那就不如换个思路,关闭自动计算,表中只留简单计算(比如四则运算,sum,avg等非数组公式,注:sumifs和sumproduct等同于数组公式)

涉及到复杂计算就改为宏计算,设置一键运行按钮实现随时调用。

这样就可以保证excel文档打开时不涉及大批量的数组运算,打开速度自然就上去了


 回到顶部
帅哥哟,离线,有人找我吗?
tommargq2
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:57 积分:437 威望:0 精华:0 注册:2021/5/12 16:59:00
  发帖心情 Post By:2021/7/17 11:52:00 [只看该作者]

如果是后台调用,不需要前段显示的EXCEL,可以在foxtable打开workbook前,把application的事件通知EnableEvents,剪切板模式CutCopyMode,显示刷新ScreenUpdating,和警告通知DisplayAlerts这几个事件提前关掉,计算方式改为手动计算Application.Calculation = xlCalculationManual,
再运行workbook.open,就可以减少foxtable打开对应文档时的速度。

 回到顶部