2016-03-06 58 views
0

我需要在Excel中創建某種基本報告。從選定的月份列表中派生部門作業

主要問題是我正在收集數據的數據庫正在將部門分配存儲在三列中,但僅存儲每個新分配的Start_Date。

所以文件看起來像:

Pers_ID Department_ID Start_Date 
    1001 01   2012-01-01 
    1001 02   2013-05-01 
    1001 05   2015-08-01 

我需要某種fomula的,檢查的單元格(如A1是「2013年8月1日),也會返回部門編號爲Pers_ID在給定時間。

我給它一個嘗試在計算所有日期和「A1」之間的最小差值與數組公式,但是這可能會導致在未來指定部門標識爲好。

任何幫助表示高度讚賞,我在沒有任何工作的情況下掙扎數小時克解決方案。提前致謝!

+0

是你的日期*** yyyy-mm-dd ***或*** yyyy-dd-mm *** ?? –

+0

在excel中更易於使用我的確將大部分日期轉換爲yyyy-mm格式(不再有日期)。該列中的日期是「datetime」sql服務器列。所以yyyy-mm-dd +時間。 – Christian

回答

0

根據您的名單我已經添加了額外的記錄,以測試公式如下所示:

Pers_ID Department_ID Start_Date 
1001 01   2012-01-01 
1001 02   2013-05-01 
1001 05   2015-08-01 
1002 02   2012-05-01 
1002 04   2013-01-01 
1003 01   2016-01-01 

Selection criteria 
Person: 1002 
Date: 2016-03-06 

Intermediate Results 
Begin: <First formula below> 
End: <Second formula below> 

Results 
Dept. <The last formula goes here> 

以下假設作了:

  • 你有你的數據庫的排序條件爲Pers_ID
  • 表格標題位於單元格位置A1(因此,您的數據始於第2行)
  • 您在兩個字段中編寫您的選擇標準B10B11

區分不同Pers_ID的,我們首先要知道多條記錄的specifc Pers_ID在你的數據源,並在哪個位置。由於數據是通過Pers_ID排序我們只需搜索occurence的第一行:

MATCH(B10;A2:A7;0) // will return 4 as it's the 4th line in the range A2:A7 

和計數的頻率指定Pers_ID發生:

COUNTIF(A2:A7;B10) // will return 2 

爲了簡化所得式我們可以在「高速緩存」結果在單元格B14B15

之後,我們可以使用OFFSET()函數創建一個範圍。我們從數據集的開始處開始,根據我們的計算將範圍向下移動。請注意0​​,因爲如果所需的Pers_ID位於第一行(因此指定偏移量爲0),我們不必移動範圍。隨着COUNTIF結果我們指定的範圍內的高度:

OFFSET(B2;MATCH(B9;A2:A7;0)-1;0;COUNTIF(A2:A7;B9)) // without "cache" 
OFFSET(B2;B14-1;0;B15) // with "cache" 

OFFSET(B2;4-1;0;2) // partially evaluated 

他們都返回B5:B6作爲部門範圍Pers_ID = 1002

要選擇的範圍內適當配合INDEX()包裹公式:

INDEX(OFFSET(B2;B14-1;0;B15);<Row>;<Column>) 

選擇<Column>很容易。因爲我們沒有在OFFSET()式中指定寬度的範圍僅爲1列寬,因此,選擇該列將是1:

INDEX(OFFSET(B2;B14-1;0;B15);<Row>;1) 

<Row>是有點麻煩。我們需要在列C中指定日期範圍,其高度與我們對Pers_ID的範圍所做的相同。 我們主要使用與現在相同的公式,但我們不想搜索B11中的指定日期,但最近的一個(意指確切日期或更早)。爲此,我們使用SMALL() ...

SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11)) // returns 2013-01-01 (in fact it returns 41275 which is the 1st March 2013) 

...,並確定該範圍中的行數與包圍MATCH()

MATCH(SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11));OFFSET(C2;B14-1;0;B15);0) // returns 2 

整個配方則是:

// Without "cache" 
=INDEX(OFFSET(B2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));MATCH(SMALL(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));COUNTIF(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));"<="&B11));OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));0);1) 

// With "cache" 
=INDEX(OFFSET(B2;B14-1;0;B15);MATCH(SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11));OFFSET(C2;B14-1;0;B15);0);1) 

也許有一個更簡單/更乾淨的方式來實現這一點(例如,我不熟悉的數組公式或VBA)。

+0

對不起,造成巨大的延遲。你的解決方案就像一個魅力!我做了一些小改動,並添加了一些VBA代碼,在ODBC刷新後自動提供列表以確保沒有人會破壞它。 – Christian