在上一节中,实现了WPS报表查询相关的代码,但是与function CommandButton1_Click()这个函数内容相比,function CommandButton2_Click()这个函数内代码较多,需要对其内容适当精简,将部分功能使用函数替代,我来为大家科普一下关于wpsjs宏编程教程资源?下面希望有你要的答案,我们一起来看看吧!
wpsjs宏编程教程资源
在上一节中,实现了WPS报表查询相关的代码,但是与function CommandButton1_Click()这个函数内容相比,function CommandButton2_Click()这个函数内代码较多,需要对其内容适当精简,将部分功能使用函数替代。
▶ 首先优化function CommandButton1_Click()的代码:
在 第2节 中提到:“JSA 宏编辑器看不到工作表(Worksheet)对象,Worksheet对象属性CodeName是空值,无法在代码中使用这个属性引用对象。”
所以将"报表"、"字典"这些字符串使用函数替换。如果日后修改工作表,可以直接修改常量定义部分,避免了全文替换再次调试代码等情况。
//查询按钮的单击事件
function CommandButton1_Click()
{
/* 使用getReprotShName() 替换"报表"这个字符串
以应对日后工作表可能改名的情况
getReprotName() 放在lib模块 */
let ReportSh = Application.Worksheets.Item(getReportShName())
//使用getDictShName() 替换"字典"这个字符串
let DictSh = Application.Worksheets.Item(getDictShName())
let ReportQuery = ReportSh.QueryTables.Item(1)
ReportQuery.CommandText = DictSh.Range("D1").Value2.replace(/\?/g, getWhereStr(ReportSh))
ReportQuery.Refresh()
}
在lib模块,实现常量定义:
/* 定义常量 */
function getReportShName(){ return "报表"}
function getDictShName(){ return "字典"}
function getProjectShName(){ return "项目分类明细汇总"}
function getDisbursedShName(){ return "支出明细"}
▶ 优化function CommandButton2_Click()的代码,有注释的即为优化部分:
function CommandButton2_Click()
{//使用按钮功能时,当前活动工作表必定是报表
let ShReport = Application.ThisWorkbook.ActiveSheet
let DataRange = ShReport.QueryTables.Item(1).ResultRange
let r1 = getQuotaRange(DataRange)
let r2 = getDisbursedRange(DataRange)
let c1 = Selection.Cells(1)
if (!Intersect(c1, Union(r1, r2)))
{
alert(HintMsg(1))
return 0
}
let UnitValue = ShReport.Range("f1").Text
//将 BoolUnit 改为 isUnit 更好
let isUnit = UnitValue == "0-全部" || UnitValue == ""
/* 将 isUnit 和 OrderValue 作为参数传入lib模块的
getOrderWhere(IsUnit, OrderValue) 获取根据报表排序设定的条件
let OrderValue = ShReport.Cells.Item(c1.Row, 2).Value2
*/
let AddWhere = getOrderWhere(isUnit, ShReport.Cells.Item(c1.Row, 2).Value2)
/* 将 TitleValue 作为参数传入lib模块的
getTitleWhere(TitleValue) 获取根据报表标题设定的条件
let TitleValue = ShReport.Cells.Item(4, c1.Column).Value2
*/
// 定义在where里追加的第二个条件
let AddWhere2 = getTitleWhere(ShReport.Cells.Item(4, c1.Column).Value2)
// 使用 getDictShName() 替换"字典"这个字符串
let ShDict = Application.Worksheets.Item(getDictShName())
let whereStr = getWhereStr(ShReport)
let sqlstr = ShDict.Range("d3").Value2.replace(/\?/g, whereStr AddWhere AddWhere2)
let cnstr = Application.ThisWorkbook.Connections.Item(1).OLEDBConnection.Connection
// 使用 getDisbursedShName 替换"支出明细"这个字符串
let ShDetail = Application.Worksheets.Item(getDisbursedShName())
for (let qt of ShDetail.QueryTables){
qt.ResultRange.Clear()
qt.Delete()
}
let qDetail = ShDetail.QueryTables.Add(cnstr, ShDetail.Range("A3"), sqlstr)
qDetail.Refresh()
//使用 getProjectShName 替换"支出明细"这个字符串
let ShProjectDetails = Application.Worksheets.Item(getProjectShName())
sqlstr = ShDict.Range("d2").Value2.replace(/\?/g, whereStr AddWhere AddWhere2)
for (let qt of ShProjectDetails.QueryTables){
qt.ResultRange.Clear()
qt.Delete()
}
let qProjectDetails = ShProjectDetails.QueryTables.Add(cnstr, ShProjectDetails.Range("A3"), sqlstr)
qProjectDetails.Refresh()
//集中管理使用消息类字符串
alert(HintMsg(2))
}
lib模块相关代码:
/*返回提示性消息 */
//集中管理使用消息类字符串
function HintMsg(n){
switch(n){
case 1: return "所选单元格不在金额汇总数据显示区域,无法显示明细数据,请重新选择。"
case 2: return "明细查询完成,请切换到【支出明细】和【项目分类明细汇总】工作表(Sheet)查看。"
case 3: return "未知的排序值:"
default: return "未定义错误消息"
}
}
/* 函数名: getOrderWhere(IsUnit, OrderValue) 获取根据报表排序设定的条件
* 传入两个参数,IsUnit 是否是一个单位, OrderValue 为排序单元格的值
* 返回值sql-where语句
*/
function getOrderWhere(IsUnit, OrderValue){
//定义一个在sql where条件里增加的条件
let AddWhere = ""
/* 解析OrderValue,判断当前活动单元格位于什么汇总级别 */
if (OrderValue == '0') { }
//汇总合计行,什么也不用做,全部提取就好了
else
{ //根据排序值的长度来判断是哪一级的汇总
switch(OrderValue.length)
{
case 7: //类款项的汇总行
/* 查询的是 2010000 这种类汇总行 */
if (OrderValue.substr(3,4) == "0000")
{ // aSql示例:and (left([支出功能分类],3) = '201')
AddWhere = " and (left([支出功能分类],3) = '" OrderValue.substr(0,3) "')"
}
/* 查询的是 2010100 这种款汇总行 */
else if (OrderValue.substr(5,2) == "00")
{ // aSql示例:and (left([支出功能分类],5) = '20101')
AddWhere = " and (left([支出功能分类],5) = '" OrderValue.substr(0,5) "')"
}
/* 查询的是 2010201 这种项汇总行 */
else
{ // aSql示例:and (left([支出功能分类],7) = '2010101')
AddWhere = " and (left([支出功能分类],7) = '" OrderValue.substr(0,7) "')"
}
break
case 9://单位汇总行-缺款、项,只有类 单位的汇总行 201 101003
// aSql示例:and (left([支出功能分类],4) = '201-') and (left([单位],6) = '101003')
AddWhere = " and (left([支出功能分类],4) = '" OrderValue.substr(0,3) "-')"
AddWhere = IsUnit ? " and (left([单位],6) = '" OrderValue.substr(4) "')" : ""
break
case 11://单位汇总行-缺项,只有类款 单位的汇总行 20102 101003
// aSql示例:and (left([支出功能分类],6) = '20102-') and (left([单位],6) = '101003')
AddWhere = " and (left([支出功能分类],6) = '" OrderValue.substr(0,5) "-')"
AddWhere = IsUnit ? " and (left([单位],6) = '" OrderValue.substr(6) "')" : ""
break
case 13://单位汇总行 类款项 单位的汇总行 2010201 102001
// aSql示例:and (left([支出功能分类],8) = '2010201-') and (left([单位],6) = '101003')
AddWhere = " and (left([支出功能分类],8) = '" OrderValue.substr(0,7) "-')"
AddWhere = IsUnit ? " and (left([单位],6) = '" OrderValue.substr(8) "')" : ""
break
default:
Console.log(HintMsg(3) OrderValue)
}
}
return AddWhere
}
/* 函数名: getTitleWhere(TitleValue) 获取根据报表标题设定的条件
* 传入参数TitleValue为标题单元格的值
* 返回值sql-where语句
*/
function getTitleWhere(TitleValue){
//列举项目分类明细内容 如果标题是这里面的内容,要查询项目分类明细
const ProjectDetails = "工资福利支出 对个人和家庭补助支出 公用经费 部门预算项目 专项资金项目 其他项目"
let AddWhere2 = ""
//查询的是项目分类明细
if (ProjectDetails.indexOf(TitleValue) > -1){
AddWhere2 = TitleValue == "其他项目" ?
" and ([项目类别] not in ('工资福利支出','对个人和家庭补助支出','公用经费','部门预算项目','专项资金项目')"
: " and ([项目类别] ='" TitleValue "')"
}
return AddWhere2
}
至此,相关代码优化基本完成,CommandButton2_Click()内的代码可读性大幅度提高,下一节,将完成报表格式化的相关代码,使报表更美观。
,