案例代码
function CommandButton1_Click(){
//初始化处理
let wb = ThisWorkbook;
let sht1 = wb.Sheets(1);
//设定读取列范围
const fangwei = [3,6];
//调用自定义函数读取D列到F列的数据
let SheetsValue = SheetValue(sht1,fangwei);
if(!SheetsValue) return MsgBox("表格数据不能为空", 0+48, "警告");
}
使用了一个自定义函数SheetsValue来提取表格数据,同时,指定提取的范围,因为SheetsValue函数中使用了slice函数,这个函数会读取数组中指定范围的数据,需要注意,slice函数读取的方式为左闭右开,所以,假设读取G列到J列,则数组fangwei的元素应该为(G列索引值,J列索引值+1),同时,还要注意,索引值是从0开始的,即A列的索引值为0,D列的索引值为3。
if语句判断获取的值是否为空,为空的情况下使用!取相反的布尔值,即true,然后结束函数运行,返回一个Msg框。
//获取表格数据,提取其中D列到F列的数据
function SheetValue(sht,arry) {
let results = [];
// 读取表格数据赋值给sheetData
let sheetData = sht.Range('A1').CurrentRegion.Value2
// 排除第一个元素(子数组)包含列头
for (let i = 1; i < sheetData.length; i++) {
// 从每行提取D到F列的数据
let rowData = sheetData[i].slice(arry[0], arry[1]);
results.push(rowData);
}
// 如果results数组为空,则返回空字符串,否则返回 results 数组
return results.length > 0 ? results : "";
}
SheetValue函数接收传递的参数,然后声明为sht和arry,sht为指定读取的表格,arry为包含读取范围的数组
sheetData的赋值使用了CurrentRegion属性,在案例代码中,CurrentRegion属性会获取工作表中以A1为起点的当前区域(一般指连续的数据区域)的全部值,见下例
图1表格数据
在主函数末端添加Console.log(JSON.stringify(SheetsValue));即可在调试窗口查看获取的表格数据,需要注意的是,JS宏的使用的所有代码必选包含在函数内部执行。
图2调试窗口
可以看出空缺的地方会以null来填充,同时,获取的为相邻的存在数据的所有行和列
随后,案例函数会提取指定范围的列,这里要理解一个二维数组的概念,函数获取数据如上图2所示,表格的每一行数据都是一个母数组(所有列)的一个元素(子数组),而表格的每一行数据做为一个母数组,下面每一个元素,则是这一行的单元格的值
同时,循环的起始值为1,使得循环的内容sheetData[i],变为sheetData[1],排除了第一行的数据,一般第一行数据为表头数据,如上图1所示,第一行为表头。此外,.length方法会返回数组sheetData中的元素个数,使得循环可以正好读取完所有的值(数组的key从0开始)