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 作为额外措施放置,但这行不通。
我需要一些帮助来完成这个项目。
我创建了一个用作数据输入表单并运行各种报告的用户表单,效果很好。用户窗体在 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 作为额外措施放置,但这行不通。