Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Ms access 将记录列表传递给Access 2010中的函数_Ms Access_Vba_Ms Access 2010 - Fatal编程技术网

Ms access 将记录列表传递给Access 2010中的函数

Ms access 将记录列表传递给Access 2010中的函数,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,早些时候,我在Excel中编写了一个VBA函数,它将一个范围作为输入,并对其进行一些数学运算。我现在正在Access中编写一个查询,并尝试对表执行等效操作。。。我知道你可以选择SUM(table.field)作为SumOfField。。。如何使用类似的输入编写自己的方法?每当我尝试它时,它似乎是作为一个标量传递的,而不是我可以为每一次传递的可求和列表 编辑:为了澄清,我试图编写一个像Sum()或StDev()这样的函数,对整个列进行操作。我已经找到了很多关于如何编写在单个元素上运行的函数的示例,

早些时候,我在Excel中编写了一个VBA函数,它将一个范围作为输入,并对其进行一些数学运算。我现在正在Access中编写一个查询,并尝试对表执行等效操作。。。我知道你可以选择SUM(table.field)作为SumOfField。。。如何使用类似的输入编写自己的方法?每当我尝试它时,它似乎是作为一个标量传递的,而不是我可以为每一次传递的可求和列表

编辑:为了澄清,我试图编写一个像Sum()或StDev()这样的函数,对整个列进行操作。我已经找到了很多关于如何编写在单个元素上运行的函数的示例,但它们不是我所需要的。当我键入MyStDev(table.field)时,传递给函数的是什么?如何使用它


关闭编辑:经过进一步研究,Access似乎不支持编写自己的聚合函数,尽管它的内置函数采用了一致的格式。我讨厌魔法功能。我只需要将数据导出到excel之类的东西中,在那里我可以根据自己的意愿进行计算。

要计算标准偏差,您只需要计算值,然后就可以简单地使用

例如

SELECT StDev(VALUE) AS MyStdev
FROM TableA
where  Date>'12/31/2012'
GROUP BY ID
HAVING ID="AAPL"
更新: 在这种情况下,有几种方法可以做到这一点,我可以想到的一种方法是编写一个接受某些参数(通常是id)的函数,并使用该id从表中选择记录(如果需要,则连接表)并执行必要的数学运算

Public Function MyStdev(ID as integer) As double
 Dim rst As Recordset
 Dim strSQL As String
 Dim std as double
 strSQL = "<Your SQL statement goes here>    
 Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)        
If rst.EOF = False Or rst.BOF = False Then
 rst.MoveFirst
 std = rst!FieldName
End If
'Do something with your values and return 
 Set rst = Nothing
 MyStdev=std    
End Function
公共函数MyStdev(ID为整数)为双精度
将rst设置为记录集
作为字符串的Dim strSQL
双精度标准差
strSQL=”
Set rst=CurrentDb.OpenRecordset(strSQL,dbOpenDynaset)
如果rst.EOF=False或rst.BOF=False,则
rst.MoveFirst
std=rst!字段名
如果结束
“用你的价值观做点什么,然后返回
设置rst=无
MyStdev=std
端函数

如果您仍然感到困惑,这个网站上有几个例子,

经过进一步研究,我确定我试图做的是不可能的,因为我想通过在VBA中定义一个新的聚合函数来实现。VBA不允许这样做。出于好奇,我最终使用子查询来进行额外的聚合。

如果需要,请使用您的表创建一个交叉表查询并将
table.field
作为值,然后使用此结果,您可以将所有字段值传递给
Parramaray
,并在您自己创建的函数中使用。示例

Public Function RStDev(ParamArray FieldValues()) As Variant
    Dim dblSum As Double, dblSumOfSq As Double
    Dim n As Long, varArg As Variant

    For Each varArg In FieldValues
        If IsNumeric(varArg) Then
            dblSum = dblSum + varArg
            dblSumOfSq = dblSumOfSq + varArg * varArg
            n = n + 1
        End If
    Next
    If n > 1 Then ' Variance/StDev applies if more than a single point
        RStDev = Sqr((n * dblSumOfSq - dblSum * dblSum) / (n * (n - 1)))
    Else
        RStDev = Null
    End If
End Function

使用
groupby
对另一个字段/多个字段进行分组。为什么要尝试在求和中使用for循环?什么数学?几乎所有关于rcordset的工作都应该在查询中完成,有些工作比其他工作更复杂。我使用另一个值集作为权重来计算一组值的标准偏差。数学需要b中的所有数据其他列。我尝试在查询本身中进行计算,但如果我在同一查询中使用Sum(weights)等标量函数以及value*weights等产品,则无法实现我想要的功能。我甚至无法使用派生表,因为access似乎不支持它们。或许您可以使用VBA“滚动您自己的”域聚合函数(类似于)这可以执行您自定义的统计计算。这里有一个示例说明如何执行此操作。我在原始问题中没有提到标准偏差的原因是因为我知道如果我这样做,我会得到这个答案。我正在做一个修改后的标准偏差公式,而不是库存公式,因此我确实需要知道如何编写自己的aggregate functions.Hmm。我来试一试。看起来我真的应该能够像传递给stock StDev函数一样直接传递数据,但这又是我们谈论的VBA。由于您正在制作一个自定义函数,这有点棘手,一旦您的函数正常工作,您就可以将其视为常规函数。这感觉像是朝着正确的方向迈出了一步,但我不确定在您的示例中输入ID号是什么意思。我不应该输入我想要操作的字段吗?这里似乎也应该有一个SQL查询,我在其他示例中看到了这一点,但这似乎也是错误的,因为我是从一个内部调用它的SELECT语句已经存在。@user3821202:我认为Thinkingcap的想法是,您传递一个ID来限制您要使用的值,尽管他在代码中没有使用它。您可能有一个包含许多值的域,其中只有一些值与您要计算的值有关。因此,您可以对ID进行筛选,或者至少运行一个条件。这可能不是您的问题如果您一直计算同一个字段,则不必传入字段名,但如果不传入,则可以将其作为另一个参数传入,这将使函数更加灵活。