创作声明:部分内容由AI辅助创作
不同对象的同名方法用法不同
招式9:不同对象的同名方法示例
不同性别,但同名同姓的两个人,
前面我们已经了解了Workbooks集合对象的Add()方法。对于Sheets集合对象同样有Add()方法,用于向工作簿中添加一个新表,适用于所有的Sheets集合对象中的各种表类型。我们需要重新学习针对Sheets集合对象的语法规则(对于Range对象又变成Insert方法了)如下:
Sheets.Add:fn(Before:?,After:?,Count:?,Type:?) As IDispatch
返回的IDispatch对象是一个COM(Component Object Model)接口的引用,是微软提出的标准。简而言之,在WPS的JS宏中,IDispatch对象是一个桥梁,它让JavaScript能够与WPS Office的COM对象模型进行交互,实现复杂的自动化任务。
参数说明:
- Before: 可选。新工作表将被添加到指定的现有工作表之前。Before和After不能同时使用,两者同时省略则认为是在当前的活动工作表之前添加。
- After: 可选。新工作表将被添加到指定的现有工作表之后。
- Count: 可选。指定要添加的工作表数量。默认值为1。
- Type: 可选。指定新工作表类型。默认值为普通工作表,我电脑上的WPS版本直接支持Excel VBA枚举型常量作为参数,例如xlChart。
打开“代码库.xlsm”文件的WPS宏编辑器,输入以下代码,带分号的语句是可录制的:
function 新建表(){
Sheets.Add(undefined,undefined,1,xlChart)//全参数
Worksheets.Add();
Charts.Add()
Excel4MacroSheets.Add()
DialogSheets.Add()
Debug.Print("Sheets:"+Sheets.Count,"Worksheets:"+Worksheets.Count,"Charts:"+Charts.Count)
}
说明:首先用Sheets集合对象的全参数方式添加一张图表,然后用四种不同表类型的Add()方法添加了四张表,最后使用输出语句,统计了Sheet集合对象、Worksheets集合对象、Charts集合对象的现有数量。执行代码后,数字的缺口就是另外两种为进行数量统计的表类型。
同时看到工作表窗口,WPS宏编辑器窗口、这样在单步调试时方便观察效果
再举一个Item()方法的示例,这个方法通常用于获取集合中的特定项目,语法规则如下:
Workbooks.Item:fn(Index:?) As Workbook
Workbooks.Item 方法用于从当前打开的工作簿集合中获取特定的工作簿,从0开始的索引位置作为参数。请注意,如果你尝试获取一个不存在的索引位置的工作簿,将会抛出一个错误。为了避免索引超出范围,我们可以用当前打开工作簿的数量来进行限制,以下代码遍历Workbooks集合并打印工作簿名称。我们可以新建或打开多个工作簿,在“代码库.xlsm”文件运行以下代码,可在WPS宏编辑器的立即窗口中列出所有当前打开工作簿的名称。
function 遍历工作簿集合(){
for (var i = 0; i < Workbooks.Count; i++) {
Debug.Print(Workbooks.Item(i).Name)
}
}
Sheets.Item:fn(Index:?) As IDispatch
Sheets.Item 方法用于从当前工作簿中获取特定的表,与Workbooks用法相同,但工作表的索引从1开始,适用于所有的各类表对象,获得数量用的表类型在循环内外保持一致。
function 遍历工作表集合(){
for (var i = 1; i <= Sheets.Count; i++) {
Debug.Print(Sheets(i).Name)
}
for (var i = 1; i <= Worksheets.Count; i++) {
Debug.Print(Worksheets(i).Name)
}
}
Cells.Item:fn(RowIndex:?,ColumnIndex:?,RHS:?)
Cells.Item 方法用于获取特定单元格,共有三个参数,第三个参数可以省略。前两个参数使用行索引和列索引来确定单元格。下面是一个用WPS灵犀自带DeepSeek编制一个乘法表的示例:
提问1:WPS的JS宏编制九九乘法表示例
回答1(深度思考65秒):给出代码示例、代码说明、运行效果、注意事项(具体内容略)
第一边乘法表的效果
提问2:如何优化这段九九乘法表代码
回答2(深度思考66秒):给出优化后的代码、优化点详解、优化前后对比表格、最终效果、扩展建议(具体内容略)
黑板上手书乘法表
提问3:采用1乘1得1的样式,不要表头
回答3(深度思考46秒):给出优化后的代码、关键改动说明、运行效果、扩展建议(动态大小、高亮重复项、条件格式)
优化后的代码
运行效果
第一条扩展建议,将n=9作为函数的参数,编制n*n的乘法表,未采纳。因为我们要编制九九乘法表,示例代码在我电脑的WPS版本下无法正常运行,下面是挑时候修改的代码,用来说明Cell.Item的用法。
function 乘法表() {
Worksheets.Add();
ActiveSheet.Name="乘法表"
for (行=1;行<=9;行++) {
for (列=1;列<=9;列++) cells.item.value2='结果;' if>列) {
Cells.Item(行,列).Font.Color = 0x0000FF; // 红色字体
}
if (乘积>50) {
Cells.Item(行,列).Interior.Color = 0x00FFFF; // 黄色背景
}
}
}
Range(Cells(1,1),Cells(9,9)).HorizontalAlignment = 2;//个人觉得左对齐美观,从3改成2
Columns.AutoFit();
}
该实例使用了变量、嵌套循环、判断、格式化字符串(比使用+连接字符串方便),另外的字体颜色、背景颜色、左对齐、自动调整列宽等均可以通过录制宏来实现。这些内容在后续会有专题讲解。
特别注意的是,对于第三个参数RHS,查找DeepSeek和互联网,所提供的示例代码我电脑上的WPS版本中无法完成所需的结果,所以不管任何来源的代码解释也不能盲目相信。在代码调试过程中发现,该方法会将第三个参数的值写入单元格,原来是赋值语句。使用该功能编写的乘法表是目前我所见到的最好版本,修改后不包括扩展功能的的代码如下:
function 最佳乘法表() {
Worksheets.Add();
ActiveSheet.Name="最佳乘法表"
for (行=1;行<=9;行++) {
for (列=1;列<=9;列++) {
Cells.Item(行,列,`${行}×${列}=${行*列}`);
}
}
}
在双层循环嵌套中,只用一行代码就搞定乘法表!