我有一张看起来像这样的表:
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),""),"")
但这非常令人费解,无法正常工作。
有什么建议吗?谢谢。
答案 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单元格的每一行中得到一个文本,表示这个特定行所属的范围在白色标记之间....在你的函数中使用它并将其解析为一个范围来做你需要的任何事情。我相信工作已经完成了
希望有所帮助