上班摸鱼小技巧
重复的工作做得多了,难免会想要偷个小懒,利用编程的方式来自动化一些工作流程,从而可以忙里偷闲,在自动化工作期间泡一杯茶,看一眼微信未读信息。于是写了这样一段代码,来实现word的自动化打印:
Dim posY As Double
Dim leftWord As String
Dim rightWord As String
Dim startNumber As String
Dim count As Integer
Dim s1 As Shape
posX = Selection.Information(wdHorizontalPositionRelativeToPage)
posY = Selection.Information(wdVerticalPositionRelativeToPage)
leftWord1 = "00" '序列号前缀
leftWord2 = "0"
leftWord3 = ""
count = 12 '序列号的个数
For i = 1 To count
Set s1 = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, posX, posY, Selection.Font.Size * 8, Selection.Font.Size * 1.5)
s1.TextFrame.TextRange.Font.Size = Selection.Font.Size
s1.TextFrame.TextRange.Font.Name = "arial"
s1.TextFrame.TextRange.Font.Bold = False
s1.Line.ForeColor.TintAndShade = 1
s1.TextFrame.MarginBottom = 0
s1.TextFrame.MarginTop = 0
s1.ZOrder (msoSendBehindText)
If i < 10 Then
s1.TextFrame.TextRange.Text = leftWord1 & i
ElseIf i < 100 Then
s1.TextFrame.TextRange.Text = leftWord2 & i
Else
s1.TextFrame.TextRange.Text = leftWord3 & i
End If
'打印前先在word内进行打印设置,如打印机,页数等
'下面的语句仅针对当前页进行打印输出
'打印后删除已有的文本框避免数据重叠
'如需要测试文本框位置是否准确,请先注释掉下面两句
'注释的方法为在语句最前方加一个如同本条语句一样的单引号
ActiveDocument.PrintOut , , wdPrintCurrentPage
s1.Delete
Next i
End Sub
一次打印事故
虽然说是自动打印,但爱岗敬业的博主还是守在工位上监管的,某天打印到一半的时候,打印机头有点堵塞,新出来的打印件文字模糊不清。赶紧暂停了打印流程,删除了任务,检查了一下已打印的文件,前面10几张是好的,从第十二张开始打印效果模糊,但几张好的打印件的序列号并不连贯。这里需要解释下不连贯的原因,因为是自动打印,打印机同时接收到几十个打印任务后,有时候并不会从第一个任务开始打印。
接下来就遇到了问题,从头开始从1到末尾打印吧,正常打印的含序列号的件就要作废了,要把这些件用上吧,那似乎需要设置一个数组,然后每次打印之前去数组中核对当前循环的值是否已经包含在数组当中,包含则跳过打印流程,不包含则正常打印。
临时抱佛脚的vba学习
vba并不使用return来返回值,需要返回值的时候,可以用给函数的同名参数赋值的方法,定义数组的方法直接是百度搜索的,中断函数执行也不能依赖return,但vba有专用的退出命令“Exit Function”。掌握了以上知识点,基本就能满足博主检测数据的需求了,先定义一个检测函数与检测数组,在循环中每次检查该数据是否包含在检测数组之中,包含则返回0,不包含则返回1。
Function check(num)
myArray = Array(1, 2, 3)
For i = 0 To UBound(myArray)
If num = myArray(i) Then
check = 0
Exit Function
End If
Next i
check = 1
End Function
完整程序
Dim posY As Double
Dim leftWord As String
Dim rightWord As String
Dim startNumber As String
Dim count As Integer
Dim s1 As Shape
posX = Selection.Information(wdHorizontalPositionRelativeToPage)
posY = Selection.Information(wdVerticalPositionRelativeToPage)
leftWord1 = "00" '序列号前缀
leftWord2 = "0"
leftWord3 = ""
count = 12 '序列号的个数
For i = 1 To count
'打印前检测一下数据,为1时执行打印操作
If check(i)=1 Then
Set s1 = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, posX, posY, Selection.Font.Size * 8, Selection.Font.Size * 1.5)
s1.TextFrame.TextRange.Font.Size = Selection.Font.Size
s1.TextFrame.TextRange.Font.Name = "arial"
s1.TextFrame.TextRange.Font.Bold = False
s1.Line.ForeColor.TintAndShade = 1
s1.TextFrame.MarginBottom = 0
s1.TextFrame.MarginTop = 0
s1.ZOrder (msoSendBehindText)
If i < 10 Then
s1.TextFrame.TextRange.Text = leftWord1 & i
ElseIf i < 100 Then
s1.TextFrame.TextRange.Text = leftWord2 & i
Else
s1.TextFrame.TextRange.Text = leftWord3 & i
End If
'打印前先在word内进行打印设置,如打印机,页数等
'下面的语句仅针对当前页进行打印输出
'打印后删除已有的文本框避免数据重叠
'如需要测试文本框位置是否准确,请先注释掉下面两句
'注释的方法为在语句最前方加一个如同本条语句一样的单引号
ActiveDocument.PrintOut , , wdPrintCurrentPage
s1.Delete
End If
Next i
End Sub
Function check(num)
myArray = Array(1, 2, 3)
For i = 0 To UBound(myArray)
If num = myArray(i) Then
check = 0
Exit Function
End If
Next i
check = 1
End Function