自定义函数JSAVALUE在JSA中给单元格区域、字符串型工作表数组、JSA数组取值并还原错误文本

function JSAVALUE(rng_or_tablearraytext){ //取值

//JSA中使用:rng_or_tablearraytext为区域字符串型工作表数组JSA数组对象。

//工作表中使用:无意义rng_or_tablearraytext为区域字符串型工作表数组×不能使用工作表数组对象,使用后错误值变为1,2,3……,错误值不会转换。

Application.Volatile(); //标记为易失性函数。

var type = typeof rng_or_tablearraytext;

var crr = [];

if((type=="string" && !(/^{.*}$/.test(rng_or_tablearraytext))) || type=="number" || type=="function" || type=="object"){ //字符串、数字、区域、数组 取值

//#SPILL!必须是字符串"#SPILL!",#CALC!必须是字符串"#CALC!"。

var arr = rng_or_tablearraytext.valueOf();

var brr = Array.isArray(arr) ? arr : [[arr]];

crr = brr.map(ar=>ar.map(v=>{

switch(v){

case undefined:

return 0;

break;

case -2147352572: //JSA中使用 且 rng_or_tablearraytext为JSA数组对象 且 跨文件需Run()运行此函数 时:空洞、undefined 都被转换为 -2147352572

//Run 方法返回被调用的宏返回的任何值。如果将对象作为参数传递给宏,该对象将转换为相应的值(通过对该对象应用 Value 属性)。这意味着不能用 Run 方法将对象传递给宏。

//空洞、undefined ==> -2147352572 ==>

//数组中是空洞,选此:"#REF!";

//数组中是undefined,选此:undefined转的值;

return 0;

break;

case -2146826288:

return "#NULL!";

break;

case -2146826281:

return "#DIV/0!";

break;

case -2146826273:

return "#VALUE!";

break;

case -2146826265:

return "#REF!";

break;

case -2146826259:

return "#NAME?";

break;

case -2146826252:

return "#NUM!";

break;

case -2146826246:

return "#N/A";

break;

case -2146826243:

return "#SPILL!";

break;

case -2146826238:

return "#CALC!";

break;

default:

return v;

}

}))

}

if(type=="string" && (/^{.*}$/.test(rng_or_tablearraytext))){ //字符串型工作表数组 取值

//1.是单元格中的数组书写方式且是字符串。例如:'{1,2,3;4,5,6;7,8,9}'

//2.不能有空洞,即不能出现有占位无元素的情况。例如:'{1,,2}',可补填0。

//3.#SPILL!必须是字符串"#SPILL!",#CALC!必须是字符串"#CALC!"。

//4.如果在工作表单元格中使用 “字符串型工作表数组”,原来数组中所有的双引号要转义,即写成2个即""。

crr = Application.Evaluate('IFERROR(' + rng_or_tablearraytext + ',SWITCH(ERROR.TYPE(' + rng_or_tablearraytext + '),1,"#NULL!",2,"#DIV/0!",3,"#VALUE!",4,"#REF!",5,"#NAME?",6,"#NUM!",7,"#N/A",9,"#SPILL!",14,"#CALC!"))');

}

return crr;

}

云南省
浏览 951
收藏
3
分享
3 +1
1
+1
全部评论 1
 
麦子颉
麦子颉

创作者俱乐部成员

打卡
· 北京
回复