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 不知道是代码逻辑问题还是打印机问题。输出将是 000120001100001000020000300004....

我在想也许我可以把控制号放在数组中,然后按降序排序并打印,但我想先了解你对解决方案的想法,尤其是我遇到的第二个问题.

关闭后台打印,通过:

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 并用上面的代码替换它。

第二个问题可能与您打印机的缓冲区有关。我建议在您的代码中延迟打印输出至少一到两秒,然后查看它是否正确打印。