【WPS应用案例】JS宏实时查询数据,高端的效果,往往只需要简单的代码

懒人办公

创作者俱乐部成员

【案例】下面是一张数据表和一张查询表,当我们在查询表单击A列的村名时,会在C:H区域实时显示该村的查询结果。

【代码】具体代码如下,可按ALT+F11打开WPS宏编辑器,复制下面的代码粘贴到编辑器中。

function Workbook_SheetSelectionChange(Sh, Target)

{

if(Sh.Name=='查询表'

&& Target.Column==1

&& Target.Row>1

&& Target.Count==1

)

{

ar=Sheets.Item('数据表').Range("a1").CurrentRegion.Value2

Range('c5:h65535').ClearContents()

br=二维数组查询(ar,1,Target)

Range('c2').Resize(br.length,br[0].length).Value2=br

}

}

function 二维数组查询(数组,查找列,查找值)

{

let 结果数组=[]

k=0

for(i=0;i<数组.length;i++){

结果数组[i]=new Array(数组[0].length)

if(数组[i][查找列-1]==查找值){

for(j=0;j<数组[0].length;j++){

结果数组[k][j]=数组[i][j]

}

k++

}

}

return 结果数组

}

【代码解释】

// 这是一个工作表单元格选择事件,当单元格被选择时触发相应事件

function Workbook_SheetSelectionChange(Sh, Target) {

// 如果工作表名是'查询表'...

if(Sh.Name=='查询表'

// 并且被选择的列为第一列..

&& Target.Column==1

// 并且被选择的行大于第一行

&& Target.Row>1

// 并且被选择的单元格只有一个

&& Target.Count==1

) {

// 将数据表的数据区域赋值给ar。

ar=Sheets.Item('数据表').Range("a1").CurrentRegion.Value2

// 清除范围为'c5:h65535'的所有单元格的内容。

Range('c5:h65535').ClearContents()

// 调用二维数组查询函数(下文中有解释),将结果赋值给br。参数包括ar(前面获取的数据),查找列为第一列的村名,以及查找值为被选择的单元格。

br=二维数组查询(ar,1,Target)

// 将二维数组br的内容输出到C2至H列区域。

Range('c2').Resize(br.length,br[0].length).Value2=br

}

}

// 定义了一个名为二维数组查询的函数,该函数接收三个参数:数组、查找列和查找值。

function 二维数组查询(数组,查找列,查找值) {

// 初始化一个空数组,准备用来存放查询结果。

let 结果数组=[]

// 初始化一个变量k,初值为0,用来记录找到的符合条件的行数。

k=0

// 遍历输入的数组。

for(i=0;i<数组.length;i++){

// 在结果数组中添加一个新的空数组,长度与原数组的第一行长度相同。这是为了存储可能存在的不规则二维数组。

结果数组[i]=new Array(数组[0].length)

// 如果数组的当前行的查找列的值等于查找值...

if(数组[i][查找列-1]==查找值){

// 将当前行的所有数据复制到结果数组的对应位置。

for(j=0;j<数组[0].length;j++){

结果数组[k][j]=数组[i][j]

}

// 将k增加1,表示找到了一行符合条件的记录。

k++

}

}

// 返回结果数组。

return 结果数组

}

【素材下载】点击下方链接,下载文件至本地文件夹进行练习。

https://www.kdocs.cn/l/ch1o5oEIXjEv

贵州省
浏览 17152
5
31
分享
31 +1
28
5 +1
全部评论 28
 
老师请教一下,如果把村名那列做成下拉框,选中框里的值,表格发生变化,该怎么写。求指点
· 江苏省
回复
 
好耐心的解答,太感谢老师了
· 四川省
回复
 
很好~
· 湖北省
回复
 
function Workbook_SheetSelectionChange(Sh, Target) { if(Sh.Name=='查询表' && Target.Column == 1 && Target.Row > 1 && Target.Count == 1 ) { var arr = Sheets.Item('数据表').Range("a1").CurrentRegion.Value2; Range('c2:h65535').ClearContents(); var brr = arr.filter(item => item[0] == Target); Range('c2').Resize(brr.length,brr[0].length).Value2 = brr; } }
· 湖南省
回复
 
// 清除范围为'c5:h65535'的所有单元格的内容。 Range('c5:h65535').ClearContents() 这个为啥要从c5开始清除下呢
· 湖北省
回复
懒人办公

创作者俱乐部成员

写错了,是C2
· 贵州省
回复
 
数组 筛选
· 浙江省
回复
 
案例实用性很强,想学习!
· 江苏省
回复
 
老师讲解非常详细,知识点知识扎实,实操熟练,每次学习都受益匪浅!谢谢老师!
· 吉林省
回复
 
值得学习👍
· 江苏省
回复
 
这个案例太好了 对我太有用了 感谢分享
· 内蒙古
1
回复
 
案例特别优秀,值得推荐学习。
· 四川省
回复
 
学习中
· 中国
回复
 
这个案例太好了 对我太有用了 感谢分享
· 北京
回复
 
打卡学习
· 浙江省
回复
 
很棒赞
· 湖南省
回复
 
学习
· 江苏省
回复
 
宏代码非常实用,提高了工作效率。
· 湖南省
回复
懒人办公

创作者俱乐部成员

练起来
· 贵州省
回复
 
张俊

WPS函数专家

大佬的标题,让我瞬间想起了,高端的食材往往来源于最朴素的烹饪方式!
· 上海
回复
 
宏代码非常实用,使我们办公更加高效,工作更便捷
· 山东省
回复
 
这个功能很实用,要是能出视频细致讲解,就更好了
· 北京
回复