tft每日頭條

 > 科技

 > wpsjs宏編程教程資源

wpsjs宏編程教程資源

科技 更新时间:2025-01-24 22:33:59

wpsjs宏編程教程資源?在上一節中,實現了WPS報表查詢相關的代碼,但是與function CommandButton1_Click()這個函數内容相比,function CommandButton2_Click()這個函數内代碼較多,需要對其内容适當精簡,将部分功能使用函數替代,我來為大家科普一下關于wpsjs宏編程教程資源?下面希望有你要的答案,我們一起來看看吧!

wpsjs宏編程教程資源(WPS報表JS宏代碼的優化)1

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()内的代碼可讀性大幅度提高,下一節,将完成報表格式化的相關代碼,使報表更美觀。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved