动态查找每行中包含文本的最后一个单元格

时间:2015-09-16 16:20:21

标签: excel vba

我需要为我创建的宏添加一个功能,我在这方面遇到了一些麻烦。这是我在这里发表的第一篇文章!我的宏是门票的SLA报告。最后一列(电子表格中最右边的列)具有ACTION TYPE和ACTION DATE的重复标题,如下所示:

ACTION DATE | ACTION TYPE | ACTION DATE | ACTION TYPE | ACTION DATE | ACTION TYPE

这就是它变得动态的地方,因为对于每一行,都有一个唯一的列数,这取决于行动的数量。

下面是一个简单的示例,其中3个动作与故障单一起发生,即:1。从请求者提交,2。评论,以及3.关闭故障单 - 注意:这是6列,因为在每个ACTION TYPE列之前是相应的行动日期,显示行动发生的时间:

7/14/2015 6:21:19 PM | Submitted | 7/15/2015 9:35 | Commented | 7/15/2015 9:17 | Approved/Closed

我需要VBA做这部分是为了找到每张票都关闭的时间。假设票证已关闭,这将是每行中最后填充的ACTION DATE单元格。这可以通过多种不同的方式完成,但我想在每一行中找到包含数据的最后一个单元格(从最右到右)(这将始终是ACTION TYPE列)。找到后,验证该值是否为"已批准/已关闭"在其中(并非所有票据都关闭),然后向左偏移一列以复制关闭时间。 (粘贴到新列中,例如A列) 如果机票仍然打开,则不会有"已批准/已关闭"动作类型作为行中最后一个使用过的单元格。我不能简单地转到带有数据的行中的最后一个单元格,并假设它已关闭。

这可能吗?还有更好的方法吗?

行数和列数始终在变化(通常约为100列和6000行。“操作日期”和“操作类型”列通常会占报告中最后的60-70列。

2 个答案:

答案 0 :(得分:0)

进入(例如)A3,这将关闭"关闭"日期提供行中最后一个填充的列是"已批准/已关闭"

=IF(INDEX(3:3,1,MAX((LEN(B3:KZ3)>0)*COLUMN(B3:KZ3)))="Approved/Closed",
    INDEX(3:3,1,MAX((LEN(B3:KZ3)>0)*COLUMN(B3:KZ3))-1),"")

数组公式,因此在输入时使用Ctrl + Shift + Enter。

答案 1 :(得分:0)

如果你想在VBA中使用它你可以做这样的事情

Dim rw As Range
For Each rw In Range(Range("A1"), Range("A1").End(xlDown)).Cells
    If rw.End(xlToRight).Value = "Approved/Closed" Then
        MsgBox rw.End(xlToRight).Offset(, -1).Value 'put the value anywhere you want.
    End If
Next

它将遍历所有行并检查最后一列是否等于“已批准/已关闭”。然后你可以用偏移值做任何想做的事。

仅当表格中没有空白单元格时才有效。