【问题标题】:Excel VBA Determining Mass of Truck ShipmentsExcel VBA 确定卡车装运的质量
【发布时间】:2017-03-29 23:10:45
【问题描述】:

我有一个系统,其中有一个来自汽车衡的数据列表,用于读取衡器上卡车的重量。该数据范围从 -30,000 磅左右(由于秤已去皮但无卡车)到 40,000 磅(带有满载和去皮卡车)。我的任务是确定通过卡车离开我们工厂的总重量。问题是有时只有几辆卡车离开我们的工厂,而其他十几辆卡车离开,重量略有不同。

这些权重的图形看起来像锯齿图案。它在很大程度上是一个负值(由于皮重),当卡车拉到秤上时,它很快达到大约零,然后慢慢增加到最终重量。达到最终重量后,随着卡车的驶离,重量很快又回到负值。

我关于如何解决这个问题的想法是寻找数据小于零的位置,并返回零之间传感器的最大重量。如果最大重量高于某个噪声过滤器值(例如 5000 磅),则将最大重量添加到某个计数器。从理论上讲,还不错,在实践中,有点超出我的能力。

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

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

如果有人可以就如何进行操作给我建议,那将非常有价值。我不是最基础的计算机程序员。

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

www.imgur.com/a/LGQY9

【问题讨论】:

  • 一些示例数据也会非常有用!
  • 您好 Jethro,您能否发布一些示例数据,这对我们帮助您很有帮助。甚至可能是您正在使用的工作表的图片。您已经接近问题,因此您很容易概念化,但我们需要您提供更多帮助,以帮助您。
  • 您是否正在查看不止一辆卡车的一系列连续数据,例如:-4,-4,-3,-2,-3,-4,-4,-1,0,1,2,3,2,1,0,-4,-4,-3,-2,-3,-4,-4,-4,-4,-3,-2,-3,-4,-4,0,2,4,5,4,2,0 - 而您只是在寻找35
  • 罗宾,当机立断。基本上在低端有很多垃圾数据(我的像 -30,000 而你的像 -4,相同的差异)和顶部附近的一些好数据(40,000 和 5)。我需要求和每个离散“峰值”的最大值。在您的情况下,有 2 个峰值,一个最大为 3,一个最大为 5。我希望创建的函数将返回 8

标签: vba excel excel-2013


【解决方案1】:

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

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

【讨论】:

  • 似乎运行良好,但我真的认为我的数据很糟糕,以至于我需要修改您的代码才能使其正常工作。根据整个图表,粗略估计我们的重量约为 900,000 磅。我的库存人员说应该在 300,000 磅左右(不确定我放了多少库存,他非常忙,我没有问任何后续问题)。您的代码是 214,000 磅。在我得到一个更加一致的结果之前,我不愿意明确地说这是答案(如果遇到这样的情况,不要试图侮辱你的代码)。
  • 没有冒犯。根据数据,肯定有一些我的函数没有考虑到的情况。例如,可能存在连续测量卡车的情况,并且比例从未低于 0(或噪声系数)。祝你好运,请随时寻求帮助以解决您遇到的任何特定情况。
  • 我想我解决了,我只是寻找重量显着下降的地方(15 秒内 5000 磅或更多,但我会调整这个)并取前 10 个单元格的最大值。我将这些最大重量相加,得到了超过 100 万磅的重量,而我估计的只有超过 900,000 磅。您的代码肯定仍然有用,即使仅用于文档。我可以让你同意将它包含在我的最终产品中吗?它仅供内部使用,我可以根据您的喜好向您推荐。
  • 我不求信用。该代码属于世界,您可以随心所欲地使用它。我很高兴它能帮助您找到解决方案。
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 2013-07-01
  • 2014-08-20
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多