wpsjs宏編程教程資源?在上一節中,實現了WPS報表查詢相關的代碼,但是與function CommandButton1_Click()這個函數内容相比,function CommandButton2_Click()這個函數内代碼較多,需要對其内容适當精簡,将部分功能使用函數替代,我來為大家科普一下關于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每日頭條,我们将持续为您更新最新资讯!