【问题标题】:How do I Use VBA Macro on Hidden Worksheets. and Hide them back如何在隐藏的工作表上使用 VBA 宏。并将它们隐藏起来
【发布时间】:2016-05-25 21:51:44
【问题描述】:

我是 VBA excel 宏的初学者。通过使用这个论坛,我可以编写代码,但我被困在一个地方。

我的工作簿中有 10 张工作表。第一张表是我的输入工作表并进行所有计算。这些计算被拉到后面的 9 张纸中。这 9 个工作表生成我的报告。在计算文件中,我想隐藏所有接下来的 9 个文件并运行宏。一旦计算好了。我单击“生成报告”按钮,新文件被创建并在我的桌面上打开并保存在我的文档中。

问题 - 不知何故,通过这个论坛,我能够生成一个可以做所有事情的代码,但我无法隐藏和取消隐藏部分。 我编写的代码从计算文件中取消隐藏所有文件。(保持它们取消隐藏)并将文件隐藏在新生成的报告中。(因为所有文件都不能隐藏在任何新的 excel 中我得到运行时错误'1004'无法设置工作表类的可见属性)。

这是我的代码,请帮我解决它 - 所以我在计算文件中只能有一张工作表,而当宏工作时其余部分保持隐藏。并且新生成的文件将包含所有 9 个选项卡。

Sub SaveMain()

Application.EnableEvents = False
Sheets("Cover").Visible = True
Sheets("2").Visible = True
Sheets("3").Visible = True
Sheets("4").Visible = True
Sheets("5").Visible = True
Sheets("6").Visible = True
Sheets("7").Visible = True
Sheets("8").Visible = True
Sheets("9").Visible = True

Dim Flname As String


Flname = "Pump Datasheet" & InputBox("Enter Pump tag No P-XXXX:") & ".xls"

Sheets(Array("Cover", "2", "3", "4", "5", "6", "7", "8", "9")).Copy

Sheets("Cover").Visible = False
Sheets("2").Visible = False
Sheets("3").Visible = False
Sheets("4").Visible = False
Sheets("5").Visible = False
Sheets("6").Visible = False
Sheets("7").Visible = False
Sheets("8").Visible = False
Sheets("9").Visible = False

newfilename = Flname

With ActiveWorkbook
.SaveAs newfilename, FileFormat:=50

End With

Application.EnableEvents = True

End Sub

【问题讨论】:

  • 不明白。您希望它隐藏在哪个工作簿中?
  • 您至少需要一张可见的纸。在您的代码中,接近尾声时,您将所有工作表都设置为隐藏。尝试将“Cover”设置为 True。
  • 我的父文件有(计算文件+9其他表)。这 9 个工作表是隐藏的,但 9 个隐藏文件从计算文件中获取数据。一旦我的计算文件完成,我点击生成报告。它创建有 9 张纸并且不再有计算文件的新文件。这 9 张来自父文件(我希望它们都在新文件中可见,但在父文件中保持隐藏)。我的宏取消隐藏父表中的 9 个文件(我不想要)。并将文件隐藏在新生成的文件中(我也不想要)。所以它确实与我想要的两者相反。
  • 您在说“工作表”和“文件”之间切换……请问哪个是?在您的代码运行到 Unhide 然后隐藏后,您再也不会保存原始工作簿 - 您执行 SaveAs - 这会创建一个新工作簿。首先是简单的部分:在上面的代码中,去掉所有 ....Visible = False 代码行。这将导致您的新工作簿工作表可见。

标签: vba excel


【解决方案1】:

建议您对此进行调整以确保 Cover 首先存在。

如果是这样,可以更直接地设置隐藏工作表的循环 - 实际上不需要 Then 测试。

Sub Sheeted()
Dim ws As Worksheet

On Error Resume Next
Set ws = Sheets("Cover")
On Error GoTo 0

If ws Is Nothing Then Exit Sub

For Each ws In ActiveWorkbook.Sheets
    ws.Visible = (ws.Name = "Cover")
Next
End Sub

【讨论】:

  • 太酷了!在需要布尔值的地方使用比较!存储在我的有用文件中!想想看,我一直在公式中使用类似的技术,但我从未想过在 VBA 中这样做。
  • 感谢您的帮助。对不起,我想没有解释清楚。我想将事物隐藏在我的计算文件(父文件)中,但仍然在宏中使用它,以便将这 9 个文件作为新文件拉出。以及生成的 NEW 文件,它从父文件 (Cover+2 - 9) 中提取所有 9 个隐藏文件。我希望所有 9 张纸始终在新文件中可见所以我可以将它们作为报告发送。如果有人想一直看到我的父文件,我希望他们只看到计算工作表而不是弄乱其他 9 个隐藏工作表(不希望他们知道隐藏文件)。我的宏确实反转了。
【解决方案2】:

尝试像这样隐藏和取消隐藏您的床单,如果以后需要更改,它将为您节省大量精力。

Dim ws As Worksheet

'To unhide all sheets
For Each ws In ActiveWorkbook.Sheets
    ws.Visible = xlSheetVisible
Next

'To hide all sheets except "Cover"
For Each ws In ActiveWorkbook.Sheets
    If ws.Name <> "Cover" Then
        ws.Visible = xlSheetHidden
    End If
Next

【讨论】:

  • 感谢您的帮助。我会努力实现的。
  • 有没有我可以保持 2 张可见。几个不同的尝试没有帮助。对于 ActiveWorkbook.Sheets 中的每个 ws 如果 ws.Name "Calculations" 和 "Sheet1" 然后 ws.Visible = xlSheetVeryHidden 错误:说类型不匹配我也尝试了 ActiveWorkbook.Sheets 中的每个 ws 如果 ws.Name "Sheet1"然后 ws.Visible = xlSheetVeryHidden 错误:控制变量已在使用中。你能帮忙吗?我在底部的评论框中也有我的程序
  • 是的,您可以通过工作表索引或工作表名称来完成。但它看起来像这样If ws.name &lt;&gt; "Cover" and ws.name &lt;&gt; "Other Name" Then,或者你可以使用If ws.Index &lt;&gt; 1 and ws.index &lt;&gt; 2 Then。但是当你使用 AND / OR 逻辑修饰符时,你必须再次进行完整的语句。
【解决方案3】:

谢谢大家 我通过反复试验并在您的帮助下弄清楚了一些方法。 我只是把我在这个组的某个地方看到的 .close 东西放了。

这是根据所有建议修改后的代码。可能有一些不必要的东西,但不知何故它起作用了。 非常感谢大家

Sub SaveMain()

Dim Flname As String
Dim ws As Worksheet

Application.EnableEvents = False
For Each ws In ActiveWorkbook.Sheets
ws.Visible = xlSheetVisible
Next

Flname = "Pump Datasheet-" & InputBox("Enter Pump tag No P-XXXX:") & ".xls"

Sheets(Array("Cover", "2", "3", "4", "5", "6", "7", "8", "9")).Copy

newfilename = Flname

With ActiveWorkbook
.SaveAs newfilename, FileFormat:=50
.Close 0
End With
For Each ws In ActiveWorkbook.Sheets
If ws.Name <> "Calculations" Then
 ws.Visible = xlSheetVeryHidden
 End If

Next

Application.EnableEvents = True

End Sub

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多