VBA - 按降序打印
VBA - Printing in descending order
我正在尝试用control number
打印单个文档,文档的硬拷贝将有3,000多份,并且整个页面将被切成两半,两面应该都有控制号。
我是用下面的宏来自动生成控制号打印出来的,我就运行这个宏,指定份数就搞定了;控制号的格式为00000
.
' This macro will create a dual control number for a single document and automatically print it.
'
Sub AutoNew()
'
' AutoNew Macro
'
'
Dim Message As String, Title As String, Default As String, NumCopies As Long, SavedFile As String
Dim Rng1 As Range
Dim Rng2 As Range
' Set prompt.
Message = "How many copies do you want to print?"
' Set title.
Title = "Printing Setup, how many copies do you want to print?"
' Set default number to print.
Default = "1"
' Display message, title, and default value.
NumCopies = Val(InputBox(Message, Title, Default))
' Set default control number
SerialNumber = 1
SavedFile = "D:\saved_control_number.txt"
' Read the saved file for the next counter of control number or serial number.
' If file doesn't exist, then we start from control number or serial number as 1.
' file name is "saved_control_number.txt" and should be on drive D.
If FileThere(SavedFile) Then
SerialNumber = System.PrivateProfileString("D:\saved_control_number.txt", "MacroSettings", "SerialNumber")
End If
Set Rng1 = ActiveDocument.Bookmarks("SerialNumber").Range
Set Rng2 = ActiveDocument.Bookmarks("SerialNumber2").Range
Counter = 0
' Reset or empty the text of Bookmark SerialNumber & SerialNumber2
Rng1.text = ""
Rng2.text = ""
While Counter < NumCopies
Rng1.Delete
Rng1.text = Format(SerialNumber, "00000")
Rng2.Delete
Rng2.text = Format(SerialNumber, "00000")
' This should be print in descending order.
ActiveDocument.PrintOut
SerialNumber = SerialNumber + 1
Counter = Counter + 1
Wend
'Save the next number back to the Settings.txt file ready for the next use.
System.PrivateProfileString("D:\saved_control_number.txt", "MacroSettings", "SerialNumber") = SerialNumber
'Recreate the bookmark ready for the next use.
With ActiveDocument.Bookmarks
.Add Name:="SerialNumber", Range:=Rng1
.Add Name:="SerialNumber2", Range:=Rng2
End With
ActiveDocument.Save
End Sub
' Function to check if file saved_control_number.txt exist.
Function FileThere(FileName As String) As Boolean
FileThere = (Dir(FileName) > "")
End Function
但是,我仍然很难整理硬拷贝。
第一,假设我要打印50 copies
那么第一个打印应该是00050
,最后一个打印副本应该是[=16] =].我希望它按降序打印。
Second,不知为何打印开始于12
不知道是代码逻辑问题还是打印机问题。输出将是 00012
、00011
、00001
、00002
、00003
、00004
、...
.
我在想也许我可以把控制号放在数组中,然后按降序排序并打印,但我想先了解你对解决方案的想法,尤其是我遇到的第二个问题.
关闭后台打印,通过:
ActiveDocument.PrintOut Background:=False
您可以将您的控制编号放入一个数组中,然后将其按降序排列并打印,但这将是多余的,并且会产生太多的任务。
我建议按以下逻辑按降序开始打印。
...
LastControlNumber = 1
' Get the last control number to print.
If SerialNumber > 1 Then
SerialNumber = (SerialNumber + NumCopies) - 1 ' we will start the serial number from the last one.
LastControlNumber = SerialNumber
End If
While Counter < NumCopies
Rng1.Delete
Rng1.text = Format(SerialNumber, "00000")
Rng2.Delete
Rng2.text = Format(SerialNumber, "00000")
ActiveDocument.PrintOut ' print
SerialNumber = SerialNumber - 1 ' subtract instead of addition to print in descending order.
Counter = Counter + 1
Wend
' Put back the last control number in the document so you don't get confused.
SerialNumber = LastControlNumber
Rng1.Delete
Rng1.text = Format(SerialNumber, "00000")
Rng2.Delete
Rng2.text = Format(SerialNumber, "00000")
'Save the next number back to the saved_control_number.txt file ready for the next use.
System.PrivateProfileString("D:\saved_control_number.txt", "MacroSettings", "SerialNumber") = SerialNumber + 1 ' + 1 because we want to print the next control number next time.
...
删除你的 While
-Wend
并用上面的代码替换它。
第二个问题可能与您打印机的缓冲区有关。我建议在您的代码中延迟打印输出至少一到两秒,然后查看它是否正确打印。
我正在尝试用control number
打印单个文档,文档的硬拷贝将有3,000多份,并且整个页面将被切成两半,两面应该都有控制号。
我是用下面的宏来自动生成控制号打印出来的,我就运行这个宏,指定份数就搞定了;控制号的格式为00000
.
' This macro will create a dual control number for a single document and automatically print it.
'
Sub AutoNew()
'
' AutoNew Macro
'
'
Dim Message As String, Title As String, Default As String, NumCopies As Long, SavedFile As String
Dim Rng1 As Range
Dim Rng2 As Range
' Set prompt.
Message = "How many copies do you want to print?"
' Set title.
Title = "Printing Setup, how many copies do you want to print?"
' Set default number to print.
Default = "1"
' Display message, title, and default value.
NumCopies = Val(InputBox(Message, Title, Default))
' Set default control number
SerialNumber = 1
SavedFile = "D:\saved_control_number.txt"
' Read the saved file for the next counter of control number or serial number.
' If file doesn't exist, then we start from control number or serial number as 1.
' file name is "saved_control_number.txt" and should be on drive D.
If FileThere(SavedFile) Then
SerialNumber = System.PrivateProfileString("D:\saved_control_number.txt", "MacroSettings", "SerialNumber")
End If
Set Rng1 = ActiveDocument.Bookmarks("SerialNumber").Range
Set Rng2 = ActiveDocument.Bookmarks("SerialNumber2").Range
Counter = 0
' Reset or empty the text of Bookmark SerialNumber & SerialNumber2
Rng1.text = ""
Rng2.text = ""
While Counter < NumCopies
Rng1.Delete
Rng1.text = Format(SerialNumber, "00000")
Rng2.Delete
Rng2.text = Format(SerialNumber, "00000")
' This should be print in descending order.
ActiveDocument.PrintOut
SerialNumber = SerialNumber + 1
Counter = Counter + 1
Wend
'Save the next number back to the Settings.txt file ready for the next use.
System.PrivateProfileString("D:\saved_control_number.txt", "MacroSettings", "SerialNumber") = SerialNumber
'Recreate the bookmark ready for the next use.
With ActiveDocument.Bookmarks
.Add Name:="SerialNumber", Range:=Rng1
.Add Name:="SerialNumber2", Range:=Rng2
End With
ActiveDocument.Save
End Sub
' Function to check if file saved_control_number.txt exist.
Function FileThere(FileName As String) As Boolean
FileThere = (Dir(FileName) > "")
End Function
但是,我仍然很难整理硬拷贝。
第一,假设我要打印50 copies
那么第一个打印应该是00050
,最后一个打印副本应该是[=16] =].我希望它按降序打印。
Second,不知为何打印开始于12
不知道是代码逻辑问题还是打印机问题。输出将是 00012
、00011
、00001
、00002
、00003
、00004
、...
.
我在想也许我可以把控制号放在数组中,然后按降序排序并打印,但我想先了解你对解决方案的想法,尤其是我遇到的第二个问题.
关闭后台打印,通过:
ActiveDocument.PrintOut Background:=False
您可以将您的控制编号放入一个数组中,然后将其按降序排列并打印,但这将是多余的,并且会产生太多的任务。
我建议按以下逻辑按降序开始打印。
...
LastControlNumber = 1
' Get the last control number to print.
If SerialNumber > 1 Then
SerialNumber = (SerialNumber + NumCopies) - 1 ' we will start the serial number from the last one.
LastControlNumber = SerialNumber
End If
While Counter < NumCopies
Rng1.Delete
Rng1.text = Format(SerialNumber, "00000")
Rng2.Delete
Rng2.text = Format(SerialNumber, "00000")
ActiveDocument.PrintOut ' print
SerialNumber = SerialNumber - 1 ' subtract instead of addition to print in descending order.
Counter = Counter + 1
Wend
' Put back the last control number in the document so you don't get confused.
SerialNumber = LastControlNumber
Rng1.Delete
Rng1.text = Format(SerialNumber, "00000")
Rng2.Delete
Rng2.text = Format(SerialNumber, "00000")
'Save the next number back to the saved_control_number.txt file ready for the next use.
System.PrivateProfileString("D:\saved_control_number.txt", "MacroSettings", "SerialNumber") = SerialNumber + 1 ' + 1 because we want to print the next control number next time.
...
删除你的 While
-Wend
并用上面的代码替换它。
第二个问题可能与您打印机的缓冲区有关。我建议在您的代码中延迟打印输出至少一到两秒,然后查看它是否正确打印。