VBA Access - 如何从多个字段返回最大值/最小值

Posted

技术标签:

【中文标题】VBA Access - 如何从多个字段返回最大值/最小值【英文标题】:VBA Access - How to return max/min from multiple fields 【发布时间】:2015-03-09 15:27:39 【问题描述】:

我需要有关 Microsoft Access 中的一些 VBA 代码的帮助,这些代码将为下面的每个字段生成最大值/最小值并返回相应的大小写

力表

case            Flxmax   Flxmin  Frxmax  Frxmin 
hs00p16010od    582.24   666.81  796.44  -451.15    
hs00p16015od    878.7    878.7   1096.3  -500.36    
hs00p16020od    1071.95  1071.9  1281.2  -743.05    
hs00p16025od    1186.65  1186.6  1397.8  -959.36    

期望的输出

Field     Force     Case  
Flxmax   1186.65   hs00p16025od
Flxmin   666.81    hs00p16010od
Frxmax   1397.8    hs00p16025od
Frxmin   -959.36   hs00p16025od

此外,如果表中有相同的最大值/最小值,我只需在结果中选择一个。

除了上面显示的字段外,还有 30 个附加字段。我相信我必须遍历每个字段,直到我到达末尾并记录最大/最小行,但我不确定如何编写这段代码。任何帮助都会很棒。

当前代码

Public Sub Max()

Dim sqlStatement As String
Dim rs1 As Object
Dim rs2 As Object
Dim fld As Field
Dim strName As String
Dim maximum As Long
Dim minimum As Long

 sqlStatement = "SELECT * FROM Force;"
 Set rs1 = CurrentDb().OpenRecordset(sqlStatement)

 sqlStatement = "SELECT * FROM Results;"
 Set rs2 = CurrentDb().OpenRecordset(sqlStatement)

 rs2.AddNew      'Add new record to result table

 'Field order to loop though: max, min, skip, max, min, skip...where skip implies a skipped field

 For Each fld In rs1.Fields
 With rs1
     maximum = DMax(fld, Force)
     'Write onto results tables
 End With

 Next fld

 rs2.Update  'Update results table

 Set rs1 = Nothing
 Set rs2 = Nothing

End Sub

【问题讨论】:

这不是完全重复的:***.com/questions/28907636/… 好吧,我接受了您的建议,使用 VBA 而不是 SQL,但我对 VBA 的经验较少。当我要求提供一些我可以参考的代码时,我没有收到任何进一步的回复。另外,我找不到太多关于循环字段的信息,所以我认为值得提出这个问题。 确实应该很简单。正如我所写: 。你试过什么? 好吧,就像我说的,我对 VBA 及其语法很陌生。我已经添加了我到目前为止所写的内容。我根据我在网上找到的关于循环的代码对其进行了改编。问题是它会遍历每一个循环,但我想要一个顺序为 max field1、min field 2、skip field 3...repeat 的循环。 【参考方案1】:

你很接近。基本上缺少的是每个最小/最大字段值都必须单独添加/更新到目标表。

修改后的代码

Public Sub Max()

    Dim db As DAO.Database
    Dim rs1 As DAO.Recordset
    Dim rs2 As DAO.Recordset
    Dim fld As DAO.Field
    Dim newvalue As Long
    Dim newfield As String
    Dim newcase As String
    Dim sqlStatement As String

    Set db = CurrentDb

    sqlStatement = "SELECT * FROM Force;"
    Set rs1 = db.OpenRecordset(sqlStatement)

    sqlStatement = "SELECT * FROM Results;"
    Set rs2 = db.OpenRecordset(sqlStatement)

    For Each fld In rs1.Fields
        rs1.MoveFirst

        newfield = fld.Name
        If newfield <> "case" Then
            newvalue = rs1(newfield).Value
            While Not rs1.EOF
                If Right(newfield, 3) = "min" Then
                    If newvalue > rs1(newfield).Value Then
                        newvalue = rs1(newfield).Value
                        newcase = rs1("Case").Value
                    End If
                ElseIf Right(newfield, 3) = "max" Then
                    If newvalue < rs1(newfield).Value Then
                        newvalue = rs1(newfield).Value
                        newcase = rs1("Case").Value
                    End If
                End If
                rs1.MoveNext
            Wend

            rs2.AddNew
                rs2!Field.Value = newfield
                rs2!Force.Value = newvalue
                rs2!Case.Value = newcase
            rs2.Update
        End If
    Next fld

    Set fld = Nothing
    Set rs1 = Nothing
    Set rs2 = Nothing
    Set db = Nothing

End Sub

这是航空代码,我没有测试数据。您可能需要添加一些错误处理。

【讨论】:

效果很好。我遇到的一个问题是它不返回十进制值,只返回整数。我将 newvalue 更改为 Double 类型,并尝试直接从表中写入 [rs2!Force.Value = rs1("Flxmax").Value] 以尝试完全消除 newvalue 变量——没有小数。 当然。错过了。执行 Dim newvalue As Currency 或 Double 并确保表 Results 中的字段也是这种数据类型。

以上是关于VBA Access - 如何从多个字段返回最大值/最小值的主要内容,如果未能解决你的问题,请参考以下文章

可以通过 VBA 更改 MS Access 子表单字段吗?

MS-Access 获取字段值,通过 VBA 函数运行,并发送到 SQL

如何从同一数据库的 VBA 代码中的 MS ACCESS 中提取字段

ACCESS/VBA:插入自动编号字段返回恼人的警告

MS Access中的VBA中不接受变量名称

Access VBA:导入多个文件时添加“文件名”字段