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