【问题标题】:Insert VBA sub into Excel Worksheet将 VBA 子插入 Excel 工作表
【发布时间】:2015-01-01 16:05:03
【问题描述】:

早安,

我使用的是 Excel 2013,我想在使用表格时隐藏和取消隐藏表格。我花了一些时间在谷歌上搜索,发现论坛上有很多关于将 VBA 添加到模块的古老帖子,但这并不是我想要的。

在我大部分时间都在使用数据的主页上,我有一个按钮,它显示了一个用户窗体,其中包含一个列表框中的工作表列表。我从 ListBox 中选择 Sheet,点击 OK,它运行以下内容;

Private Sub OKButton_Click()  
    ThisWorkbook.Sheets(JobListBox.value).Visible = xlSheetVisible  
    ThisWorkbook.Sheets(JobListBox.value).Activate  
    Unload Me  
End Sub

我希望这样当我通过 VBA 创建新工作表时,我可以使用以下子例程填充工作表;

Private Sub Worksheet_Deactivate()  
    Me.Visible = xlSheetVeryHidden  
End Sub

如果有人能告诉我如何制作一个子例程来将此代码插入到我的工作表中,我将不胜感激。

PS:我的后备方法当然是手动复制/粘贴代码......但如果可能的话,我更愿意自动化它。

【问题讨论】:

  • 我真的很喜欢你正在做的这个想法。我想我可能会将它纳入我的一些项目中。感谢并欢迎来到 Stack Overflow!新年快乐!

标签: excel vba


【解决方案1】:

不要将相同的代码添加到每个工作表,因为它们都在工作簿中,并且一旦工作簿中的任何工作表被停用,您真的试图执行隐藏,请将其放入 ThisWorkbook 的代码中。

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Sh.Visible = xlSheetVeryHidden
End Sub

您可能可以在您的项目类型中使用更多工作簿事件。

Here is a list of the workbook events

如果你想从这里排除你的主页,你可以通过添加一个 IF 语句来修改它:

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    IF Sh.Name <> "Main" Then
        Sh.Visible = xlSheetVeryHidden
    End If
End Sub

主要思路是,如果您必须将相同的代码放入多个对象中,更不用说所有对象,您就是在重复自己。

查看 DRY 或“不要重复自己”的概念,除非您喜欢 WET,“我们喜欢打字”。或“把所有东西都写两次”。即使它只是以编程方式创建,当您可以让一段代码具有作为工作表的传入参数时,一段代码不必完全相同地存在于所有工作表中。

这样,如果你必须改变它的行为,你只做一次。它易于测试,以后跟踪或修改的时间更少。

因此,如果您发现自己不得不一遍又一遍地使用相同的代码,请查看父对象并尝试找到一种方法将不断变化的对象或变量作为参数传递给单个代码或模块。

另外,这可能是您在将相同代码插入每张工作表时没有找到任何结果的原因。这不是一个好习惯

Article on DRY

【讨论】:

  • 使用此代码,我还将添加一个带有是/否选项的简单消息框,询问用户是否要停用页面,以便如果用户需要保持多个页面打开,他们可以来回点击,而无需不断打开和重新打开这些页面。
  • @ThomasBeckSutton,这是个好主意。我认为这个用户碰巧想要巧妙的操作并且知道他正在隐藏它们,或者他不会使用 xlSheetVeryHidden。实际上,我几乎将这个功能包含在一个注释中,如果需要的话可以将其注释掉。我发现,尽管包含的内容远远超出了 OP 的期望,但会使最初的答案过于复杂,并失去了其简单性的重点。不过,欢迎您发表评论。
  • 由于至少有一张工作表需要保持可见,因此保持主工作表可见的版本看起来像是要搭配的版本
  • @peege,我绝对明白你的意思并且完全同意。我刚刚开始想象这种代码的不同用途以及我可以用它做什么。绝对非常方便。
  • 谢谢@peege!这对我的目的来说是完美的,我也很欣赏关于最佳实践的建议和热烈的欢迎。我希望你新年的开始和我一样好,并且在接下来的日子里一切顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多