【问题标题】:Excel VBA form lagExcel VBA表格滞后
【发布时间】:2012-04-10 00:52:05
【问题描述】:

我正在创建一个 Excel 应用程序,该应用程序将在用户转到特定工作表时打开一个用户表单。当用户单击此工作表时,将出现该表单。但是,我不希望用户能够看到工作表中的内容。我只是希望它在没有滞后的情况下打开或已经加载到该表中。有没有办法做到这一点?

谢谢。

【问题讨论】:

  • 当您说您不希望用户看到工作表上的数据时,您的意思是表格中的数据在工作表上吗?如果是这样,为什么不制作一张表格来打开表格?
  • 如果您不希望用户看到工作表中的内容,为什么要求他们单击该工作表来打开表单?您可以使用另一种机制来打开表单吗?也许是另一张纸上的按钮?
  • 好吧,我无法更改工作表的数据,因为单元格依赖于应用程序的其余部分。由于人们有点习惯于访问此选项卡,因此他们最好单击此选项卡并从那里开始。说来话长……当用户单击工作表底部的选项卡时,是否可以编辑行为?而不是打开工作表,而是打开表单?
  • 禁用滚动并放入一个巨大的正方形以覆盖数据。
  • 我想我理解你想要完成的事情,但这让我想知道这是否是一个好的设计首先要实现。如果您这样做,当您单击工作表选项卡时,表单会弹出,它给人的印象是 Excel 以某种方式行事,而实际上您已经完全劫持了该行为。我建议考虑一种更自然的方式来显示表单。如果您不想显示它所连接的工作表,您可以在功能区中添加一个按钮来显示您的表单。或者,如果您有时间,听起来您需要一个独立的应用程序而不是 Excel。

标签: excel vba


【解决方案1】:

以下内容尽可能接近您所寻求的。

我创建了一个默认名称为UserForm1 的表单。我在ThisWorkbook 中包含了下面的代码。

如果用户单击“Sheet2”选项卡,代码会加载UserForm1,将其最大化并显示出来。退出表单时,代码切换到“Sheet3”。

这与您的规范不完全匹配,因为您可以在表单出现前的几分之一秒内看到“Sheet2”。我试过预加载表格。我已尝试在 SheetDeactivate 事件例程中关闭屏幕更新,并且在退出 SheetActivate 事件例程之前不会再次打开它。但我尝试过的任何方法都无法阻止那短暂的闪光。

试试这个代码并确定它足够好。

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

  If Sh.Name = "Sheet2" Then
    Load UserForm1
    With UserForm1
      .Width = Application.Width
      .Height = Application.Height
      .Show
    End With
    Application.EnableEvents = False    ' Surpress SheetActivate event
    Worksheets("Sheet3").Activate
    Application.EnableEvents = True
  End If

End Sub

【讨论】:

    【解决方案2】:

    您可以先隐藏工作表中的所有单元格:

    Worksheets("Sheet3").Cells.EntireRow.Hidden = True
    Worksheets("Sheet3").Cells.EntireColumn.Hidden = True
    MyUserForm.Show 'You can show modally here if you like
    

    当您准备好再次向用户展示内容时,您可以使用:

    MyUserForm.Hide
    Worksheets("Sheet3").Cells.EntireRow.Hidden = False
    Worksheets("Sheet3").Cells.EntireColumn.Hidden = False
    

    这里的优点是您不会在此过程中丢失行和列的高度和宽度 - 它们会完全恢复到原来的格式。

    看起来像这样:

    【讨论】:

    • 我喜欢你所做的,但是当我尝试在 worksheet_activate 函数中实现时出现错误:“无法设置 Range 类的 Hidden 属性”...有什么想法吗?
    • 如果您发布您的确切代码(特别是如果它与上面的代码不同)并留下另一条评论通知我,我会在我的机器上测试它,看看出了什么问题。如果完全按照上述方式完成,它应该可以工作。请记住,在某些 Excel 事件执行期间无法执行某些操作。这可能是您想要在 Worksheet_Activate 事件触发之前执行的操作,或者之后使用以下命令调度它:Application.OnTime Now, "YourMethodName"
    猜你喜欢
    • 2023-01-18
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多