【问题标题】:Peak over treshold method - VBA - Excel峰值超过阈值方法 - VBA - Excel
【发布时间】:2017-08-14 11:14:56
【问题描述】:

我真的希望你能帮助我解决以下问题。 我有一个数据集,我需要过滤一些值。这是一个用于波浪分析的数据集,我需要过滤掉最高值。所谓的峰值超过阈值方法。我想过滤掉 de wave 数据集中的风暴。

我可以通过以下方式做到这一点:当波高高于某个值(例如 2.5 米)时,定义为风暴。每 3 小时测量一次波高。

所以在数据集中我可以做一个 If(B3>$A$1; B3;0)。 A1 = 2,5 m。现在我已经过滤了波高。所以现在我可以在我的数据集中直接看到值高于 2.5 米的行,因为暴风雨持续了几个小时。以图1为例: [图1][1]

因此,如果某个值大于 X,则返回该值,否则返回零。现在是困难的部分:

现在,对于 2.5 米以上的值,我需要该条带的最高值。由于这是一个大(!)数据集,我有很多数据点。所以我有几次“风暴”,它们并不总是持续那么久。因此,高于 2.5 米的值并不总是 3 行,有时更多。见图2picture 2

我需要为每个风暴计算第 i 列中的最大值。因为每次风暴都不会持续很长时间,我可能需要在 VBA 中编写代码。有人可以帮我吗?我被困了 6 天,但我的 VBA 代码不起作用,而且我对 VBA 没有太多经验。如果有人可以帮助我,将不胜感激!

亲切的问候,

杰伦


编辑作为对 -Excel Developers- 的回复 我想我快到了,非常感谢你的回复!!我可能误读了代码,但是我在计算每次风暴的最高值时仍然有点困难,我认为它应该看起来像这样,如图 3 所示。Picture 3 p>

每个风暴的最高值应该打印在下一列,如图 3 所示。它可能在代码中说明了一切,但我误读了它。

非常感谢您的回答!我真的希望你能帮助我完成最后一部分:-)

亲切的问候,

杰伦

【问题讨论】:

    标签: vba excel dataset


    【解决方案1】:

    您必须遍历 i 列中的所有值。对于每场风暴,找到最高值。暴风雨开始于 0 后跟一个正值,结束于一个正值后跟 0。所以是这样的:

    Sub FindHighestValue()
    
        Dim vData As Variant
        Dim Storms As Collection
        Dim ndx As Long
        Dim ndxStorm As Long
        Dim MaxValue As Double
        Dim Previous As Double
        Dim InStorm As Boolean
    
        vData = Sheet1.Range("I8:I21").Value   'Change this to whatever range your wave heights are in
        Set Storms = New Collection
        Previous = 0
        InStorm = False
    
        For ndx = LBound(vData, 1) To UBound(vData, 1)
    
            If vData(ndx, 1) > 0 And Previous = 0 Then
                'A storm has started
                MaxValue = vData(ndx, 1)
                InStorm = True
            End If
    
            If InStorm And vData(ndx, 1) > MaxValue Then
                MaxValue = vData(ndx, 1)
            End If
    
            If (vData(ndx, 1) = 0 And Previous > 0) Or (ndx = UBound(vData, 1)) Then
                'A storm has ended
                InStorm = False
                Storms.Add MaxValue
            End If
    
            Previous = vData(ndx, 1)
        Next
    
        If Storms.Count > 0 Then
            For ndx = 1 To Storms.Count
                Debug.Print ndx & ": " & Storms(ndx)
            Next
        End If
    
    End Sub
    

    【讨论】:

    • 非常感谢!!我快到了,我已经在自己的帖子中回复了,所以我可以发布图片!我希望你能在最后一点帮助我:-)
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多