在写插入wps文档的页码时,原以为简单的事情,随着录制宏变得有些扑朔迷离。
为了插入奇偶页不同的页码,我尝试用录制宏的方式,看系统是怎么设置的。
结果得到以下代码。
/** * Macro1 Macro * 宏由 user 录制,时间: 2022/12/26 */ function Macro1() { Selection.SetRange(1, 1); ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter; Selection.SetRange(5, 5); (obj=>{ obj.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 144, 144, ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range); (obj=>{ obj.Fill.Visible = msoFalse; obj.Line.Visible = msoFalse; (obj=>{ obj.AutoSize = 1; obj.WordWrap = 0; obj.MarginLeft = 0; obj.MarginRight = 0; obj.MarginTop = 0; obj.MarginBottom = 0; obj.Orientation = msoTextOrientationHorizontal; })(obj.TextFrame); obj.RelativeHorizontalPosition = wdRelativeHorizontalPositionMargin; obj.Left = -999993; obj.RelativeVerticalPosition = wdRelativeVerticalPositionParagraph; obj.Top = 0; obj.WrapFormat.Type = wdWrapNone; (obj=>{ obj.Text = "— X —"; obj.Fields.Add(ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Shapes.Item(1).TextFrame.TextRange, wdFieldPage, "", true); })(obj.TextFrame.TextRange); })(obj.Shapes.Item(1)); obj.PageNumbers.NumberStyle = wdPageNumberStyleArabic; })(ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary)); ActiveWindow.ActivePane.VerticalPercentScrolled = 8; }
直接运行,却报错了!!!
录下来的宏不能用!!!♣ 那要怎么玩嘛,还得帮wps查错??
经过分析代码,页码是以文框的形式插入的。代码中:
(obj.Shapes.Item(1)
指的是第一次插入的文本框,再执行一次,插入的这个文本框编号就是2了(因为原来的那个我没有删除),而程序还去处理第一个插入的文本框,所以,好像是错了。
于是,在第1个” (obj=>{" 下面一行的行首加上: "let myPag1 =" 变成
let myPag1 = obj.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 144, 144, ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range);
下面对应修改两处:
obj.Fields.Add(ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Shapes.Item(1).TextFrame.TextRange, wdFieldPage, "", true);
划线部分修改为:myPag1
})(obj.Shapes.Item(1)); //划线部分修改为 myPag1
这样修改后,程序处理的,就都是新建的这个文本框了。但问题仍然存在。
页码两边的横线不会出来!?!!!!??
期间,各种上网查找,各种看wps开发文档,各种重新录制宏。不行。出不来。最后,分析认为,还是因为录制宏未录制全面。有一部分东西没录到。
网络上有位jw8800 的网友也问过这个问题,但没有人回答。我尝试自己来处理。
仔细下来研究录制的代码,插入页码最关键的一句是:
(obj=>{ obj.Text = "— X —"; obj.Fields.Add(ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Shapes.Item(1).TextFrame.TextRange, wdFieldPage, "", true); })(obj.TextFrame.TextRange);
为什么两边的线会不见了?因为第二句插入的时候,是直接向整个文本框插入的,相当于全部改写了文本框的内容,所以,文本框内,就只剩下一个页码了,没有了其他的一字线和空格。
那其实要解决也就简单了,不直接改写文本框的内容,改写第3个字符内容就行了。(黄色部分按上面说的改,加上绿色部分)绿色部分代码的意思,就是第三个字符而已。
(obj=>{ obj.Text = "— X —"; obj.Fields.Add(myPag1.TextFrame.TextRange.Characters.Item(3), wdFieldPage, "", true); obj.Font.Name = "宋体"; obj.Font.Size = 14; })(obj.TextFrame.TextRange);
然后,运行。两边的横线出来了。顺便加了两句:
obj.Font.Name = "宋体";
obj.Font.Size = 14;
剩下来的工作,一是在插入前,要先删除页码。照样先录制宏。得到这么一句。
ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range.ShapeRange.Shapes.Item("TextBox 6").Delete();
开始计划怎么样枚举页脚的文本框进行删除,弄了半天也不太好操作。直到。。。。
ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range.ShapeRange.Delete();
呃,就这个简单,全部单数页脚的文本框都删掉。当然,双数页脚的
ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterEvenPages).Range.ShapeRange.Delete();
到这里,基本上,用wps js 宏代码,完美实现插入文档页面外侧页码。
记录一下。
标签:obj,插入,文本框,wps,Item,ActiveDocument,宏之,js,页码 From: https://www.cnblogs.com/lcxdc/p/17010213.html