获取具有当前值之前的值的最近单元格

时间:2017-11-09 16:02:58

标签: excel excel-vba excel-formula vba

在一个主要由空白单元格填充的列中,我需要获取最接近当前所选单元格的单元格的值,在它之前的行中,并且不是空白。

虽然"不是空白"使用 IF ISBLANK 语句可以轻松实现部分,我无法弄清楚如何从当前单元格中获取第一个单元格的位置不是空白。

Excel Sheet

在此示例电子表格中,在单元格C7中,我想显示B7的值减去B4的值( = B7-B4 )。问题是这些值由不可预测的单元格数分隔,其范围可以是0到20甚至更多。需要解析包含数千行和频繁数据的电子表格,手动选择上部单元格不是一种选择。

继续我的例子,我希望C13显示 = B13-B10 ,但是我们可以说它们之间还有两个空行(第13行变成第15行),我希望它显示= B15- B10

可以使用 MATCH 查询获取位置,知道类型将始终为T1或T2吗?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

在单元格C2中输入此公式,然后将其拖到底部。

=IFERROR(IF(B2="","",B2-LOOKUP(9.99999999999999E+307,B$1:B1)),"")

enter image description here

答案 1 :(得分:1)

通过VBA编写公式

下面是一个VBA方法,将减去公式写入C列。 BTW,通过数组搜索比循环遍历范围要快得多。

<强>代码

Option Explicit

Sub subtractLastValueRow()
' declare vars
  Dim oSht    As Worksheet                       ' work sheet
  Dim a       As Variant                         ' one based 2-dim data field array
  Dim n       As Long                            ' last row in column B
  Dim i       As Long                            ' item no
  Dim ii      As Long                            ' last item no
  Dim j       As Long
  Dim s       As String
' set sheet
  Set oSht = ThisWorkbook.Worksheets("MySheet")  ' fully qualified reference to worksheet
' get last row number of search column
  n = oSht.Range("B" & oSht.Rows.Count).End(xlUp).Row
  If n < 2 Then Exit Sub                         ' only if data avaible (row 1 = title line)

' get range (after title line) values to one based 2dim data field array
  a = oSht.Range("B2:C" & n).Value               '  array gets data from e.g. "A2:A100"
' loop through column B to find keyword sKey
  If Len(a(1, 1) & "") > 0 Then ii = 1 + 1       '  first item in array
  For i = LBound(a) + 1 To UBound(a)             '  array boundaries counting from 1+1 to n -1 (one off for title line)
      ' value found
        If Len(a(i, 1) & "") > 0 Then
           For j = i + 1 To UBound(a)
               If Len(a(j, 1) & "") > 0 Then
                ' write .Formula (alternatively use .Value, if value wanted)
                  oSht.Range("C" & i + 1).Formula = "=B" & i + 1 & "-B" & ii
                  ii = i + 1                      '  note last found i
                  Exit For
                End If
           Next j
        End If
  Next
  If Len(a(UBound(a), 1) & "") > 0 Then           ' last item in array
     oSht.Range("C" & UBound(a) + 1).Formula = "=B" & UBound(a) + 1 & "-B" & ii
  End If
End Sub

注意

如果您要编写值而不是工作表公式,只需将.Formula替换为.Value

答案 2 :(得分:0)

在单元格C3中加入以下公式:

=B3-LOOKUP(2,1/$B$1:B2,$B$1:B2)

根据需要在所有T2细胞中复制。