Excel 用户表单和 windows.visible

Excel user form and windows.visible

我需要一些帮助来完成这个项目。

我创建了一个用作数据输入表单并运行各种报告的用户表单,效果很好。用户窗体在 Workbook_Open 事件上打开,我需要隐藏工作簿,因为用户习惯于破坏它!

Application.visible = false 有效但是,当用户打开其他工作簿并将它们全部关闭时,用户窗体的父工作簿也会关闭或隐藏用户窗体,我不确定如何防止它.

我已经尝试了多次 API 调用,但我一直遇到同样的问题,即工作簿关闭或最终隐藏(包括表单)。

有没有人设法找到使用户表单看起来或充当独立应用程序的正确 APIs,例如在工作簿不可见的情况下打开,允许其他工作簿/程序出现在前面,允许用户在需要时从任务栏 select 父工作簿/用户窗体,在关闭最后一个工作簿时不会隐藏或关闭。

如果有人能为我指出正确的方向或列出 API 电话,我将不胜感激。我正在使用 Excel 2013.

非常感谢

皮特

我以前遇到过类似的问题,我想我有你想要的答案。

首先,我要做的是创建一个虚拟文件来代替您要打开的工作簿。当该工作簿打开时,它应该创建一个 Excel 的新实例,使其可见并以最小化状态打开您想要的实际工作簿,然后自行关闭。此过程将确保目标工作簿是应用程序中唯一打开的工作簿。

要防止在同一应用程序中打开其他工作簿,请在 VBA 中使用 Class 模块。声明一个应用程序变量 WithEvents,例如: Public WithEvents thisApp As Application.

然后您可以捕获 WorkbookOpen 事件(您猜对了,当另一个工作簿打开时触发)并采取适当的操作。我倾向于做的是捕获新打开的工作簿的路径,将其关闭,打开 Excel 的另一个实例并在那里打开工作簿。

当您阅读代码时,这应该是有意义的:

Private Sub thisApp_WorkbookOpen(ByVal Wb As Workbook)
    Dim xWB As Workbook, xApp As Excel.Application, xPath As String

    Application.Visible = False
    xPath = Wb.FullName
    Wb.Close
    Set xApp = New Excel.Application
    xApp.Visible = True
    xApp.Workbooks.Open xPath
    xApp.Windows(1).Activate
    Set xApp = Nothing

End Sub

区别在于您不想让应用程序不可见,因为这意味着用户无法从任务栏重新激活它。我有一个快速的播放,当从任务栏中选择工作簿时,让表单显示和最小化应用程序似乎很棘手。 (我认为这是可能的,但这意味着隐藏表单并再次显示它,这可能会与其他代码冲突。)我建议在您的工作表中添加一个首页选项卡,并且可能使数据选项卡对用户不可见;这应该足以阻止他们破坏它。

感谢您的所有帮助和想法,但我已经确定了一个更简单(尽管不完美)的解决方案。我首先尝试按照@Sun 的建议将其设为 addinn,但这在作为 excel.

的第一个实例打开时引起了问题

在 ThisWorkbook 模块中,我使用 Public WithEvents App As Application 创建了 public 应用程序级事件处理程序。

这个想法只是让 Excel 工作簿始终保持最小化。

其次是:

    Private Sub App_WorkbookActivate(ByVal Wb As Workbook)

    'Check wb is workbook strThisWkBk then make sure window is minimized
        If Wb.Name = strThisWkBk Then
            With Wb.Windows.Application
                .WindowState = xlMinimized
            End With
            frmAddVouchersTab.Show vbModeless
        End If
    End Sub

    Private Sub App_WindowResize(ByVal Wb As Workbook, ByVal Wn As 
    'Check wb is workbook strThisWkBk then make sure window is minimized. _
        Using WindowResize to prevent user from trying to maximise

        If Wb.Name = strThisWkBk Then
            Application.ScreenUpdating = False 'Speed up execution
                If Not Wn.WindowState = xlMinimized Then Wn.WindowState = xlMinimized
                frmAddVouchersTab.Show vbModeless
            Application.ScreenUpdating = True
        End If
    End Sub

这一切似乎都有效,但有一些小问题,我很确定我可以解决。例如在 With 块中,我尝试将代码添加到 size 并将最小化的 window 作为额外措施放置,但这行不通。