VBA:以编程方式获取长限制

VBA:以编程方式获取长限制,vba,Vba,在VBA中是否有一种方法可以通过编程方式获取数值类型的限制(例如,Long) >类似于C++中的数字限制::()/> > .< /p> 不,但是它们是固定大小的,因此可以直接推断它们。 以下是有关其尺寸的一些信息: 从文章中: 整型和长型数据类型都可以包含正值或负值。它们之间的区别在于大小:整数变量的值可以在-32768和32767之间,而长变量的值可以在-2147483648到2147483647之间。传统上,VBA程序员使用整数来保存较小的数字,因为它们需要较少的内存。但是,在最新版本中,

在VBA中是否有一种方法可以通过编程方式获取数值类型的限制(例如,
Long


<> >类似于C++中的<代码>数字限制::()/> > .< /p> 不,但是它们是固定大小的,因此可以直接推断它们。

以下是有关其尺寸的一些信息:

从文章中:

整型和长型数据类型都可以包含正值或负值。它们之间的区别在于大小:整数变量的值可以在-32768和32767之间,而长变量的值可以在-2147483648到2147483647之间。传统上,VBA程序员使用整数来保存较小的数字,因为它们需要较少的内存。但是,在最新版本中,VBA将所有整数值转换为Long类型,即使它们被声明为integer类型。因此,使用整数变量不再有性能优势;事实上,长变量可能会稍微快一些,因为VBA不必转换它们


我不认为有这样的功能。我会为每种数字类型创建一个常量值库,然后您可以引用它

Sub highlong()
Dim x As Long
On Error GoTo Prt
Do While True
   x = x + 1
Loop
Prt:
   MsgBox (x)
End Sub

任何能让你的船漂浮的东西。

对于带有32位关节的编程平台:“Dim Item1 As Long”,变量的长度为32位。这意味着每个长变暗的变量是32位的。它能包含的最大值(正或负)略高于20亿

    Sub sumall() 
    Dim firstRow As long
   firstRow = 5
   Dim lastRow Aslong
   lastRow = 12
  Dim aRow As long
  Dim sumall As Variant
  Dim sumResult As Variant
  sumResult = 0
  Dim previousValue As Variant

  previousValue = -1
  For aRow = firstRow To lastRow
    If Cells(aRow, 2).Value <> previousValue Then
        sumResult = Cells(aRow, 2).Value
        previousValue = Cells(aRow, 2)
    End If
  Next aRow
sumall = sumResult
End Sub

如果假设所有类型都有符号,并且LenB将正确返回值的大小(以字节为单位)(不添加任何填充),则可以使用
min=-2^((LenB(value)*8)-1)
max=((2^((LenB(value)*8)-2))-1)*2)+1
计算它们的范围。后者中更复杂的数学是避免溢出-即对于32位有符号整数计算2^30,减1,乘2,加1,得到
(2^30-1)*2+1
=
2^31-1
,实际上正如你在回答中提到的,“固定大小”根据你的Office版本而不同,处理器架构,有时您甚至可能会想到天气。因此,如果您构建了一些您希望在不考虑这些更改的情况下可重用的东西,那么构建具有静态值的模块将使您失败。@user3819867建议的解决方案虽然非常原始且效率很低,但似乎解决了这个问题。我要做的(实际上我正在考虑)是将这两种方法结合起来——构建一个改进版的函数来识别max,并将其包装在一个模块中。如果您更正缩进,它看起来会更好
                Sub sumall()
                Dim objDictionary As Object
                Dim firstRow As Long
                firstRow = 5
                Dim lastRow As Long
                lastRow = 12
                Dim aRow As Variant
                Dim varKey As Variant
                Dim sumResult As Variant


                Set objDictionary = CreateObject("Scripting.Dictionary")

                For aRow = firstRow To lastRow
                        If objDictionary.exists(Cells(aRow, 2).Value) = False Then
                        objDictionary.Add Cells(aRow, 2).Value, True
                        End If

                Next aRow
                sumResult = 0
                For Each varKey In objDictionary.keys
                sumResult = varKey + sumResult
                Next varKey

                End Sub