在vba的单个子/函数中可以使用多少个变量?

时间:2018-01-09 06:39:01

标签: excel vba excel-vba

我已经构建了一个简单的函数,但它需要大约11-12个具有相同整数类型的变量。每次我尝试使用超过10个变量时,第一个变量经常出错,而其他变量被正确计算。如果我将变量数减少到10,那么它们都是正确的。 这是否意味着hat vba一次只能存储10个相同类型的变量?或者是我的电脑'限制:))

这是我的代码,btb返回错误的值,而其他人是正确的,但如果我删除变量" a"和所有与之相关的代码,然后btb正确返回

Sub regionCount()
Dim btb, dbb, hn, ntb, dnb, tnbBS, tnbNS, hcm1, hcm2, hcm3, a As Integer

btb = dbb = hn = dnb = tnbBS = tnbNS = hcm1 = hcm2 = hcm3 = a = 0

For Each mycell In Worksheets(1).Range("E2:E382")
    If mycell.Value = "Khu vuc Bac Trung Bo" Then
        btb = btb + 1
    ElseIf mycell.Value = "Khu vuc Dong Bac Bo" Then
        dbb = dbb + 1
    ElseIf mycell.Value = "Khu vuc Ha Noi" Then
        hn = hn + 1
    ElseIf mycell.Value = "Khu vuc Nam Trung Bo" Then
        ntb = ntb + 1
    ElseIf mycell.Value = "Khu vuc Dong Nam Bo" Then
        dnb = dnb + 1
    ElseIf mycell.Value = "Khu vuc Tay Nam Bo  - Bac song hau" Then
        tnbBS = tnbBS + 1
    ElseIf mycell.Value = "Khu vuc Tay Nam Bo  - Nam song hau" Then
        tnbNS = tnbNS + 1
    ElseIf mycell.Value = "Khu vuc TPHCM_1" Then
        hcm1 = hcm1 + 1
    ElseIf mycell.Value = "Khu vuc TPHCM_2" Then
        hcm2 = hcm2 + 1
    ElseIf mycell.Value = "Khu vuc TPHCM_3" Then
        hcm3 = hcm3 + 1
    ElseIf mycell.Value = "-- None --" Then
        a = a + 1
    End If
Next mycell

Range("C5").Value = btb
Range("d5").Value = dbb
Range("e5").Value = hn
Range("f5").Value = ntb
Range("g5").Value = dnb
Range("h5").Value = tnbBS
Range("i5").Value = tnbNS
Range("j5").Value = hcm1
Range("k5").Value = hcm2
Range("l5").Value = hcm3
Range("m5").Value = a

End Sub

3 个答案:

答案 0 :(得分:5)

您的陈述

btb = dbb = hn = dnb = tnbBS = tnbNS = hcm1 = hcm2 = hcm3 = a = 0

应该是

btb = 0
dbb = 0
hn = 0
dnb = 0
tnbBS = 0
tnbNS = 0
hcm1 = 0
hcm2 = 0
hcm3 = 0
a = 0

考虑声明

a = b = c

这被解释为

a = (b = c)

