龔家強(qiáng)
(廣西博士海意信息科技有限公司,廣西 南寧 530028)
利用EXCEL實現(xiàn)石油及其產(chǎn)品的計量報告輸出以及其中的VCF值的自動查找及插值計算,在用于鑒定工作時,具有如下特點: VCF值的查找計算方便、準(zhǔn)確、快速;程序開發(fā)過程不復(fù)雜,開發(fā)周期短,無需進(jìn)行復(fù)雜的報表輸出介面設(shè)計,界面簡單直觀,便于修改報表格式;體積小巧,免安裝綠色軟件,可以U盤為載體,便于攜帶及數(shù)據(jù)保護(hù)和備份;系統(tǒng)崩潰時不會丟失數(shù)據(jù),避免了復(fù)雜的數(shù)據(jù)災(zāi)難恢復(fù)過程;使用人員無須專門培訓(xùn),易于上手。而且電腦目前普遍都裝有 EXCEL,當(dāng)所攜帶的電腦或便攜打印機(jī)出現(xiàn)軟件或硬件故障時,可以迅速轉(zhuǎn)換工作電腦,不用重新安裝打印機(jī)驅(qū)動程序,即可利用現(xiàn)場的其它電腦來完成計算及計量報告輸出工作,不致于延誤工作時間,特別是當(dāng)船需要搶潮水快速卸貨,或是需要速遣等,對工作時間有一定要求的時候。
表1 T60A原油VCF值表節(jié)選表
注意到表1為一有限二維表格,第一行是20℃下的標(biāo)準(zhǔn)密度值,第一列是溫度值,其余為相應(yīng)的標(biāo)準(zhǔn)密度值和溫度值所交叉對應(yīng)的VCF值。溫度值從負(fù)20度開始線性遞增,每次遞增值為0.25,到150度結(jié)束??疾鞙囟戎档倪f增情況,注意到每一度的溫度值都分為四個值域區(qū)間:xyz.00-xyz.25;xyz.25-xyz.50;xyz.50-xyz.75;xyz.75-xy(z+1).0(以 x、y和z分別代表溫度值的百位數(shù)、十位數(shù)和個位數(shù)),而每一個區(qū)間的端點值即為表中值。因此,只要將取得的待查溫度值與這四個值域區(qū)間的邊界值相比較,就可以確定待查溫度值溫度值落在哪一個值域區(qū)間之內(nèi),再將這一值域區(qū)間兩端的值即表中溫度值查找出來,就完成了溫度值的查找工作。
同時,密度值從610.0開始等值遞增,遞增值為2,到1090.0結(jié)束。與溫度的查找算法同理,查找范圍也為四個值域區(qū)間,把待查密度值所在值域區(qū)間的兩個端點值查找出來。
當(dāng)兩個區(qū)間的端點值都找出來之后,即可將其所交叉對應(yīng)的表中四個VCF值也查找出來,進(jìn)行插值計算,得到所需的VCF值。這就是算法的基本思想。
ADDRESS():按照給定的行號和列標(biāo),建立文本類型的單元格地址;
INDIRECT():返回指定單元格中包含的地址字符串所引用的單元格中的數(shù)值;
MATCH():返回在指定方式下與指定數(shù)值匹配的數(shù)組中元素的相應(yīng)位置;
TRUNC():將數(shù)字的小數(shù)部分截去,返回整數(shù)。
3.2.1 語句一
ADDRESS(IF((TRUNC(LOOK_TEMP.)+0.25)>LOOK_TEMP.,M ATCH(TRUNC(LOOK_TEMP.),temp._value_range),IF((TRUNC(LOOK_TEMP.)+0.5)>LOOK_TEMP.,MATCH(TRUNC(LOOK_TEMP.)+0.25,temp._value_range),IF((TRUNC(LOOK_TEMP.)+0.75)>LOOK_TEMP.,MATCH(TRUNC(LOOK_TEMP.)+0.5,temp._value_r ange),MATCH(TRUNC(LOOK_TEMP.)+0.75,temp._value_range)))),1))。
語句實現(xiàn)的功能是,查找小于或等于待查溫度值的表中溫度值的單元格地址。當(dāng)?shù)玫街邓诘膯卧竦男刑柡土刑栔螅涂墒褂?ADDRESS()函數(shù)得到表中溫度值的單元格地址,然后再用INDIRECT()函數(shù)來返回指定單元格中包含的地址字符串所引用的單元格中的數(shù)值,以進(jìn)行插值計算。在這里需要說明的是,因為在EXCEL2003中ADDRESS()函數(shù)無法直接嵌套在INDIRECT()函數(shù)之中,所以,對于ADDRESS函數(shù)所得到的單元格地址,還需要用INDIRECT()函數(shù)在另一個單元格中返回數(shù)值。
語句中的參數(shù) Look_temp為現(xiàn)場取得的待查表溫度值,在EXCEL中使用本語句時,此變量就用錄入的待查找溫度值所在的單元格代替,如A10等。參數(shù)TEMP._VALUE_RANGE指出錄入的溫度值所在的區(qū)域, 例如,若為$A$1∶$A$682,即表示數(shù)據(jù)錄入在工作表中第一列的第一行到第682行之內(nèi),相應(yīng)溫度值為從-20度到150度。
本語句嵌套了三層IF條件語句,使用了MATCH函數(shù)的精確匹配查找功能。外層IF語句的作用是,將LOOK_TEMP.取整后,再加上 0.25,即為第一個值域區(qū)間的最大值。如果LOOK_TEMP.大于此最大值,則說明LOOK_TEMP.不在這一值域區(qū)間之中,IF語句邏輯值為假,執(zhí)行嵌套的第二層IF語句,即 IF(…)。否則執(zhí)行第一條語句,即:MATCH(TRUNC(LOOK_TEMP.), TEMP._VALUE_RANGE),得出此值域區(qū)間的最小值,即VCF值表中所顯示的溫度值,xyz.00,在VCF值表中第幾行。在這里,MATCH()函數(shù)就相當(dāng)于一個循環(huán)語句,從錄入溫度所在列的第一行一直比較到最后一行,直到找到匹配值為止。同理,嵌套的內(nèi)二層 IF語句判斷LOOK_TEMP處于余下的三個值域區(qū)間的哪一個之中。
需要說明的是,語句中的最后一個數(shù)字“1”,是偏移量。如果VCF二維數(shù)據(jù)值域不錄入在EXCEL工作表的第一列,而是從第N列M行開始錄入的話,那么,因為本語句中MATCH()函數(shù)找出的只是對應(yīng)于錄入的VCF二維數(shù)據(jù)值域的第一列的相對偏移量,而ADDRESS函數(shù)是居于絕對偏移量,即相對于整個工作表第一列的偏移量來引用參數(shù)的。所以,在這里要把MATCH()函數(shù)得出的相對偏移量轉(zhuǎn)變?yōu)榻^對偏移量。具體要根據(jù)所錄入的 VCF值域錄入在工作表的哪一列哪一行,來確定偏移量是多少。換句話來說,即在一個大的二維工作表中,所劃分出來的任意位置的一個子二維表格的第一列,相對于整個大的二維表格的第一列,偏移了多少列。
3.2.2 語句二
ADDRESS(IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.75),M ATCH(TRUNC(LOOK_TEMP.)+1,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.5),MATCH(TRUNC(LOOK_TEMP.)+0.75,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.25),MATCH(TRUNC(LOOK_TEMP.)+0.5,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)),MATCH(TRUN C(LOOK_TEMP.)+0.25,temp._value_range),MATCH(LOOK_TEM P.,temp._value_range))))),1))。
語句實現(xiàn)的功能是,查找剛好大于或等于待查溫度值的表中溫度值的單元格地址。
3.2.3 語句三
ADDRESS(1,IF(TRUNC(LOOK_DENSITY/10)*10=LOOK_DENS ITY,MATCH(TRUNC(LOOK_DENSITY/10)*10,density_value_ra nge),IF((TRUNC(LOOK_DENSITY/10)*10+2)>LOOK_DENSITY,M ATCH(TRUNC(LOOK_DENSITY/10)*10,density_value_range),IF((TRUNC(LOOK_DENSITY/10)*10+4)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSITY/10)*10+2,density_value_range),IF((TRUNC(LOOK_DENSITY/10)*10+6)>LOOK_DENSITY,MATCH(TRU NC(LOOK_DENSITY/10)*10+4,density_value_range),IF((TR UNC(LOOK_DENSITY/10)*10+8)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSITY/10)*10+6,density_value_range),MATCH(TRU NC(LOOK_DENSITY/10)*10+8,density_value_range)))))))。
語句實現(xiàn)的功能是,查找剛好小于或等于待查密度值的表中密度值的單元格地址。在密度值查找中,對于密度值是分為五個取值區(qū)間來進(jìn)行判斷。LOOK_DENSITY為所待查的20攝氏度下的標(biāo)準(zhǔn)密度。
3.2.4 語句四
ADDRESS(1,IF(LOOK_DENSITY>TRUNC(LOOK_DENSITY/10)*1 0+8,MATCH(TRUNC(LOOK_DENSITY/10)*10+10,density_value_r ange),IF(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+6),MA TCH(TRUNC(LOOK_DENSITY/10)*10+8,density_value_range),I F(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+4),MATCH(TRU NC(LOOK_DENSITY/10)*10+6,density_value_range),IF(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+2),MATCH(TRUNC(LOOK_DENSITY/10)*10+4,density_value_range),IF(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10),MATCH(TRUNC(LOOK_DENSITY/10)*10+2,density_value_range),MATCH(TRUNC(LOOK_DENSITY/10)*10,density_value_range)))))))。
語句實現(xiàn)的功能是,查找剛好大于或等于待查密度值的表中密度值的單元格地址。
3.2.5 語句五
ADDRESS(IF((TRUNC(LOOK_TEMP.)+0.25)>LOOK_TEMP.,M ATCH(TRUNC(LOOK_TEMP.),$A$1∶$A$682),IF((TRUNC(LOOK_T EMP.)+0.5)>LOOK_TEMP.,MATCH(TRUNC(LOOK_TEMP.)+0.25,$A$1∶$A$682),IF((TRUNC(LOOK_TEMP.)+0.75)>LOOK_TEMP.,M ATCH(TRUNC(LOOK_TEMP.)+0.5,$A$1∶$A$682),MATCH(TRUNC(LOOK_TEMP.)+0.75,$A$1∶$A$682)))),
IF(TRUNC(LOOK_DENSITY/10)*10=LOOK_DENSITY,
MATCH(TRUNC
(LOOK_DENSITY/10)*10,density_value_range),IF((TRUNC(LOOK_DENSITY/10)*10+2)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSITY/10)*10,density_value_range),IF((TRUNC(LOOK_DENSITY/10)*10+4)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENS ITY/10)*10+2,density_value_range),IF((TRUNC(LOOK_DEN SITY/10)*10+6)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSITY/10)*10+4,density_value_range),IF((TRUNC(LOOK_DENSIT Y/10)*10+8)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSITY/10)*10+6,density_value_range),MATCH(TRUNC(LOOK_DENSITY/10)*10+8,density_value_range)))))))。
語句實現(xiàn)的功能是,查找剛好小于或等于待查溫度值的表中值和剛好小于或等于待查的密度值的表中密度值所交叉對應(yīng)的VCF值的單元格地址。語句中行號的查找語句使用的是語句一中行號的查找語句,列號的查找語句則是語句三中列號的查找語句。
3.2.6 語句六
ADDRESS(IF((TRUNC(LOOK_TEMP.)+0.25)>LOOK_TEMP.,M ATCH(TRUNC(LOOK_TEMP.),$A$1∶$A$682),IF((TRUNC(LOOK_T EMP.)+0.5)>LOOK_TEMP.,MATCH(TRUNC(LOOK_TEMP.)+0.25,$A$1∶$A$682),IF((TRUNC(LOOK_TEMP.)+0.75)>LOOK_TEMP.,M ATCH(TRUNC(LOOK_TEMP.)+0.5,$A$1∶$A$682),MATCH(TRUNC(LOOK_TEMP.)+0.75,$A$1∶$A$682)))),
IF(LOOK_DENSITY>TRUNC(LOOK_DENSITY/10)*10+8,MATCH(TR UNC(LOOK_DENSITY/10)*10+10,density_value_range),IF(L OOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+6),MATCH(TRUN C(LOOK_DENSITY/10)*10+8,density_value_range),IF(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+4),MATCH(TRUNC(L OOK_DENSITY/10)*10+6,density_value_range),IF(LOOK_DE NSITY>(TRUNC(LOOK_DENSITY/10)*10+2),MATCH(TRUNC(LOOK_DENSITY/10)*10+4,density_value_range),IF(LOOK_DENSI TY>(TRUNC(LOOK_DENSITY/10)*10),MATCH(TRUNC(LOOK_DENS ITY/10)*10+2,density_value_range),MATCH(TRUNC(LOOK_D ENSITY/10)*10,density_value_range)))))))。
語句實現(xiàn)的功能是,查找剛好小于或等于待查溫度值的表中溫度值和剛好大于或等于待查密度值的表中密度值所交叉對應(yīng)的VCF值的單元格地址。
3.2.7 語句七
ADDRESS(IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.75),M ATCH(TRUNC(LOOK_TEMP.)+1,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.5),MATCH(TRUNC(LOOK_TEMP.)+0.75,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.25),MATCH(TRUNC(LOOK_TEMP.)+0.5,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)),MATCH(TRUN C(LOOK_TEMP.)+0.25,temp._value_range),MATCH(LOOK_TEM P.,temp._value_range))))),
IF(TRUNC(LOOK_DENSITY/10)*10=LOOK_DENSITY,MATCH(TRUN C(LOOK_DENSITY/10)*10,density_value_range),IF((TRUNC(LOOK_DENSITY/10)*10+2)>LOOK_DENSITY,MATCH(TRUNC(LOO K_DENSITY/10)*10,density_value_range),IF((TRUNC(LOOK_DENSITY/10)*10+4)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DEN SITY/10)*10+2,density_value_range),IF((TRUNC(LOOK_DE NSITY/10)*10+6)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSIT Y/10)*10+4,density_value_range),IF((TRUNC(LOOK_DENSI TY/10)*10+8)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSITY/1 0)*10+6,density_value_range),MATCH(TRUNC(LOOK_DENSIT Y/10)*10+8,density_value_range)))))))。
語句實現(xiàn)的功能是,查找剛好大于或等于待查溫度值的表中溫度值和剛好小于或等于待查密度值的表中密度值所交叉對應(yīng)的VCF值的單元格地址。
3.2.8 語句八
ADDRESS(IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.75),M ATCH(TRUNC(LOOK_TEMP.)+1,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.5),MATCH(TRUNC(LOOK_TEMP.)+0.75,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)+0.25),MATCH(TRUNC(LOOK_TEMP.)+0.5,temp._value_range),IF(LOOK_TEMP.>(TRUNC(LOOK_TEMP.)),MATCH(TRUN C(LOOK_TEMP.)+0.25,temp._value_range),MATCH(LOOK_TEM P.,temp._value_range))))),
IF(LOOK_DENSITY>TRUNC(LOOK_DENSITY/10)*10+8,MATCH(TR UNC(LOOK_DENSITY/10)*10+10,density_value_range),IF(L OOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+6),MATCH(TRUN C(LOOK_DENSITY/10)*10+8,density_value_range),IF(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+4),MATCH(TRUNC(L OOK_DENSITY/10)*10+6,density_value_range),IF(LOOK_DE NSITY>(TRUNC(LOOK_DENSITY/10)*10+2),MATCH(TRUNC(LOOK_DENSITY/10)*10+4,density_value_range),IF(LOOK_DENSI TY>(TRUNC(LOOK_DENSITY/10)*10),MATCH(TRUNC(LOOK_DENS ITY/10)*10+2,density_value_range),MATCH(TRUNC(LOOK_D ENSITY/10)*10,density_value_range)))))))。
語句實現(xiàn)的功能是,查找剛好大于或等于待查溫度值的表中溫度值和剛好大于或等于待查密度值的表中密度值所交叉對應(yīng)的VCF值的單元格地址。
設(shè)測量的的溫度為 37.3度,20攝氏度下標(biāo)準(zhǔn)密度為0.881,則語句一查找到的表中值為37.25,語句2查找到的值為37.50,語句三查找到的值為0.880,語句四查找到的值為0.882,語句五查找到的值為37.25和0.880所對應(yīng)的VCF值0.9863.同理,語句六、七、八查到的VCF值分別為0.9864、0.9861、0.9862。得到所有的相關(guān)值后,即可進(jìn)行插值計算,得到所需的VCF值。
又設(shè)測量的溫度值和所給定的密度值在表中都可以直接查到,如當(dāng)溫度值為37.5,密度為0.880時,則語句一、二查到的值為37.5,語句三、四查到的值為0.880,語句五、六、七、八查到的值都為0.9863,也可求得所需要的值。
3.2僅是為了具體地說明查找過程,語句還可以進(jìn)一步簡化。請讀者思考。
對于《油品計量員讀本》中,溫度取較接近值不插值,而密度值及其所對應(yīng)的VCF值進(jìn)行插值計算,可以用以下兩語句,來實現(xiàn)較接近待查溫度值的表中溫度值與表中兩個用于插值計算的密度值所交叉對應(yīng)的VCF值的查找:
ADDRESS(IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+(0.75+0.1 25)),MATCH(TRUNC(LOOK_TEMP)+1,temp._value_range),IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+(0.5+0.125)),MATCH(TRUNC(LOOK_TEMP)+0.75,temp._value_range),IF(LOOK_TEMP>(TR UNC(LOOK_TEMP)+(0.25+0.125)),MATCH(TRUNC(LOOK_TEMP)+0.5,temp._value_range),IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+0.125),MATCH(TRUNC(LOOK_TEMP)+0.25,temp._value_ran ge),MATCH(TRUNC(LOOK_TEMP),temp._value_range))))),IF((TRUNC(LOOK_DENSITY/10)*10+2)>LOOK_DENSITY,MATCH(TR UNC(LOOK_DENSITY/10)*10,density_value_range),IF((TRU NC(LOOK_DENSITY/10)*10+4)>LOOK_DENSITY,MATCH(TRUNC(L OOK_DENSITY/10)*10+2,density_value_range),IF((TRUNC(LOOK_DENSITY/10)*10+6)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DENSITY/10)*10+4,density_value_range),IF((TRUNC(LOO K_DENSITY/10)*10+8)>LOOK_DENSITY,MATCH(TRUNC(LOOK_DE NSITY/10)*10+6,density_value_range),MATCH(TRUNC(LOOK_DENSITY/10)*10+8,density_value_range))))))。
即為查找較接近待查溫度值的表中溫度值和剛好小于或等于待查密度值的表中密度值所交叉對應(yīng)的VCF值的單元格地址。
ADDRESS(IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+(0.75+0.1 25)),MATCH(TRUNC(LOOK_TEMP)+1,temp._value_range),IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+(0.5+0.125)),MATCH(TRUNC(LOOK_TEMP)+0.75,temp._value_range),IF(LOOK_TEMP>(TR UNC(LOOK_TEMP)+(0.25+0.125)),MATCH(TRUNC(LOOK_TEMP)+0.5,temp._value_range),IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+0.125),MATCH(TRUNC(LOOK_TEMP)+0.25,temp._value_ran ge),MATCH(TRUNC(LOOK_TEMP),temp._value_range))))),IF(LOOK_DENSITY>TRUNC(LOOK_DENSITY/10)*10+8,MATCH(TRUN C(LOOK_DENSITY/10)*10+10,density_value_range),IF(LOO K_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+6),MATCH(TRUNC(LOOK_DENSITY/10)*10+8,density_value_range),IF(LOOK_D ENSITY>(TRUNC(LOOK_DENSITY/10)*10+4),MATCH(TRUNC(LOO K_DENSITY/10)*10+6,density_value_range),IF(LOOK_DENS ITY>(TRUNC(LOOK_DENSITY/10)*10+2),MATCH(TRUNC(LOOK_D ENSITY/10)*10+4,density_value_range),IF(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10),MATCH(TRUNC(LOOK_DENSIT Y/10)*10+2,density_value_range),MATCH(TRUNC(LOOK_DEN SITY/10)*10,density_value_range)))))))。
即為查找較接近待查溫度值的表中溫度值和剛好大于或等于待查密度值的表中密度值所交叉對應(yīng)的VCF值的單元格地址。
在GB/T 1885-1998標(biāo)準(zhǔn)中,溫度和密度都不插值計算,全都使用較接近值的算法,則只需使用一條語句,來實現(xiàn)較接近待查溫度值和待查密度值的表中溫度值和表中密度值所交叉對應(yīng)的VCF值的查找:
ADDRESS(IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+(0.75+0.1 25)),MATCH(TRUNC(LOOK_TEMP)+1,temp._value_range),IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+(0.5+0.125)),MATCH(TRUNC(LOOK_TEMP)+0.75,temp._value_range),IF(LOOK_TEMP>(TR UNC(LOOK_TEMP)+(0.25+0.125)),MATCH(TRUNC(LOOK_TEMP)+0.5,temp._value_range),IF(LOOK_TEMP>(TRUNC(LOOK_TEMP)+0.125),MATCH(TRUNC(LOOK_TEMP)+0.25,temp._value_ran ge),MATCH(TRUNC(LOOK_TEMP),temp._value_range))))),IF(LOOK_DENSITY>TRUNC(LOOK_DENSITY/10)*10+9,MATCH(TRUN C(LOOK_DENSITY/10)*10+10,density_value_range),IF(LOO K_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+7),MATCH(TRUNC(LOOK_DENSITY/10)*10+8,density_value_range),IF(LOOK_D ENSITY>(TRUNC(LOOK_DENSITY/10)*10+5),MATCH(TRUNC(LOO K_DENSITY/10)*10+6,density_value_range),IF(LOOK_DENS ITY>(TRUNC(LOOK_DENSITY/10)*10+3),MATCH(TRUNC(LOOK_D ENSITY/10)*10+4,density_value_range),IF(LOOK_DENSITY>(TRUNC(LOOK_DENSITY/10)*10+1),MATCH(TRUNC(LOOK_DENS ITY/10)*10+2,density_value_range),MATCH(TRUNC(LOOK_D ENSITY/10)*10,density_value_range)))))))
本文中的程序語句均在EXCEL2003下通過。
在實際應(yīng)用中,語句仍需要進(jìn)行改進(jìn)。對輸入的溫度值和密度值,應(yīng)進(jìn)行值域檢查,即對輸入值的有效性進(jìn)行檢查,同時也對邊界值的情況進(jìn)行處理。當(dāng)輸入無效值時,給出提示,以避免無效的計算結(jié)果,使程序完善,具有健壯性和穩(wěn)定性。
因為原油時常來自同一產(chǎn)區(qū),所以其品質(zhì)基本上變化不大。因此只需將常用的VCF值域輸入EXCEL表格中。僅需輸入較少的數(shù)據(jù)量,就能達(dá)到預(yù)期的目的。而對于需用到的未錄入的VCF數(shù)據(jù),也可現(xiàn)場輸入到二維表格中,就可利用程序進(jìn)行相應(yīng)的查找插值計算,減少了計算的工作量及強(qiáng)度,提高了工作效率。
本文語句實現(xiàn)了溫度、密度及溫度和密度所交叉對應(yīng)的VCF值都進(jìn)行插值計算,僅密度和密度所對應(yīng)的VCF值進(jìn)行插值計算,無插值計算三種查找算法,并且僅在EXCEL的工作界面中實現(xiàn)查找并得到所需的結(jié)果,應(yīng)用相對簡單。對于同一個VCF數(shù)據(jù)表,可以根據(jù)實際情況的需要來選用不同的算法,以適合工作之需要。而且本文語句具有很強(qiáng)通用性,稍加修改,即可建立一個空白的查找模板。使用時只要將表格數(shù)據(jù)錄入,即可完成任意二維表格數(shù)據(jù)的查找及插值計算工作,基本上可以應(yīng)用于鑒定工作中所用到的大多數(shù)表格。
[1] 石油計量表原油部分(GB/T 1885-1998專用).
[2] GB/T 19779-2005,石油和液體石油產(chǎn)品油量計算靜態(tài)計量.
[3] John Walkenbach.Excel 2003 Formulas.Wiley Publishing,Inc.2004.
[4] 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)[M].清華大學(xué)出版社,1997.
[5] 譚浩強(qiáng).C語言程序設(shè)計[M].清華大學(xué)出版社,2000.
[6] 肖素琴.油品計量員讀本[M].中國石化出版社,2001.