自定义函数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;
}
创作者俱乐部成员