問題背景:小明老闆看小明處理數據靈活運用各種工具,速度奇快,效率奇高,也想跟小明學點技術,以備不時之需。這不,一大早的小明還沒到辦公室,老闆就想好了難題要再考考小明的水平,順便學個一招半式。
老闆拿出了在網頁上複製的數據(圖1、表2)來要小明提取出來做成統計表格(表3)。
小明本來還緊張,生怕完成不了,當著老闆的面也不好百度。一看這個要求,心裡竊喜,太好辦了。用Excel的OFFSET函數和ROW函數就解決了。
Offset函數:Offset是Excel中的函數,在Excel中,OFFSET函數的功能為以指定的引用為參照系,通過給定偏移量得到新的引用。返回的引用可以為一個單元格或單元格區域。並可以指定返回的行數或列數。
語法:OFFSET(reference, rows, cols, [height], [width])
OFFSET 函數語法具有下列參數:
Reference:必需。 要作為偏移基準的參照。 引用必須引用單元格或相鄰單元格區域。否則, OFFSET 返回 #VALUE! 。Rows:必需。 需要左上角單元格引用的向上或向下行數。 使用 5 作為 rows 參數,可指定引用中的左上角單元格為引用下方的 5 行。 Rows 可為正數(這意味著在起始引用的下方)或負數(這意味著在起始引用的上方)。Cols:必需。 需要結果的左上角單元格引用的從左到右的列數。 使用 5 作為 cols 參數,可指定引用中的左上角單元格為引用右方的 5 列。 Cols 可為正數(這意味著在起始引用的右側)或負數(這意味著在起始引用的左側)。高度:可選。 需要返回的引用的行高。 Height 必須為正數。寬度:可選。 需要返回的引用的列寬。 Width 必須為正數。定義不太好理解,直接上實例。
步驟一:檢查數據源表的格式是否統一。把數據源的表做成格式統一的表格,每一個車型的數據區域都是8格,每8行一個循環,格式統一才能找到規律,機器是需要按規律才能正確找到對應數據。
步驟二:編寫公式(引用)提取數據。
代碼釋義:
1、序號列第一格E2=OFFSET(B$1,(ROW(B1)-1)*8,)
提取的第一列是序號,序號的第一個值在B1單元格,所以從B$1開始,之所以絕對定位,是因為所有的序號都要參照B1的位置計算。(ROW(B1)-1)是提取行號,序號第一個理應提取B1,而B1是第一行,因此偏移0行,為(ROW(B1)-1)=1-1,*8是因為左側源數據以8行一循環,偏移8行就是下一個序號的單元格位置。E2單元格的值就是第一個序號,是B1的值,為1,公式意思是「引用(B$1,(B1的行號-1)*8,)」等於offset(B$1,(1-1)*8,),也等於offset(B$1,0,),就是B1。
因為不需要列偏移,所以*8之後逗號為空。
2、序號列第二格公式自動填充為E3=OFFSET(B$1,(ROW(B2)-1)*8,)
還是從B$1開始計算,絕對應用B1。(ROW(B2)-1)*8提取第二個序號的行號,為(B2的行號-1)*8=(2-1)*8=8,參照B$1往下偏移8行,正好是第9行,就是第二個序號,取值為2。所以,公式的邏輯就是為了構造公差為8的等差數列,而這個數列的值就是應提取序號的行號。而之所用ROW(B1)、ROW(B2)取單元格行號進行計算,而不用常數,是因為用常數,公式填充無法遞增。而ROW(B1)、ROW(B2)……填充公式剛好遞增1,便於構造出8倍遞增的序號行號,用ROW(A1)、ROW(A2)……也是可以的。
3、車型列第一格公式則為F2= =OFFSET(B$2,(ROW(B1)-1)*8,)
因為源數據第一個車型的單元格是B2,那麼就從B$2開始為參照,取到的行號2、10、18剛好就是車型單元格的行號。ROW函數取行號還是一樣,構造公差為1的等差數列,然後乘以8,以8的倍數偏移,因此,不管是繼續用(ROW(B1)-1)*8開始,還是和B$2 同步,用(ROW(B2)-2)*8開始,意義一樣。
4、後面的列也同樣的道理,只是在B列的基準參照起點依次往後推一格即可。