检查是否打印了Excel文件

时间:2018-04-08 09:36:36

标签: excel vba excel-vba abap

我是一个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.

1 个答案:

答案 0 :(得分:0)

这个内置的文档属性应该有所帮助:

ThisWorkbook.BuiltinDocumentProperties.Item(10)

此属性包含上次打印文档的日期/时间,如果有的话。

您应该如何使用这取决于您对此信息的要求范围,您打算如何使用它,以及其他注意事项,例如"您将它与之进行比较的是什么?" ....你关心用户何时打印文件......而不是什么?它是否也会自动打印?

如果您想知道文档打开后是否已打印,您可以使用Workbook_Open事件存储此时的最后打印日期:

Public lastPrinted As Date

Private Sub Workbook_Open()
    lastPrinted = ThisWorkbook.BuiltinDocumentProperties.Item(10)
End Sub

...稍后将lastPrintedThisWorkbook.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