在列中搜索连续值并将三个不同的值返回到其他单元格

时间:2015-07-31 13:52:49

标签: excel vba excel-vba excel-formula excel-2013

我有一系列专栏。一个包含数据点的时间戳,下一个是数据点,后面的那个是该数据点从十进制到二进制的转换,其余列是分成每个位的二进制字符串。每列都有一个标题:“No Engine Speed”,“Engine Derate”等等。

这是我想做的,但没有VBA / Excel的技能。我正在尝试将所有这些信息用于对读者更友好的内容。

所以,例如: enter image description here

会告诉我这个: enter image description here

描述来自列标题,时间范围开始/结束将来自第一列。我将使用Excel IF函数或某种基于描述列内容的VLOOKUP函数获得的错误代码。我需要的是一个VBA代码或一组Excel函数,它们将根据这些位列的内容为我填充那些描述和时间戳列。

我如何设想它如何工作如下:搜索每个位列,如果找到1并且还发现其下面的四个单元格也是1,则第一个1和最后一个的日期戳填充我正在创建的更易读的报告中的开始/结束时间。除此之外,列标题也会复制到描述字段中。

我想只获得连续五个或更多1的时间戳的原因是我想在状态被认为是'事件'之前需要一些时间。我想要遇到的第二个条件是时间戳合理地靠近在一起(比如彼此在2分钟之内)。这就是为什么即使在我为“16-May-15 21:52:47”链接的图片中有一个“1”事件,我也将其从我链接的第二张图片中排除。

时间戳旁边的数字(以及时间戳本身)将根据用户何时打开工作簿而更改。这些列是对数据库进行查询的结果,并根据前一班次的开始和结束时间进行更改。另外,在复制时间戳时,我知道您需要粘贴单元格值而不仅仅是常规粘贴,否则最终会将查询数组复制到数据库中。我不知道这是否与编码解决方案有任何关系,但我认为值得一提。

我考虑过尝试使用某种类型的VLOOKUP函数,但是我发现并不能完全按照我的意愿行事,因为它不会检查是否连续发生了五个事件。我们非常感谢您提供的任何指导或指导。我觉得我知道如何做到这一点,但我是VBA的新手,我的Excel能力还没有完成任务,我的谷歌搜索没有达到我需要的水平。

我希望我能清楚地解释我正在尝试做什么,如果不是,我可以随意提问。

谢谢,

编辑1:

正如等级'Eh'培根建议的那样,我问了一个与此相关的问题,这个问题导致了一个更适合我需求的解决方案。它可以找到here

1 个答案:

答案 0 :(得分:1)

由于您似乎在使用辅助列时遇到问题,因此您可以以相当简单的方式完成此操作,前提是您的数据已按日期排序。

RAW DATA TAB

添加一个新列(我们将其称为X列),检查您的单元格是否是第一个启动5个日期戳的字符串的单元格,正如您所说,所有这些都是相隔2分钟[从X2开始,以假定的X100结束,假设日期戳为A列,十进制的参考代码为B列):

=COUNTIFS(A2:A$100,">=" & A2 - TIMEVALUE("00:02:00"),B2:B$100,B2)

这计算当前单元格下面的单元格数不超过2分钟,包括它自身,并且在列B中也有相同的代码。我们将使用它来检查该单元格是否开始一个5 +相同的新字符串,及时,代码。

在Y栏中,从Y2开始,输入:

=IF(AND(OR(B2<>B1,A2 - TIMEVALUE("00:02:00")>A1),X2 >= 5), TRUE)

这将首先检查(1)当前单元格中的代码是否与前一单元格中的代码不匹配;或者(2)当前行的时间比最后一行晚至少2分钟(无论哪种方式,这是一个新的循环)。然后我们检查以下条件:X列中的当前行是否显示下面至少5个单元格的匹配,并且在同一时间周期中使用相同的代码。如果为TRUE,则返回TRUE。否则,它将返回FALSE。

然后Z列中的代码返回第n个&#34;命中代码&#34;我们继续这一行。即:这是第一次,第二次,第n次是否已经击中一串5个代码[从Z2开始;硬编码Z1为&#34; 0&#34;,或做一些其他特殊情况,以便第一个不能添加上面单元格的标题,导致#VALUE!错误]:

=IF(Y2,Z1+1,Z1)

这将把Z变成一个升序的位置列表,每当新代码创建失败时重复值。现在我们需要获取该行代表的代码的描述。

假设您有一个包含所有代码的有序列表,其中第1列与&#34; 1000000 ...&#34;等效,第2列与&#34; 01000000等效。&#34 ;将单行列(或单列行)命名为Range,我将其称为Code_Index。

在AA栏中,从AA2开始,提出以下内容:

=INDEX(Code_Index,SEARCH("1",C2))

这会检查哪个字符&#34; 1&#34;出现在该行的C列中,这就成了我们想要从中获取描述的位置(我们已将其置于命名范围Code_Index中)。

最后,我们需要添加一行来检查5个以上代码的特定块何时结束。说,AB:AB(我最初忘了这个,因此最初有点乱序)。在AB2中并向下复制,您将检查在2分钟块内是否存在同一行中至少5行,以及在新的2分钟块内是否下一行是相同的事物。

=IF(AND(COUNTIFS(B$1:B2,B2,A$1:A2,">"A2 - TIMEVALUE("00:02:00")>=5,OR(B3<>B2, A3 + TIMEVALUE("00:02:00")>= A2)),MAX(Z$1:Z1),"")

结果页

现在假设在Sheet1上全部,并且你希望你的&#39;清洁&#39; Sheet2上的结果。

在表2中,将A列作为索引,在A2&amp;之后每行增加1。 B栏将成为另一个帮手&#39;列,列C将拉出描述,列D将拉动开始时间,列E将拉出结束时间。

在B栏中,添加以下公式,以检查哪个&#39;新&#39;索引我们(从最后一个标签上的Z列开始)。从B2开始,

=MATCH(A2,Sheet1!Z:Z,0)

这将从原始数据选项卡中找到与A1上当前索引号匹配的第一行。然后只需在接下来的3列中的每一列中的索引公式中使用它,以提取描述,开始时间和结束时间。

在C2中(从最后一个标签上的AA中拉出描述):

=INDEX(Sheet1!AA:AA,B2)

在D2中(从最后一个标签上的A拉开始时间)

=INDEX(Sheet1!A:A,B2)

在E2中(从最后一个选项卡上的A中拉出结束时间,*基于AB列索引中的行号)

=INDEX(Sheet1!A:A,MATCH(A2,Sheet1!AB:AB,0))

让我知道,如果我误解了你希望你的&#34; 2分钟时间阻止&#34;建立;做一些严格的测试,以确保它按照你期望的方式行事。