Excel VBA宏在不是本地最大值时隐藏行

Excel VBA宏在不是本地最大值时隐藏行,vba,excel,Vba,Excel,请原谅我的无知。我不是一个绝对的编程初学者,但对VBA和创建excel宏的过程几乎不熟悉 我有一个数据表,其中的值周期性地上下波动。我想做的是隐藏一行,如果它不是本地最大值,那么我可以评估从最大值到最大值的趋势。我试图调整我发现的另一个宏,该宏基于非高亮显示隐藏,并且似乎无法正确执行 我知道有些事情需要改变: 1) 我知道我不应该使用“activesheet”,而应该使用相关工作表的实际名称 2) 我相信这个程序会逐步通过每一个有信息的细胞。我只需要搜索“c”列。这应该会大大加快速度(我对搜索其

请原谅我的无知。我不是一个绝对的编程初学者,但对VBA和创建excel宏的过程几乎不熟悉

我有一个数据表,其中的值周期性地上下波动。我想做的是隐藏一行,如果它不是本地最大值,那么我可以评估从最大值到最大值的趋势。我试图调整我发现的另一个宏,该宏基于非高亮显示隐藏,并且似乎无法正确执行

我知道有些事情需要改变: 1) 我知道我不应该使用“activesheet”,而应该使用相关工作表的实际名称

2) 我相信这个程序会逐步通过每一个有信息的细胞。我只需要搜索“c”列。这应该会大大加快速度(我对搜索其他11个专栏不感兴趣)

3) 我将局部最大值定义为“如果C(I-1)C(I+1),则单元Ci是局部最大值”。当一行中有两个单元格具有该局部最大值的峰值时,这会导致问题。有办法解决这个问题吗?我认为如果我尝试“平均(x-1,x-2)平均(x+1,x+2)”,每个局部最大值可以选择多个单元格

4) 我试图从其他人的代码中重新设计此代码,以隐藏未高亮显示的行。可能有些东西是不需要的,我太没经验了,看不到它们

5) 我搜索了15k-20k行,因为这是一台测试机的输出。我渴望实现任何可能的方法来加速这只小狗

以下是我正在尝试的当前代码(谢谢你,谢谢你,谢谢你的帮助!):

编辑:所谓局部最大值,我的意思是我的图形在本质上是模糊的正弦曲线,我想跟踪从峰值到峰值的幅度变化。结果与此图非常相似:


编辑2:这是一组组成的数据。宏不应隐藏第3、7、13和14行,而应隐藏所有其他行

我不知道我是否完全理解你的提问,因为我不知道你所说的局部最大值是什么意思,但要回答你关于如何更有效地逐步通过C列中的每个单元格的问题,你可以使用这样的Do-While循环

Sub Macro1()
  Dim ws As Worksheet
  Set ws = Worksheets("Sheet1")

  K = 2 'Row 1 is a header so i start on row 2

  Do While ws.Cells(K, 3) <> ""
    'Code

    K = K + 1
  Loop
End Sub
Sub宏1()
将ws设置为工作表
设置ws=工作表(“表1”)
K=2'第1行是标题,所以我从第2行开始
当ws.Cells(K,3)”时执行此操作
“代码
K=K+1
环
端接头

于3/4修改。注:我已经注释掉了不需要的代码;您不需要循环遍历列,因为您只关心“C”;不要循环到第1行;不需要额外的代码“If shouldHideRow Then”如果您将比较从“>”更改为“当您说“本地最大值”是什么意思”?有一个
MAX
函数可以使用,将值或值数组或值范围传递给它,它会告诉您最大值是多少,然后最好只是过滤,而不是隐藏不是最大值的行。@Lopsided请参阅我文章底部的编辑。“局部最大值”是正弦曲线中每个峰值的顶部。@如果我错了,请用户2140261更正,但我认为使用“最大值”只会给我一个值:曲线上的最高点。我希望在这样的图中跟踪每个峰值随时间的变化:请参阅我原始文章底部的编辑。该图类似于阻尼正弦曲线,我想跟踪振幅随时间的变化/减小。感谢您的建议。对于我使用的数据,前几个点永远不应该是我搜索的最大值之一。从第10行或第20行开始搜索完全没有问题(一个典型的数据集可能有20个最大值分布在15000行上)。我将用模拟数据更新我的原始帖子,以及应该隐藏的内容。
Sub Macro1()
  Dim ws As Worksheet
  Set ws = Worksheets("Sheet1")

  K = 2 'Row 1 is a header so i start on row 2

  Do While ws.Cells(K, 3) <> ""
    'Code

    K = K + 1
  Loop
End Sub
Option Explicit

Public Sub HideUncoloredRows()

Dim startColumn As Integer
Dim startRow As Integer
Dim totalRows As Integer
Dim totalColumns As Integer
Dim currentColumn As Integer
Dim currentRow As Integer
Dim shouldHideRow As Integer

startColumn = 3     'column C
startRow = 1        'row 1
totalRows = ActiveSheet.Cells(Rows.Count, startColumn).End(xlUp).Row

For currentRow = totalRows To startRow + 1 Step -1   ' 3/4 - Added +1
    shouldHideRow = True
    'totalColumns = ActiveSheet.Cells(currentRow, Columns.Count).End(xlToLeft).Column
    'for each column in the current row, check for maximum
    'For currentColumn = startColumn To totalColumns
        'if a local maximum is found, don't hide the row and move on to next row
        'Debug.Print "Looking At: " & currentRow & "/" & startColumn & vbTab & currentRow - 1 & "/" & startColumn & vbTab & currentRow + 1 & "/" & startColumn
        If ActiveSheet.Cells(currentRow, startColumn) < ActiveSheet.Cells(currentRow - 1, startColumn) And ActiveSheet.Cells(currentRow, startColumn) < ActiveSheet.Cells(currentRow + 1, startColumn) Then   ' 3/4 changed from > to <
            'shouldHideRow = False
            ActiveSheet.Cells(currentRow, startColumn).EntireRow.Hidden = True   ' 3/4 Just hide it!
            'Exit For
        End If
    'Next

    'If shouldHideRow Then   ' 3/4 Not needed with above change
    '    'drop into here if there was not a local maximum
    '    Debug.Print "Hide: " & currentRow & "/" & startColumn
    '    ActiveSheet.Cells(currentRow, startColumn).EntireRow.Hidden = True
    'End If
Next
End Sub