使用 VBA 观察列中值的减少

问题描述 投票:0回答:2

我对 VBA 和编程非常陌生。我需要计算 MS Access 列中一行中的值相对于前一个值减少的次数。我创建了一个带有对话框的 Access 表单,其中显示了 VBA 代码的输出。以下是该程序的示例:

因此,对于包含条目的列的以下快照:[23, 34, 22, 55, 65, 34, 77, 24, 30, 29]。该列的预期程序的输出(在表单对话框中)是 4,因为列中的值比前一个值减少了 4 倍。

Example

vba ms-access for-loop while-loop do-while
2个回答
0
投票

我能想到的唯一方法是假设您知道行的正确顺序,这涉及(在逻辑意义上)其他一些单调递增的列。假设是 Field1,即主键。那么这样的事情就可以了:(lv = left-val, rv = right-val)

select
     lv.Field2 as HigherVal
   , rv.Field2 as LowerVal
from MyTable as lv
inner join MyTable as rv
    on lv.Field1 = rv.Field1 + 1
where
     lv.Field2 > rv.Field2

or to get counts...

select
     count()
from MyTable as lv
inner join MyTable as rv
    on lv.Field1 = rv.Field1 + 1
where
     lv.Field2 > rv.Field2

如果您没有单调的 Field1,则必须添加一个排名字段(排名 1、2、3、4...)来建立数据的正确顺序,并且这样做时没有间隙它。


0
投票

通常我会尽量不回答

OP
没有尝试过任何事情的问题,但在这种情况下我会例外:

  1. 尝试将列转换为数组。
  2. 一旦获得数组,只需循环遍历它即可:

.

Option Explicit

Public Sub TestMe()

    '2
    Debug.Print CountDecrements(Array(1, 2, 3, 2))

    '-1,-3, 5
    Debug.Print CountDecrements(Array(1, -1, -3, 100, 101, 5))

End Sub

Public Function CountDecrements(myArray As Variant) As Long

    Dim k               As Double
    Dim previousValue   As Double
    Dim result          As Long

    For k = LBound(myArray) To UBound(myArray)
        If k = LBound(myArray) Then
            previousValue = myArray(k)
        Else
            If previousValue > myArray(k) Then result = result + 1
            previousValue = myArray(k)
        End If
    Next k

    CountDecrements = result

End Function

CountDecrement()
函数只是计算前一个值比当前值小多少次。结果保存在
result
变量中。

© www.soinside.com 2019 - 2024. All rights reserved.