Excel VBA确定卡车装运质量

我有一个系统,我有一个卡车秤的数据列表,读取一辆卡车的重量。 这个数据的范围从-30,000磅左右,因为秤被称重,但无卡车,至40,000磅,一个完整的和配重的卡车上。 我的任务是确定通过卡车离开我们设施的总重量。 问题是有些日子,只有几辆卡车离开我们的设施,其他人有一打假,都有轻微不同的重量。

这些重量的graphics看起来像一个锯齿形图案。 这是一个很大的负值(由于皮重),当卡车拉到秤上时,迅速达到大约零,并慢慢增加到最终重量。 在最终的重量达到后,随着卡车拉开,重量迅速回到基本负值。

我想如何解决这个问题是寻找数据在哪里小于零,并返回零之间的传感器的最大重量。 如果最大重量高于一些噪音filter的值(比如说5000磅),那么将最大重量加到某个计数器上。 理论上,不错,在实践中,有点出乎我的意料。

这是我的代码到目前为止,因为我知道我需要显示我的努力到目前为止。 我build议忽略它,因为这几天重新开始工作后,大部分都是失败的开始。

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 

如果任何人都可以给我build议如何进行,这将是非常有价值的。 我不是非常基础的计算机程序员。

编辑:对不起,我最初应该这样说。 我无法发布完整的原始样本数据,但是我可以发布图表的照片。 我不能公开发表一些文章(不是你可以做任何特别有害的数据,这是一个公司规则)。

www.imgur.com/a/LGQY9

我对数据的理解与罗宾的评论是一致的。 有几种方法可以解决这个问题。 我已经写了一个循环遍历数据范围的函数来查找数据集中的“下一个零”,并计算当前行与“下一个零”所在的行之间的最大值。如果最大值高于你的噪音filter的价值,价值将被添加到运行的总和。

 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