Excel VBA确定卡车装运的质量

Excel VBA确定卡车装运的质量,vba,excel,excel-2013,Vba,Excel,Excel 2013,我有一个系统,在这个系统中,我有一个来自汽车衡的数据列表,读取汽车衡上的重量。这个数据范围从-30000磅左右,因为秤上有皮重,但没有卡车,到40000磅,上面有一辆满载的皮重卡车。我的任务是确定通过卡车离开工厂的总重量。问题是有些天只有几辆卡车离开我们的工厂,其他的十几辆离开,所有这些卡车的重量略有不同 这些权重的图形看起来像锯齿形图案。这是一个很大程度上为负值的值(由于皮重),当卡车拉到秤上时,很快接近于零,并慢慢增加到最终重量。达到最终重量后,当卡车驶离时,重量很快回到基本为负值 我的想法

我有一个系统,在这个系统中,我有一个来自汽车衡的数据列表,读取汽车衡上的重量。这个数据范围从-30000磅左右,因为秤上有皮重,但没有卡车,到40000磅,上面有一辆满载的皮重卡车。我的任务是确定通过卡车离开工厂的总重量。问题是有些天只有几辆卡车离开我们的工厂,其他的十几辆离开,所有这些卡车的重量略有不同

这些权重的图形看起来像锯齿形图案。这是一个很大程度上为负值的值(由于皮重),当卡车拉到秤上时,很快接近于零,并慢慢增加到最终重量。达到最终重量后,当卡车驶离时,重量很快回到基本为负值

我的想法是寻找数据小于零的位置,并返回零之间传感器的最大重量。如果最大权重高于某个噪波过滤器值(例如,5000lbs),则将最大权重添加到某个计数器。理论上还不错,但实际上,我有点力不从心

这是我到目前为止的代码,因为我知道我需要展示我到目前为止的努力。我建议忽略它,因为在重新启动工作几天后,它基本上只是一个失败的开始

Public Function TruckLoad(rngData As Range)
Dim intCount As Integer
intCount = 0
For Each cell In rngData
    intCount = intCount + 1
Next cell
Dim n As Integer
n = 1
Dim x As Integer
x = 1
Dim arr() As Double
For i = 1 To intCount
    If rngData(i, 1) < 0 Then
        arr(n) = x
        n = n + 1
        x = x + 1
    Else
        x = x + 1
    End If
Next
TruckLoad = arr(1)

End Function
公共功能整车(rngData作为范围)
Dim intCount为整数
整数=0
对于rngData中的每个单元格
intCount=intCount+1
下一个细胞
作为整数的Dim n
n=1
作为整数的Dim x
x=1
Dim arr()为双精度
对于i=1到整数计数
如果rngData(i,1)<0,那么
arr(n)=x
n=n+1
x=x+1
其他的
x=x+1
如果结束
下一个
卡车装载=arr(1)
端函数
如果有人能给我一些关于如何进行的建议,那将是非常有价值的。除了最基本的知识外,我不是一名计算机程序员

编辑:对不起,我一开始就应该这么说。我不能发布全部原始样本数据,但我可以发布一张图的照片。有一个程度我不能公开发布(并不是说你可以对数据做任何特别邪恶的事情,这是公司的规则)


www.imgur.com/a/LGQY9

我对数据的理解与罗宾的评论一致。有几种方法可以解决这个问题。我编写了一个函数,在数据范围内循环查找数据集中的“下一个零”,并计算当前行和“下一个零”所在行之间的最大值。如果最大值高于噪波过滤器的值,则该值将添加到运行总数中

Option Explicit

Private Const NOISE_FILTER As Double = 5000

