Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Excel中空行之间的动态范围_Vba_Excel_Database Design - Fatal编程技术网

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
属性的
属性,它将所有相邻单元格返回到所选单元格。使用上面的示例数据,假设第一个块从cell
A3
开始,到cell
C8
结束,调用
Range(“A3”)。CurrentRegion
返回Range
A3: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。比我的提议好多了。