2015-08-21 215 views
2

空白行之間我有一個表,如下所示:動態範圍在Excel

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

「塊」中列?一個? B' C?或者也許是全部的,即A:C? –

+0

你想要什麼新桌子?只需複製並粘貼舊桌子?目前還不清楚,爲什麼你需要創建一個新表,如果它已經按照你想要的方式佈置的話。 –

+0

這是你自己的配方還是標準的Excel配方?如果是您自己的,請選擇整個範圍,然後使用:Union(rng.SpecialCells(xlCellTypeConstants), rng.SpecialCells(xlCellTypeFormulas))。Select – aebailey

回答

1

在VBA中,有一個Property稱爲CurrentRegion屬性,它將所有連續的單元格返回到所選的單元格。使用上面的示例數據,假設第一個塊從單元格A3開始並結束於單元格C8,則調用Range("A3").CurrentRegion返回範圍A3:C8。同樣,對該組中任何單元的呼叫都會返回相同的範圍。 Range("B4").CurrentRegion返回`A3:C8'。

這能幫助你嗎?

+0

嘿,這真的很有用。有沒有辦法使用它來引用列中的連續單元格,例如返回範圍C3:C8? – beeba

+0

如果您參考範圍A3:C8,例如Range1,則INDEX(Range1,3)將返回對C3:C8的引用。 –

+1

@varunchandra有很多方法。 XOR提到其中之一。我個人使用'Intersect'函數返回'Range'對象。所以,'Intersect(Range(「A3」).CurrentRegion,Columns(3))'返回一個對C3:C8的引用。或者,如果你更喜歡以後看到列,同樣的事情:'相交(範圍(「A3」),CurrentRegion,列(「c」))' – user3561813

1

在您的功能中,將表格範圍=設置爲總範圍(rng)(包括空格)。然後,使用進行調整: NewRange = Union(rng.SpecialCells(xlCellTypeConstants), _ rng.SpecialCells(xlCellTypeFormulas)).Select

這應該給你的範圍內沒有空白單元格

1

假設您有Excel 2010或更高版本,並且數據你給它是在A1:C26,在頭行1,並且使得所述第一和最後一個非空白行是分別行3和行26:

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)),)

,其在式I的第一迭代中,將一個參考返回到範圍:

C3:C8

,並且當向下複製到其他細胞,將返回到範圍的引用:

C10:C17

C19:C26

等等等等

注意故意公式中引用的偏移量範圍(C2:C26和C3:C27)。應該選擇第一個(C2:C26)從第一個空白行開始,結束於最後一個非空白行,並且第二個(C3:C27)從第一個非空白行開始並結束於最後一個非空白行之後的第一個空白行。

問候

1

嘗試此陣列式:

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

然後向下複製。

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單元格的每一行中獲得一個文本,該文本表示該特定行所屬的範圍,位於白色之間......在你的函數中使用它,並將其解析爲一個範圍,以執行你所需的任何操作d ...工作完成我相信

希望可以幫助