使用Exit事件复制/粘贴到Excel

时间:2016-05-07 10:31:04

标签: ms-access

(目前使用Access 2003)在我的项目中,我有一个子表单frmSub,它保存查询的结果,位于表单(frmMain)中。 frmSub是一个子窗体控件,它包含一个查询而不是一个窗体(它的SourceObject属性设置为“Query.qrySearch”)

使用各种运行时计数器,查询会在顶部按“最佳”排序结果。然后,用户可以手动选择他们需要的结果,或者获取所有结果。

我想要做的是提供一种在Excel中打开结果的方法(如果没有选择,则用户选择或所有结果)。忽略现在可能更常用的'create temp export .xls file'方法,我现在正在寻找一种复制/粘贴方法,模仿用户当前使用的ctl-C / V方式。 我在frmMain中放置了一个“在Excel中打开”按钮。

在frmSub的Exit事件中,我查看.SelHeight,如果做出选择则返回> 0

If Me.frmSub.Form.SelHeight > 0 Then
    DoCmd.RunCommand acCmdCopy
Else:
    DoCmd.RunCommand acCmdSelectAllRecords
    DoCmd.RunCommand acCmdCopy
End If

在frmMain的'在Excel中打开'按钮后面我有...

Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")

With xlApp
    .Workbooks.Add
    .ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
    .Cells.Select
    .Cells.EntireColumn.AutoFit
    .Visible = True
    .Range("a1").Select
End With

Set xlApp = Nothing
Call EmptyClipboard

调用EmptyClipboard调用基于api的例程来清除剪贴板。 虽然我意识到以这种方式使用剪贴板可能不是最佳实践,但我不确定如果能够确定合理用途,那么这种想法是否是普遍的(预计用户在这里不会特别不利)

问题 虽然上述方法运行良好但是使用Exit事件存在问题,因为它不仅会在单击“退出到Excel”按钮时触发 - 而且如果剪贴板为空,则导出到Excel会导致问题。

有没有办法确定是否是“退出到Excel”按钮启动子表单的Exit事件 - 并将其记录在Exit事件的代码中?我似乎在frmSub中可以访问的唯一事件是On Exit和On Enter。

如果任何复制/粘贴方法可能仍有问题,那么我可以查看导出到tmp .xls文件。

1 个答案:

答案 0 :(得分:0)

有了更多的时间来研究这个问题,我认为,我已经重新安排了一些事情。特别是,Exit事件现在仅用于存储数据表的选择参数,从而将复制阶段转移到“导出到Excel”按钮......

frmSub退出事件包括......

tmpSelHeight = Me.frmSub.Form.SelHeight
tmpSelTop = Me.frmSub.Form.SelTop
tmpSelLeft = Me.frmSub.Form.SelLeft
tmpSelWidth = Me.frmSub.Form.SelWidth

在frmMain上的“在Excel中打开”按钮后面,现在包括......

If IsProcessRunning("excel.exe") Then
    If MsgBox("Excel is currently running: click Yes to view in new Excel instance", vbYesNo, "") = vbNo Then Exit Sub
End If

If tmpSelHeight > 0 Then
    Form! frmSub.SetFocus
    Me. frmSub.Form.SelHeight = tmpSelHeight 
    Me. frmSub.Form.SelTop = tmpSelTop
    Me. frmSub.Form.SelLeft = tmpSelLeft
    Me. frmSub.Form.SelWidth = tmpSelWidth
    DoCmd.RunCommand acCmdCopy
Else
    Form! frmSub.SetFocus
    DoCmd.RunCommand acCmdSelectAllRecords 
    DoCmd.RunCommand acCmdCopy
End If

Me. frmSub.Form.SelHeight = 0

Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application") 

With xlApp
    .Visible = True
    .Workbooks.Add
    .ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
    .Cells.Select
    .Cells.EntireColumn.AutoFit
    .Range("a1").Select
End With

Set xlApp = Nothing
Call EmptyClipboard

AppActivate "Microsoft Excel"

虽然事情看起来足够稳定...... 我仍在操纵剪贴板,虽然这不是一个问题。 我以后可以看看使用任何现有的Excel实例。 我仍然可以考虑导出到.xls文件,或存储在临时表&将表链接到Excel,作为替代方法。