Excel中空行之间的动态范围

时间:2015-08-21 15:01:54

标签: excel vba excel-vba database-design

我有一张看起来像这样的表:

Date       MaturityDate ZeroRate

5-May-15    5-May-15    1
5-May-15    6-May-15    0.0069999329
5-May-15    5-Jun-15    0.008996562
5-May-15    6-Jul-15    0.008993128
5-May-15    5-Aug-15    0.006744264
5-May-15    5-Nov-15    0.006912941

5-May-15    5-May-16    1
5-May-15    5-May-17    0.006910929
5-May-15    6-Nov-17    0.007017292
5-May-15    7-May-18    0.00712202
5-May-15    5-Nov-18    0.007835916
5-May-15    6-May-19    0.008551509
5-May-15    5-Nov-19    0.009734602
5-May-15    5-May-20    0.010916848

5-May-15    5-Nov-20    1
5-May-15    5-May-21    0.012632521
5-May-15    5-Nov-21    0.013504069
5-May-15    5-May-22    0.014366506
5-May-15    7-Nov-22    0.014935518
5-May-15    5-May-23    0.0154865
5-May-15    6-Nov-23    0.016059181
5-May-15    6-May-24    0.016626256

它被分成均匀间隔的块,每个“1”之间有一行。

我有一个TestFunction形式的函数(参考单元格,表范围)。我希望“表格范围”部分引用空白行之间的单元格。有没有办法可以向下拖动TestFunction并让它自动选择空行之间的块作为范围?

我尝试编写像

这样的代码
D2: =IFERROR(IF(ISBLANK(C2),TestFunction(B2, INDEX(A:A,LOOKUP(2,1/ISBLANK(C$2:C2),ROW(C$2:C2))):C2),""),"") 

但这非常令人费解,无法正常工作。

有什么建议吗?谢谢。

5 个答案:

答案 0 :(得分:1)

在VBA中,有一个名为Property的{​​{1}}属性,它将所有连续的单元格返回给所选的单元格。使用上面的示例数据,假设第一个块从单元CurrentRegion开始,到单元A3结束,对C8的调用将返回范围Range("A3").CurrentRegion。同样,对该组中任何单元格的调用返回相同的范围。 A3:C8返回“A3:C8”。

这对你有帮助吗?

答案 1 :(得分:1)

在您的函数中,将表范围=设置为总范围(rng)(包括空白)。然后调整它:     NewRange = Union(rng.SpecialCells(xlCellTypeConstants), _ rng.SpecialCells(xlCellTypeFormulas)).Select

这应该为您提供没有空白单元格的范围

答案 2 :(得分:1)

假设您拥有Excel 2010或更高版本,并且您提供的数据位于A1:C26中,第1行中包含标题,并且第一行和最后一行非空行分别为第3行和第26行:< / p>

INDEX(C:C,AGGREGATE(15,6,ROW(C$3:C$27)/((C$2:C$26="")*(C$3:C$27<>"")),ROWS($1:1)),):INDEX(C:C,AGGREGATE(15,6,ROW(C$2:C$26)/(C$3:C$27=""),ROWS($1:1)),)

,在公式的第一次迭代中,将返回对范围的引用:

C3:C8

并且,当向下复制到更多单元格时,将返回对范围的引用:

C10:C17

C19:C26

等等。

注意公式中引用的故意偏移范围(C2:C26和C3:C27)。应该选择这些,使得第一个(C2:C26)从第一个空行开始,到最后一个非空行结束,并且第二个(C3:C27)从第一个非空行开始,到达最后一个非空白行之后的第一个空白行。

此致

答案 3 :(得分:1)

试试这个数组公式:

D2: =TestFunction(B2, INDEX(C:C,LARGE(IF(C$1:C2<>"",ROW(C$1:C2),""),1)):INDEX(C:C,ROW()))

然后向下复制。

答案 4 :(得分:1)

你可以试试这个:

创建一个看起来像

的函数
Public Function LastCell(ByVal target As Long) As String

    Dim rangeAddr As String

    If ActiveSheet.Cells(target, 1).Value = "" Then
        LastCell = ""
        Exit Function
    End If

   ' Get first Address
   If ActiveSheet.Cells(target - 1, 1).Value = "" Then
      rangeAddr = Range("$A" & target + 1).End(xlUp).Address
   Else
      rangeAddr = Range("$A" & target).End(xlUp).Address
   End If

  ' set the separator of range  
  rangeAddr = rangeAddr & ":"
  ' Get last address of block
  If ActiveSheet.Cells(target + 1, 1).Value = "" Then
     LastCell = rangeAddr & Range("$A" & target - 1).End(xlDown).Address
  Else
     LastCell = rangeAddr & Range("$A" & target).End(xlDown).Address
  End If


End Function

然后在每个Dn单元格上输入此公式

=lastcell(row())

你会在Dn单元格的每一行中得到一个文本,表示这个特定行所属的范围在白色标记之间....在你的函数中使用它并将其解析为一个范围来做你需要的任何事情。我相信工作已经完成了

希望有所帮助