其中(b = c)是一个逻辑表达式。因此,如果bc的值相同(如果变量全部保留为0的默认初始值,那么将会设置aTrue(即-1

你的语句布局方式会将最左边的值设置为-1(如果行中有奇数个变量)或者设置为0(如果你有一个偶数)。 / p>

还应该注意到

Dim btb, dbb, hn, ntb, dnb, tnbBS, tnbNS, hcm1, hcm2, hcm3, a As Integer

相当于

Dim btb As Variant, dbb As Variant, hn As Variant, ntb As Variant, dnb As Variant, _
    tnbBS As Variant, tnbNS As Variant, hcm1 As Variant, hcm2 As Variant, _
    hcm3 As Variant, a As Integer

不一样
Dim btb As Integer, dbb As Integer, hn As Integer, ntb As Integer, dnb As Integer, _
    tnbBS As Integer, tnbNS As Integer, hcm1 As Integer, hcm2 As Integer, _
    hcm3 As Integer, a As Integer

答案 1 :(得分:2)

  

单个项目最多可包含32,000个"标识符" (任何   非保留关键字),包括但不限于表格,   控件,模块,变量,常量,过程,函数和   对象。请注意,标识符的实际数量仅限于   可用内存。

     

Visual Basic中的变量名称不能超过255个字符,   并且表单,控件,模块和类的名称不能   超过40个字符。 Visual Basic对实际没有限制   项目中不同对象的数量。

     

代码限制

     

可以加载到表单,类或标准中的代码量   模块限制为65,534行。一行代码可以包含   最多1023个字节。在实际之前最多可以有256个空格   文本在一行上,并且不超过二十四行继续   字符(_)可以包含在一个逻辑行中。

     

程序,类型和变量对数量没有限制   每个模块的程序。每个过程最多可包含64K的代码。   如果过程或模块超出此限制,Visual Basic将生成一个   编译时错误。如果遇到此错误,则可以避免此错误   将极大的程序分解成几个较小的程序,   或者将模块级声明移动到另一个模块中。

     

Visual Basic使用表来存储标识符的名称(变量,   代码中的过程,常量等)。每张桌子都有限   至64K。

     

DLL声明表每个表单和代码模块都使用包含的表   描述DLL入口点的结构。每个结构都使用   产生大约40个字节,总限制大小为64K   每个模块允许大约1,500个声明。

     

项目名称表整个应用程序使用单个表   包含所有名称。其中包括:

     

常量名称

     

变量名称

     

用户定义 - 类型定义名称

     

模块名称

     

DLL-procedure声明名称项目名称表不受限制   在总大小,但仅限于32K区分大小写独特   条目。如果达到限制,请重新使用私有标识符   不同的模块将唯一条目的数量限制为32K。

     

导入表每个对不同模块中的标识符的引用   在导入表中创建一个条目。每个这样的条目至少是   24字节,限制为64K,大约2,000   每个模块的引用。

     

模块条目表该表最多可接受每个模块125个字节,   总限制为64K,每个项目产生约400个模块。

     

以下限制适用于Visual Basic中的变量   语言。

     

表单,标准和类模块数据数据段(即,   任何VBA模块的声明部分中定义的数据   Visual Basic中的窗体或模块最大可达64K。这个数据段   包含以下数据:

     

使用Static声明的局部变量。

     

除数组和可变长度字符串之外的模块级变量。

     

每个模块级数组和可变长度字符串的4个字节。   程序,类型和变量如果程序或模块超出了   64K代码限制,Visual Basic生成编译时错误。

     

如果定义一个具有64K以上局部变量的过程   定义后,您会收到错误"太多的本地非静态变量。"

     

如果定义模块级别超过64K的模块   定义的变量,或者如果定义大于的用户定义类型   64K,你得到错误"固定或静态数据不能大于   64K"

     

如果您遇到此错误,可以通过极端破坏来避免此错误   大程序分成几个较小的程序,或通过移动   模块级声明到另一个模块。

     

声明为变量的数组不会影响整个大小   阵列;只有数组描述符计入64K限制。   因此,例如,可以接受诸如Dim之类的声明   x(1000000)在过程或模块级别中作为字节。在......之外   但是,如果声明一个大的固定大小,则会出现内存问题   记录中的数组,然后将这些记录的实例声明为   变量

     

用户定义的类型用户定义类型的变量不能超过64K,   虽然用户定义类型中的可变长度字符串的总和可以   超过64K(可变长度的字符串每个只占4个字节   用户定义的类型;存储字符串的实际内容   分别)。用户定义的类型可以根据其他类型定义   用户定义的类型,但类型的总大小不能超过64K。

     

堆栈空间过程中的参数和局部变量占用堆栈   运行时的空间。模块级和静态变量不占用   堆栈空间,因为它们是在表单的数据段中分配的   或模块。您调用的任何DLL过程都使用此堆栈   执行。

     

Visual Basic本身使用一些堆栈用于其自身目的,例如   在评估表达式时存储中间值。

     

Visual Basic的总可用堆栈大小为每兆字节(1MB)   线。然而,如果存在相邻的堆叠,堆栈可能会超出此范围   自由记忆。

     

更多信息有关节省堆栈空间的提示,请参阅   "设计性能和兼容性。"

来自https://msdn.microsoft.com/en-us/library/aa716295(v=vs.60).aspx及附近的页面。

答案 2 :(得分:2)

您的代码至少有两个问题:

  1. 声明不正确

    Dim btb, dbb, hn, ntb, dnb, tnbBS, tnbNS, hcm1, hcm2, hcm3, a As Integer
    

    允许在一行上进行多个声明,但每个变量都需要自己的As部分。目前,只有a被声明为Integer,其他人将被Variant。改为:

    Dim btb As Integer, dbb As Integer, hn As Integer, ntb As Integer, dnb As Integer, tnbBS As Integer, tnbNS As Integer, hcm1 As Integer, hcm2 As Integer, hcm3 As Integer, a As Integer
    
  2. 不允许在一行上进行多次分配,只执行第一次分配。所以在这种情况下:

    btb = dbb = hn = dnb = tnbBS = tnbNS = hcm1 = hcm2 = hcm3 = a = 0
    

    只有btb的值更改为False

    dbb = hn = dnb = tnbBS = tnbNS = hcm1 = hcm2 = hcm3 = a = 0 
    

    评估为False