如何在VBA中定义结构? Delphi "record" 命令的替代方法

How to define structure in VBA? Alternative to Delphi "record" command

我是 VBA 的新手。我想定义我自己的结构,就像在 Delphi 中是这样的:

type Name = Record
    Declarations ...
end; 

例如在Delphi中我会写:

type TNUMBER = Record
    value: integer;
    min: integer;
    max: integer;
    count: byte;
    processed: boolean;
end; 

var my_numbers: array[0..74] of TNUMBER;
i: integer;
range: byte;
begin
range := 7;
for i:=0 to 74 do
  if not my_numbers[i].processed then
    begin
      my_numbers[i].value := round(somenumber);
      my_numbers[i].min := my_numbers[i].value-range;    
      my_numbers[i].max := my_numbers[i].value+range;
      my_numbers[i].count := 0;
    end
  else
    begin
      if (somenumber >= my_numbers[i].min) AND
         (somenumber <= my_numbers[i].max) then
        begin
          inc(my_numbers[i].count);  ' increase counter
        end;
    end;

所以我声明了包含各种成员的类型或结构TNUMBER。然后我创建了这种类型的数组,我处理数字并更改变量 my_numbers 引用的记录。所以我需要为 VBA 创建类似的结构来计算从 Excel 单元格中获得的数字。这个结构的目的是计算数字是否彼此太近或者它们是否足够远以(决定是否)在我的图表绘图上画一个点或圆。

您可以像这样重写 VBA 中的示例:

Option Explicit

Private Type TNUMBER 'Or Public if needed in another module
    value As Integer
    min As Integer
    max As Integer
    count As Byte
    processed As Boolean
End Type

Public Sub test()
    Dim my_numbers(0 To 74) As TNUMBER
    Dim i As Integer
    Dim range As Byte
    Dim somenumber As Double

    range = 7
    For i = 0 To 74
        If Not my_numbers(i).processed Then
            my_numbers(i).value = Round(somenumber)
            my_numbers(i).min = my_numbers(i).value - range
            my_numbers(i).max = my_numbers(i).value + range
            my_numbers(i).count = 0
        Else
            If (somenumber >= my_numbers(i).min) And _
               (somenumber <= my_numbers(i).max) Then
                my_numbers(i).count = my_numbers(i).count + 1
            End If
        End If
    Next i
End Sub

然后你当然会执行test方法。

此外,您不想使用:
For i = 0 To 74
但你会使用:
For i = LBound(my_numbers) To UBound(my_numbers)
因此,如果数组大小发生变化,代码仍会运行。