Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA访问-如何从多个字段返回最大/最小值_Vba_Ms Access - Fatal编程技术网

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

VBA访问-如何从多个字段返回最大/最小值,vba,ms-access,Vba,Ms Access,我需要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 107

我需要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    
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
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
所需输出

Field     Force     Case  
Flxmax   1186.65   hs00p16025od
Flxmin   666.81    hs00p16010od
Frxmax   1397.8    hs00p16025od
Frxmin   -959.36   hs00p16025od
此外,如果表中有相同的最大/最小值,我只需要在结果中选择一个

除上述字段外,还有30个字段。我相信我必须循环遍历每个字段,直到到达末尾并记录最大/最小行,但我不确定如何编写此代码。任何帮助都会很好

当前代码

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    
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
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

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

修订代码

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    
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
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
Public Sub-Max()
Dim数据库作为DAO.Database
作为DAO.Recordset的Dim rs1
作为DAO.Recordset的Dim rs2
模糊fld为刀场
将新值变长
将newfield设置为字符串
作为字符串的Dim newcase
将SQL语句设置为字符串
Set db=CurrentDb
sqlStatement=“从强制中选择*
Set rs1=db.OpenRecordset(sqlStatement)
sqlStatement=“从结果中选择*
Set rs2=db.OpenRecordset(sqlStatement)
对于rs1.字段中的每个fld
rs1.1首先
newfield=fld.Name
如果newfield是“case”,那么
newvalue=rs1(newfield).Value
而不是rs1.EOF
如果Right(newfield,3)=“min”,则
如果newvalue>rs1(newfield).Value,则
newvalue=rs1(newfield).Value
newcase=rs1(“Case”)。值
如果结束
ElseIf Right(newfield,3)=“max”然后
如果newvalue

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

这不是完全重复的:我接受了您的建议,使用VBA而不是SQL,但我对VBA的经验较少。我没有收到任何进一步的回应,当我问一些代码,我可以参考。另外,我找不到关于循环字段的太多信息,所以我认为有必要问这个问题。它应该非常简单。正如我写的:<对于每个min/max字段,循环记录集一次(30000条记录并不多),找到min/max值,找到记录并将该记录写入另一个表。然后单击下一个字段,直到没有更多字段>。你试过什么?就像我说的,我对VBA及其语法很陌生。我已经添加了到目前为止我所写的内容。我根据我在网上找到的关于循环的代码改编了它。问题是它通过了每一个循环,但我想要一个循环,它的顺序是最大字段1,最小字段2,跳过字段3…重复。效果很好。我遇到的一个问题是,它不返回十进制值,只返回整数。我将newvalue改为双精度类型,并尝试直接从表[rs2!Force.Value=rs1(“Flxmax”).Value]中写入,以尝试完全消除newvalue变量——当然没有小数。错过了。请将newvalue设置为Currency或Double,并确保表Results中的字段也是这样的数据类型。