Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vba中使用变体是否对性能有害?_Vba_Variables_Vb6 - Fatal编程技术网

在vba中使用变体是否对性能有害?

在vba中使用变体是否对性能有害?,vba,variables,vb6,Vba,Variables,Vb6,我想标题很简单,将变量声明为变量而不是特定的数据类型对VBA的性能有什么影响 可能是因为我没有编程经验,但直觉上它会降低性能,因为计算机必须检查分配的数据类型,然后将变量更改为分配的数据类型,而不是立即将值分配给它。我找不到有关这方面的文献。在vba中使用变体对性能有害吗?-是的 应尽可能避免使用变体。(可能有一些合法用途) 这要看情况而定。变体比本机类型慢,但在大多数程序中,这一点都不重要。大多数宏都很小,在运行时会被编译,差异可能只有几微秒,这是您无法察觉的 变种有它们的优点,我爱它们 所以

我想标题很简单,将变量声明为变量而不是特定的数据类型对VBA的性能有什么影响

可能是因为我没有编程经验,但直觉上它会降低性能,因为计算机必须检查分配的数据类型,然后将变量更改为分配的数据类型,而不是立即将值分配给它。我找不到有关这方面的文献。

在vba中使用变体对性能有害吗?-是的

应尽可能避免使用变体。(可能有一些合法用途)


这要看情况而定。变体比本机类型慢,但在大多数程序中,这一点都不重要。大多数宏都很小,在运行时会被编译,差异可能只有几微秒,这是您无法察觉的

变种有它们的优点,我爱它们

所以这取决于你在做什么。如果您的程序在一眨眼之间运行,那么避免变体没有任何好处。如果需要时间,请键入您的变量(并正确声明对象-请参见下文)

如果性能是一个问题,那么除此之外还有其他问题,我将在下面提到

一般问题

设置属性或调用方法时,每个都是CPU中的函数调用。这意味着堆栈设置开销。函数调用比内联代码慢。出于同样的原因,在VBA中使用循环而不是函数

对于一个开始,不要一次又一次地指定所有这些属性。除非你改变它们,否则它们不会改变

With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = False
    .MatchFuzzy = False

    For loop to go through each word pair
        .Text = SrcText
        .Replacement.Text = DestText
        .Find.Execute Replace:=wdReplaceAll
    Next

End With
最小化圆点

因此,如果您对性能感兴趣,请最小化点(每个点都是一个查找),尤其是在循环中

有两种方法。一种方法是,如果要多次访问,则将对象设置为最低的对象

eg(较慢)

(更快,因为每次使用对象时都会忽略一个点)

第二种方法是使用。一次只能有一个处于活动状态

这跳过了100次查找

with wsheet
For x = 1 to 100
 msgbox .name
Next
end with
字符串压缩

不要一次连接一个字符的字符串。从VBScript程序员那里可以看到这一点。它需要50000字节以及许多分配和释放来生成一个100个字符的字符串

读取属性

不要重新读取未更改的属性,尤其是在进程外或后期绑定时。将它们放入一个变量中

对象类型

这里有两个概念-进程内或进程外和早期或晚期绑定

EXE文件连接到进程外。所有调用都通过RPC(一种网络协议)进行编组。Dllfiles正在处理中,函数调用通过跳转直接进行

早期绑定是
set x=objecttype
。编写程序时会查找函数。在执行时,程序被硬编码为跳转到该函数的vtable中存储的地址

后期绑定设置为
x=createobject(“objecttype”)
。每个函数调用都是这样的。“嗨,你有打印命令吗?”。“是的”,它回答说,“第三号命令”。“嗨,你能做第三个命令吗?”。“当然,结果是这样的”

来自Visual Basic概念(帮助的一部分)

通过优化Visual Basic解析对象引用的方式,可以使Visual Basic应用程序运行得更快。Visual Basic处理对象引用的速度可能受到以下因素的影响:

ActiveX组件是否已实现为进程内服务器或进程外服务器

对象引用是早期绑定还是后期绑定。通常,如果组件已作为可执行文件(.exe文件)的一部分实现,则它是进程外服务器,并在其自己的进程中运行。如果它已实现为动态链接库,则它是进程内服务器,并与客户端应用程序在同一进程中运行

使用进程内服务器的应用程序通常比使用进程外服务器的应用程序运行得更快,因为应用程序不必跨越进程边界来使用对象的属性、方法和事件。有关进程内和进程外服务器的更多信息,请参阅“进程内和进程外服务器”

如果对象引用使用声明为特定类变量的对象变量,则对象引用是早期绑定的。如果对象引用使用声明为泛型对象类变量的对象变量,则它们是后期绑定的。使用早期绑定变量的对象引用通常比使用晚期绑定变量的对象引用运行得更快

特定于Excel的

请从Microsoft人员处查看此链接。这是excel特有的,而不是VBA。自动计算和其他计算选项/屏幕更新等


.这篇文章很有趣!谢谢,如果没有链接中至少一个小的信息摘要,我会犹豫+1这个被接受的答案(万一链接不再可用)。
set xlapp = CreateObject("Excel.Application")
set wsheet = xlapp.worksheets(0)
msgbox wsheet.name
with wsheet
For x = 1 to 100
 msgbox .name
Next
end with