Vba Excel中空行之间的动态范围
我有一张像这样的桌子:Vba Excel中空行之间的动态范围,vba,excel,database-design,Vba,Excel,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.0069129
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),""),"")
但这是非常复杂的,不起作用
有什么建议吗?谢谢 在VBA中,有一个名为
CurrentRegion
属性的属性,它将所有相邻单元格返回到所选单元格。使用上面的示例数据,假设第一个块从cellA3
开始,到cellC8
结束,调用Range(“A3”)。CurrentRegion
返回RangeA3:C8
。类似地,对该组中任何单元格的调用都会返回相同的范围<代码>范围(“B4”)。CurrentRegion
返回'A3:C8'
这对您有帮助吗?在您的函数中,将表格范围=设置为总范围(rng)(包括空格)。然后使用以下方法进行调整:
NewRange=Union(rng.SpecialCells(xlCellTypeConstants)_
rng.SpecialCells(xlCellTypeFormulas))。选择
如果你有Excel 2010或更高版本,这应该给你一个没有空白单元格
的范围,并且你给它的数据是在A1:C26中,在行1中有标题,这样第一个和最后一个非空白行分别是行3和行26:
索引(C:C,总计(15,6,第三行(C$3:C$27)/(C$2:C$26=“”)*(C$3:C$27”)、第三行(1:1))、):索引(C:C,总计(15,6,第二行(C$2:C$26)/(C$3:C$27=“”)、第三行(1:1))
在公式的第一次迭代中,将返回对范围的引用:
C3:C8
并且,当向下复制到其他单元格时,将返回对该范围的引用:
C10:C17
C19:C26
等等等等
注意公式中引用的偏移范围(C2:C26和C3:C27)。选择这些选项时,应确保第一个(C2:C26)从第一个空行开始,在最后一个非空行结束,第二个(C3:C27)从第一个非空行开始,在最后一个非空行之后的第一个空行结束
关于尝试以下数组公式:
D2: =TestFunction(B2, INDEX(C:C,LARGE(IF(C$1:C2<>"",ROW(C$1:C2),""),1)):INDEX(C:C,ROW()))
D2:=TestFunction(B2,索引(C:C,大的(IF(C$1:C2)”,行(C$1:C2),“”),1)):索引(C:C,行())
然后向下复制。您可以尝试以下方法:
创建一个如下所示的函数
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单元格的每一行中得到一个文本,表示该特定行所属的范围,位于白色边缘之间。。。。在函数中使用它,并将其解析为一个范围,以执行您需要的任何操作。。。我相信工作已经完成了
希望这有助于哪一列中的“块”?A.BC或者全部,即A:C?您希望您的新桌子是什么?只是复制并粘贴旧表?如果表格已经按照您想要的方式排列,那么您为什么需要创建一个新表格?这是您自己的公式还是标准的excel公式?如果是您自己的,请选择整个范围,然后使用:Union(rng.SpecialCells(xlCellTypeConstants)、rng.SpecialCells(xlCellTypeFormulas))。选择是否希望您的“范围”仅包含一个给定测试的一个特定数据块?如果是,那么您需要一个标准来选择范围,并使用此标准来构建动态范围。。。。我可以帮助您进行动态范围构建,但不能基于选择使用C列中的块的范围的标准-我希望TestFunction选择前两个空行之间的范围,然后选择第二个和第三个空行之间的范围,依此类推。我希望新列是TestFunction在选择这些范围时计算的值的列表。这个函数是我自己用VBA写的公式。嘿,这真的很有用。是否有方法使用它来引用列中的连续单元格,例如返回范围C3:C8?如果有对范围A3:C8的引用,例如Range1,则INDEX(Range1,,3)将返回对C3:C8的引用。@varunchandra有多种方法。XOR提到了其中一个。我个人使用Intersect
函数返回范围
对象。因此,Intersect(Range(“A3”)。CurrentRegion,Columns(3))
返回对C3:C8的引用。或者,如果您希望稍后看到该列,请执行相同的操作:Intersect(range(“A3”)。CurrentRegion,columns(“c”)
@user3561813 Yes。比我的提议好多了。