vba 数组运算运算速度慢怎么办?

VBA代码运行太慢,求优化代码提升速度,谢谢!_百度知道
VBA代码运行太慢,求优化代码提升速度,谢谢!
):C400&quot:=Range(&查询表过度表&B1,C列的 支持度是 A2 与B列各编码 匹配后他们相应的 支持度(数据来源于 支持度表格A列与4行交叉的数据)
D列的 置信度是 A2 与B列各编码 匹配后他们相应的 置信度(数据来源于 置信度表格A列与4行交叉的数据)
然后对B;):=xlDescending, 1) ThenFor x = 2 To 400For p = 1 To 400If Sheets(&quot:=xlSortNormal
With ActiveWorkbook.MatchCase = False
.Cells(p:D进行排序(按C列倒序)
求优化代码;置信度&查询表过度表&quot:=xlFirstesc, 2) Then
Sheets(&C2;);支持度&quot.ScreenUpdating = TrueEnd SubSub 排序()On Error GoTo esc Application.Worksheets(&quot.Cells(p;查询表过度表&););).Add Key.Cells(p.Cells(2:
在A2输入一个原始商品编号;查询表过度表&quot,谢谢, i) Like Sheets(&quot, 1) Like Sheets(&quot!Sub 匹配支持度数据()On Error GoTo esc A);), 1) Like Sheets(&置信度&);置信度&quot.ScreenUpdating = FalseDim i As IntegerDim p As IntegerDim b As IntegerFor i = 1 To 400If Sheets(&quot.Worksheets(&quot.SortF);)).Cells(4;查询表&查询表过度表&quot:=xlSortOnValues,提升速度, i)
Call 匹配置信度esc.Sort查询表过度表&支持度&).ScrollWorkbookTabs Position.Cells(x;), 2) Then
Sheets(&quot.ScreenUpdating = FalseDim i As IntegerDim p As IntegerDim b As IntegerFor i = 1 To 400If Sheets(&quot, B列为匹配商品编号 .SortMethod = xlPinYin
.Cells(p;支持度&quot:
Application.Cells(x.ScreenUpdating = False
ActiveWorkbook, DataOption.Orientation = xlTopToBottom
.Cells(2.SetRange Range(&查询表过度表&quot.ScreenUpdating = True
Sheets(&quot:
Application.Clear
ActiveWorkbook, 3) = Sheets(&), i)
Call 排序esc.Cells(x.Cells(4, i) Like Sheets(&quot.Sort.Apply
ActiveW查询表过度表&) _
.Header = xlYes
, 1) ThenFor x = 2 To 400For p = 1 To 400If Sheets(&quot.Cells(x, SortOn, 4) = Sheets(&quot:D400&quot.ScreenUpdating = TrueEnd SubSub 匹配置信度()On Error GoTo esc Application.SortFields.Worksheets(&quot, Order说明;查询表过度表&quot.Sort
支持度&quot。总循环次数是各层循环次数的乘积:各表的数据可以先存入数组;)?有这么多列;);)的第1-400列数据:arr=Sheets(&quot, 1) Then 需要比较Sheets(&quot,并用数组进行处理,所以应根据实际行、列确定各层循环次数(最小).Cells(4, i) Like Sheets(&查询表过度表&quot,arr(1,arr(1。比如语句.Cells(2,3)=C4:D4&quot.range(&支持度&);支持度&quot?循环次数直接与运算量相关,arr(1。 问题2,比直接读取单元格值提高速度N倍,2)=B4;),可以将区域数据存入数组arr其中arr(1;A4,1)=A4问题1:For i = 1 To 400If Sheets(&quot
其他类似问题
为您推荐:
其他2条回答
就会快一点了;查询表过度表&quot。如果确实要榨出一点汁来,但就算是1万次的循环都是很慢的了.Cells(2;),直接获取单元格的值,也不是没有;);).Cells(4,相当于有400列第一句话If Sheets(&查询表过度表&支持度&quot, i) Like Sheets(&quot, 1) 这个对象是没有变量的,以后在大循环中直接使用变量,所以可以先在一开始定义一个变量。比如 Sheets(&), 1) Thencells(4,你的循环从1到400。VBA本来就是慢的,可能有部分循环没有发生,后面的p循环时就用变量?您的总循环次数是400 * 400 * 400 =
次.Cells(2,这个,其中由于if的逻辑。又如,可以在for x语句下就用一个变量获取出来,Sheets(&quot.Cells(x;查询表过度表&quot, 2),i),i 所在的位置表示列
这里有一些很明显的问题。首先这些for 没必要叠在一起。叠在一起的运算量是400*400*400。不叠起来只需要400*400 400。然后就是你的程序的bug。当有很多个匹配时你的程序取的是最后的那个匹配。如果你本来就是这么打算的,就没必要从头开始匹配。直接从最后找到一个匹配的就结束。我给你改一下效果完全一样:For i = 400 To 1 step -1If Sheets(&置信度&).Cells(4, i) Like Sheets(&查询表过度表&).Cells(2, 1) Then exit fornextFor x = 2 To 400For p = 400 To 1 step -1If Sheets(&置信度&).Cells(p, 1) Like Sheets(&查询表过度表&).Cells(x, 2) ThenSheets(&查询表过度表&).Cells(x, 4) = Sheets(&置信度&).Cells(p, i)exit forEnd IfNextNext手机打的没试过。你主要看思路
vba的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁19条优化VBA,让VBA运行速度更快的建议之上篇 Excel教程
作者:Excel教程
浏览:2022次
  VBA代码的优化,不仅能使代码容易读懂,同时,更能让代码功能更加强大,另外,还能让VBA代码的执行速度更快。   以下是优化VBA代码的一些方法,希望对您有所帮助。  1、尽量简化代码   通过简化代码,可以提高程序的性能。您可以将通用过程编写为子过程来调用。例如,假设有一个应用程序需要在不同的地方实现查找一定范围内的某个特殊条目,在一个没有简化代码的应用程序中,不同的过程可能需要应用各自的算法以实现在某个范围内查找某一条目,修改每个过程使其采用一个更有效的算法并不是一件很容易的事。而一个简化的程序则只有一个查找算法,即将该查找算法编写成通用的子程序,需要查找某个范围的过程都调用该子程序,通过在查找方法的子程序中优化查找算法,使得调用该方法的所有过程都享受性能提高所带来的好处。   另外,删除所有无关的代码,这在所录制宏中表现得尤为明显。在录制宏时,经常会产生一些与所实现的功能无关的代码,您可以将这些代码删除,以使得代码得以简化。   在下面将要讲到的设置对象变量代替长对象引用,使用With…End With语句、执行For Each…Next循环语句,根据程序环境尽量减少OLE引用,等等,均是简化代码的好方法。   2、强制声明变量   在VBE 编辑器中的菜单“工具#8212;#8212;选项”对话框中“编辑器”选项卡中,您应该始终保持“要求变量声明”复选框被选中,这样将在模块代码顶部出现Option Explicit语句,要求您在编写代码时对所有出现的变量均进行声明,这样,在使用变量时减少内存需求并加速性能。   A:要节省内存资源,必须始终用特定的数据类型声明所有变量。如果不使用特定的数据类型声明变量,VBA会创建Variant类型的变量,这将比任何其他数据类型要求更多的内存。   B: 清楚每种数据类型需要多少内存以及它可以存储的值的范围。除使用较小的数据类型会导致隐性转换的情况外,应始终使用尽可能小的数据类型。例如,因为 Integer类型的变量将被转换成Long类型的变量,应该将那些存储整型值的变量声明为Long类型,而不是Integer类型。   C:除非确实需要,应避免使用浮点数据类型。尽管Currency数据类型更大,但它比 Single 数据类型快,因为Currency数据类型不使用浮点处理器。   E:如果在一个过程中多次引用一个对象,可以创建对象变量,并将对给对象的引用指派给它。因为对象变量存储对象在内存中的位置,VBA将不必再次查找其位置。   F:将对象变量声明为特定的类型(不是Object类型),以便利用早期绑定。   3、减少变量的作用范围并及时释放变量   主要是对象变量,在其使用完后,及时释放。例如,   Dim TempObj As AnyObject,AnObj As AnyObject   Set TempObj=New AnyObject   Set AnObj=TempObj   Set TempObj=Nothing #8216;释放对象变量   4、关闭屏幕刷新   在Excel 中,其ScreenUpdating属性值的默认值为True,这样当写数据到工作表或者执行任何导致其显示属性变化的动作时,Excel的屏幕界面将会不断的刷新,不仅影响显示,而且影响程序运行的速度。您可以在进入主程序运行前将屏幕刷新属性关闭,即用 Application.ScreenUpdating = False语句关闭屏幕刷新,这样将大大改善程序的运行速度。   但在程序运行完成前,要确保将其恢复为原来的设置,即将ScreenUpdating属性的值设置为True。因为您对该属性的修改是永久性的修改,Excel不会为您自动恢复其默认值,您必须用语句Application.ScreenUpdating = True恢复设置。   5、设置计算模式为手动   如果您的工作表中含有多个公式,在每次单元格中的值发生变化时,公式都将会重新计算,这会影响程序运行速度。您可以在进入主程序运行前,将计算模式设置为手动,即使用如下语句Application.Calculation = xlCalculationManual,以避免不必要的计算。   当程序运行结束前,您要恢复Excel的默认计算模式设置,即设置为自动重算,可使用下面的语句Application.Calculation = xlCalculationAutomatic,这同ScreenUpdating属性一样,Excel不会自动恢复其为默认值。Calculation 属性是对所有工作簿进行的设置,您也可以用工作表的EnableCalculation属性来设置对某个工作表是否进行重新计算。   6、使用For Each…Next循环   可以使用For Each…Next循环来保证程序代码更快地执行。在使用For Each…Next循环时,对于存储在集合或数组中的每个对象执行一组语句,程序更简洁,也更容易阅读、调试和维护。当For Each…Next语句迭代集合时,自动指定一个对集合当前成员的引用,然后在到达集合的尾部时跳出循环语句。   7、使用With…End With语句   可以使用With…End With语句来尽量减少对象引用。使用With语句对指定的对象完成一系列的任务,而不用重复引用对象。也可以使用嵌套的With语句进一步提高程序代码的效率。例如,下面的使用With…End With语句是在同一个单元格中执行多个操作。   With Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”)   .Formula=”=SQRT(20)”   With .Font   .Name=”Arial”   .Bold=True   .Size=10   End With   End With   同理,可使用With…End With语句在同一个单元格区域中执行多个操作。   8、在执行循环时考虑如何能够尽可能地节省资源   A:分析循环以查看是否正在不必要地执行一些消耗内存的重复操作。例如,是否可以在循环外(而不是在循环中)设置某些变量?每次都通过循环执行的转换过程是否可以在循环之外执行?   B:考虑是否必须在满足特定的条件时才执行循环。如果是,也许可以更早地退出循环。例如,假设正在对一个不应该包含数字字符的字符串进行数据验证。如果循环要检查字符串中的每个字符以确定其中是否包含数字字符,那么您可以在找到第一个数字字符时立即退出循环。   C:如果必须在循环中引用数组的元素,可以创建一个临时变量存储该元素的值,而不是引用数组中的值。从数组中检索值比从相同类型的变量读取值要慢。   9、尽量减少OLE引用   可以通过尽量减少在VBA程序代码中使用OLE(对象链接与嵌入自动识别)引用来优化程序代码。VBA语句中所调用的方法和属性越多,执行语句所用的时间就越多。例如下面的两个语句:   语句1:Workbooks(1).Sheets(1).Range(“A1”).Value=10   语句2:ActiveWindow.Left=200   执行时,语句2比语句1快。   同样,上面所讲的对重复使用的对象引用指定一个变量,通过调用变量从而保证避免多次进行对象引用。   接下篇…
19条优化VBA,让VBA运行速度更快的建议之上篇 Excel教程的发表时间是: 07:22:08&来源:
爱盲网提供盲人无障碍浏览《19条优化VBA,让VBA运行速度更快的建议之上篇 Excel教程》,感谢作者:Excel教程撰稿!
<div class="number" id="DiggNum_访问本页面,您的浏览器需要支持JavaScript访问本页面,您的浏览器需要支持JavaScript

我要回帖

更多关于 excel vba 逻辑运算符 的文章

 

随机推荐