Public Function TruckLoad(rngData As Range) As Double

    Dim r As Integer
    Dim runningTruckLoad As Double
    Dim maxLoadReading As Double
    Dim nextZeroRow As Integer

    For r = 1 To rngData.Rows.Count

        nextZeroRow = FindNextZeroRow(r, rngData)

        maxLoadReading = Application.WorksheetFunction.Max(Range(rngData.Cells(r, 1), rngData.Cells(nextZeroRow, 1)))

        If maxLoadReading > NOISE_FILTER Then
            runningTruckLoad = runningTruckLoad + maxLoadReading
        End If

        r = nextZeroRow 'skip the loop counter ahead to our new 0 row

    Next r

    TruckLoad = runningTruckLoad

End Function

Private Function FindNextZeroRow(startRow As Integer, searchRange As Range) As Integer

    Dim nextZeroRow As Range

    Set nextZeroRow = searchRange.Find(0, searchRange.Rows(startRow))

    If nextZeroRow.Row < startRow Then 'we've hit the end of the data range
        FindNextZeroRow = startRow
    ElseIf nextZeroRow.Value <> 0 Then  'we've found a data point with a zero in it, not interested in this row
        FindNextZeroRow = FindNextZeroRow(nextZeroRow.Row, searchRange)
    Else
        FindNextZeroRow = nextZeroRow.Row 'we've found our next zero data point
    End If

End Function
选项显式
专用常数噪声滤波器,双精度=5000
公共功能卡车(rngData为范围)为双倍
作为整数的Dim r
双倍暗装卡车
Dim maxLoadReading为双精度
Dim NEXTZEROW作为整数
对于r=1到rngData.Rows.Count
nextZeroRow=findnextzerorrow(r,rngData)
maxLoadReading=Application.WorksheetFunction.Max(范围(rngData.Cells(r,1),rngData.Cells(nextzerrow,1)))
如果maxLoadReading>噪波过滤器,则
runningTruckLoad=runningTruckLoad+maxLoadReading
如果结束
r=nextzerrow'跳过前面的循环计数器到新的0行
下一个r
卡车装载=运行卡车装载
端函数
私有函数findnextzerorrow(startRow为整数,searchRange为范围)为整数
变暗下一行作为范围
Set nextzerrow=searchRange.Find(0,searchRange.Rows(startRow))
如果nextzerrow.Row
一些示例数据也非常有用!你好,Jethro,你能发布一些样本数据吗?这对我们帮助你非常有用。甚至可能是您正在使用的工作表的图片。你很接近这个问题,所以你很容易概念化,但是我们需要你更多的帮助来帮助你。你在看一系列连续的多辆卡车的数据,比如:
-4,-4,-3,-2,-3,-3,-4,-4,-1,0,1,2,3,2,1,0,-4,-3,-4,-4,-3,-2,-3,-4,-4,0,2,4,5,4,2,0
-您只需查找
3
5
?罗宾,现场。基本上,在低端有大量垃圾数据(我的数据为-30000,而你的数据为-4,差别相同),在顶端附近有一些好数据(40000和5)。我需要将每个离散“峰值”的最大值相加。在您的例子中,有两个峰值,一个最大值为3,另一个最大值为5。我希望创建的函数似乎工作得很好,但我认真地认为我的数据不好,需要对代码进行处理才能使其正常工作。根据整个图表,粗略估计我们大约有900000磅。我的库存员说应该在300000磅左右(不知道我在里面放了多少存货,他忙得不可开交,我也没问任何后续问题)。你的代码是214000磅。我不愿意肯定地说这是答案,直到我得到一个更全面一致的结果(如果你的代码是这样的话,我不会试图侮辱你的代码)。没有冒犯。根据数据的不同,肯定会有一些我的函数没有考虑到的场景。例如,可能存在这样一种情况,即卡车在连续范围内进行测量,并且标度从不低于0(或噪声系数)。祝你好运,请随时寻求帮助,解释你遇到的任何具体情况。我想我解决了它,我只是寻找了重量显著下降的地方(15秒内5000磅或更多,但我会调整这个),并取了前10个单元格的最大值。我把这些最大重量加起来,得到了超过一百万磅的重量