我是一名 abap 程序员,使用 OLE 输出 Excel 文件来打印文档。 程序调用工作簿的"打印预览"方法向用户显示预览界面。
我想检查用户是否单击"打印"按钮。 如果打印文档(单击打印按钮),程序将锁定相关数据。如果用户仅在打印预览中查看文档,程序将不会锁定相关数据。
我查了一下MSDN,似乎工作簿对象只有"保存"属性,但没有"打印"属性。
我可以使用 ABAP 或 VBA 实现这一点吗?
程序示例如下所示。通过 OLE,它打开一个由其他代码生成的 EXCEL 文件,调用 PrintPreview 方法,然后关闭并退出。
我想确定它是否在"打印预览"和"关闭"之间打印。 关闭 excel 对象后,程序将根据是否打印执行某些操作。
CREATE OBJECT excelobj 'Excel.Application'.
* Set excel visible
SET PROPERTY OF excelobj 'Visible' = 1.
* Create workbook object
CALL METHOD OF excelobj 'Workbooks' = workbooks.
CALL METHOD OF workbooks 'Open' = wbookobj
EXPORTING
#1 = 'C:SAPZREIGNWOOD_PO.xlsx'.
CALL METHOD OF excelobj 'Worksheets' = wsheetobj
EXPORTING
#1 = 'Sheet1'.
CALL METHOD OF wsheetobj 'Activate'.
CALL METHOD OF wsheetobj 'Printpreview'.
WAIT UP TO '0.1' SECONDS.
*determine whether it is printed
CALL METHOD OF wbookobj 'Close'.
CALL METHOD OF excelobj 'Quit'.
CALL FUNCTION 'GUI_DELETE_FILE'
EXPORTING
file_name = 'C:SAPZREIGNWOOD_PO.xlsx'.
EXCEPTIONS
failed = 1
OTHERS = 2.
此内置文档属性应该有帮助:
ThisWorkbook.BuiltinDocumentProperties.Item(10)
此属性包含上次打印文档的日期/时间(如果有)。
您应该如何使用它取决于您对此信息的要求范围、您打算如何处理它以及其他考虑因素,例如"您将其与什么进行比较?您关心用户何时打印文档。而不是什么? 它也会自动打印吗?
如果想知道文档自打开以来是否已打印,可以使用Workbook_Open
事件来存储此时的上次打印日期:
Public lastPrinted As Date
Private Sub Workbook_Open()
lastPrinted = ThisWorkbook.BuiltinDocumentProperties.Item(10)
End Sub
。然后将lastPrinted
与ThisWorkbook.BuiltinDocumentProperties.Item(10)
进行比较,以确定它是否从那时起就被印刷了。
或者,您可以使用Workbook_BeforePrint
为变量赋值,这甚至允许您根据您的标准阻止打印,如果这是您的最终目标,或者您可以设置自定义文档属性,如果这会有所帮助。
更多信息:
MSDN :
Workbook.BuiltinDocumentProperties
属性(Excel)MSDN :
Workbook.CustomDocumentProperties
属性(Excel)
其他内置文档属性
1 : Title
2 : Subject
3 : Author
4 : Keywords
5 : Comments
6 : Template
7 : Last author
8 : Revision number
9 : Application name
10 : Last print date
11 : Creation date
12 : Last save time
13 : Total editing time
14 : Number of pages
15 : Number of words
16 : Number of characters
17 : Security
18 : Category
19 : Format
20 : Manager
21 : Company
22 : Number of bytes
23 : Number of lines
24 : Number of paragraphs
25 : Number of slides
26 : Number of notes
27 : Number of hidden Slides
28 : Number of multimedia clips
29 : Hyperlink base
30 : Number of characters (with spaces)
31 : Content type
32 : Content status
33 : Language
34 : Document version
有点跑题了,但是当我在做的时候,我不妨包含将返回所有内置和自定义文档属性列表的代码:
Sub listDocumentProperties()
'lists all built-in and custom document properties for the active Office document
On Error Resume Next
Dim p As DocumentProperty, x As Long
With ActiveWorkbook ' ...or ActiveDocument or ActivePresentation etc.
'list built-in properties
Debug.Print "Built-in Document Properties for " & .Name
For Each p In .BuiltinDocumentProperties
x = x + 1
Debug.Print Format(x, "#00: ") & p.Name & String(35 - Len(p.Name), " "), ;
Debug.Print p.Value
If Err Then
Debug.Print "<N/A>"
Err.Clear
End If
Next
'list custom properties
Debug.Print vbLf & "Custom Document Properties for " & .Name
x = 0
For Each p In .CustomDocumentProperties
x = x + 1
Debug.Print Format(x, "#00: ") & p.Name & String(35 - Len(p.Name), " "), ;
Debug.Print p.Value
If Err Then
Debug.Print "<N/A>"
Err.Clear
End If
Next
If x = 0 Then Debug.Print "(No Custom Properties Found)"
End With
End Sub
这将适用于任何 Office 应用程序;您只需将With
行更改为相应的文档类型。
替代解决方案:
另一种可能的解决方案是使用Workbook_BeforePrint
事件填充公共变量。
将其放在标准模块的顶部:
Option Explicit
Public lastPrinted As Date
。然后将其放在ThisWorkbook
模块中:
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
lastPrinted = Now()
End Sub
。然后,您应该能够通过检查lastPrinted
的值来判断文档是否实际发送到打印机(而不是预览)。 如果未打印(自文档打开以来),则应包含零,否则它将包含文档发送到打印机的日期/时间。 请注意,无法判断打印机是否成功打印了它。
请注意,您还可以通过在ThisWorkbook
模块中使用它来阻止打印:
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
End Sub
如果不确定将代码放置在ThisWorkbook
模块或标准模块中的位置,请参阅本指南。