我是一个abap程序员,通过使用OLE输出Excel文件来打印文档。 该程序调用" Printpreview"用于向用户显示预览界面的工作簿方法。
我想检查用户是否点击" print"按钮与否。 如果打印文档(单击打印按钮),程序将锁定相关数据。如果用户只在打印预览中查看文档,程序将不会锁定相关数据。
我查了MSDN,似乎工作簿对象只有" saved"财产,但不是"印刷"属性。
我可以使用ABAP或VBA实现吗?
程序样本如下所示。通过OLE,它打开一个EXCEL文件,该文件由其他代码生成,调用PrintPreview方法,然后关闭并退出。
我想确定它是否打印在' 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:\SAP\ZREIGNWOOD_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:\SAP\ZREIGNWOOD_PO.xlsx'.
EXCEPTIONS
failed = 1
OTHERS = 2.
答案 0 :(得分:0)
这个内置的文档属性应该有所帮助:
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
为变量指定一个值,这样您甚至可以根据自己的条件阻止打印,如果您是&#39} ;重新结束目标,或者你可以设置一个自定义文档属性,如果这会有所帮助。
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
模块或标准模块中的哪个位置,请参阅this guide。