如何在MS Access VBA中选择前3个值

如何在MS Access VBA中选择前3个值,vba,ms-access,Vba,Ms Access,我有一张有10个文本框的表格。我想添加一个按钮,单击该按钮时,将显示一条包含前3个文本框值平均值的消息。其目的是在数据实际保存到数据库之前向用户显示信息 vba中是否有一个“top n”函数或某种聪明的方法 提前感谢。自己编写代码即可: 1) 首先,我们需要一个通用的排序例程,因此需要添加一个新的标准模块,以及类似以下代码的内容: Sub QuickSort(ByRef Values(), L As Long, R As Long) Dim I As Long, J As Long, Piv

我有一张有10个文本框的表格。我想添加一个按钮,单击该按钮时,将显示一条包含前3个文本框值平均值的消息。其目的是在数据实际保存到数据库之前向用户显示信息

vba中是否有一个“top n”函数或某种聪明的方法

提前感谢。

自己编写代码即可:

1) 首先,我们需要一个通用的排序例程,因此需要添加一个新的标准模块,以及类似以下代码的内容:

Sub QuickSort(ByRef Values(), L As Long, R As Long)
  Dim I As Long, J As Long, Pivot As Variant, Temp As Variant
  If (R - L) <= 0 Then Exit Sub
  Do
    I = L
    J = R
    Pivot = Values(CLng(L + (R - L) / 2))
    Do
      Do While Values(I) - Pivot < 0
        I = I + 1
      Loop
      Do While Values(J) - Pivot > 0
        J = J - 1
      Loop
      If I <= J Then
        If I <> J Then
          Temp = Values(I)
          Values(I) = Values(J)
          Values(J) = Temp
        End If
        I = I + 1
        J = J - 1
      End If
    Loop Until I > J
    If L < J Then QuickSort Values, L, J
    L = I
  Loop Until I >= R
End Sub
3) 在表单代码中,前三个值的平均值可以这样计算:

Const NumTextBoxCount = 10
Const NumTextBoxPrefix = "txtNum" 'alter as applicable

Function GetNumTextBoxTop3Avg() As Double
  Dim I As Integer, Nums(1 To NumTextBoxCount)
  For I = 1 To NumTextBoxCount
    Nums(I) = CDblDef(Me.Controls(NumTextBoxPrefix & I).Value, 0)
  Next I
  QuickSort Nums, LBound(Nums), UBound(Nums)
  GetNumTextBoxTop3Avg = (Nums(NumTextBoxCount) + Nums(NumTextBoxCount - 1) + Nums(NumTextBoxCount - 2)) / 3
End Function

Private Sub cmdShowTop3Nums_Click()
  MsgBox GetNumTextBoxTop3Avg
End Sub

按顺序命名文本框,txtbox1、txtbox2、txtbox3。。。使用for循环获取单个值并找到平均值。使用Me(“txtbox”&i)引用存储在文本框中的值。值我需要找到前3个值的平均值,而不是全部值。您需要遍历所有值,将它们收集到一个数组中,然后对它们进行排序。这是一些排序代码-
Const NumTextBoxCount = 10
Const NumTextBoxPrefix = "txtNum" 'alter as applicable

Function GetNumTextBoxTop3Avg() As Double
  Dim I As Integer, Nums(1 To NumTextBoxCount)
  For I = 1 To NumTextBoxCount
    Nums(I) = CDblDef(Me.Controls(NumTextBoxPrefix & I).Value, 0)
  Next I
  QuickSort Nums, LBound(Nums), UBound(Nums)
  GetNumTextBoxTop3Avg = (Nums(NumTextBoxCount) + Nums(NumTextBoxCount - 1) + Nums(NumTextBoxCount - 2)) / 3
End Function

Private Sub cmdShowTop3Nums_Click()
  MsgBox GetNumTextBoxTop3Avg
End Sub