如何将 workbook_open 应用于多个工作表
Posted
技术标签:
【中文标题】如何将 workbook_open 应用于多个工作表【英文标题】:How to apply workbook_open to multiple sheets 【发布时间】:2016-07-22 17:58:30 【问题描述】:我有一个 excel 工作簿,许多用户每天都在与不同分辨率、屏幕缩放等的多个显示器进行交互。我需要所有工作表来调整我希望用户每次看到的每张工作表上的范围。
以下适用于 1 个工作表,但我如何让它适用于所有工作表(Sheet1、Sheet2 等)
Private Sub Workbook_Open()
With Sheets("Sheet1")
Columns("A:P").Select
ActiveWindow.Zoom = True
Range("A1").Select
End With
End Sub
【问题讨论】:
遍历所有工作表。 ***.com/questions/25953916/… 您可以使用(至少)四种不同的方法循环浏览现有的工作表,包括可见的和隐藏的:Dim WS As Worksheet For Each WS In ThisWorkbook.Worksheets ' do something with worksheet WS Next WS ' OR Dim N As Long For N = 1 To ThisWorkbook.Worksheets.Count ' do soemthing with Worksheets(N) Debug.Print ThisWorkbook.Worksheets(N).Name Next N ' OR Dim WS As Worksheet Set WS = Worksheets(1) Do Until WS Is Nothing ' do something with WS Debug.Print WS.Name Set WS = WS.Next Loop
谢谢 cyboashu,我不是 vba 大师,当每个工作表的范围不同时,我将如何将循环应用于每个工作表。
【参考方案1】:
您可以使用 Worksheet_Activate 事件,并放置代码如
Private Sub Worksheet_Activate()
Columns("A:P").Select
ActiveWindow.Zoom = True
Range("A1").Select
End Sub
在每张纸上,根据需要编辑范围。
每次激活工作表时都会执行该代码,这可能是也可能不是您想要的,因此您可能需要使用更复杂的东西并使用:
Private AlreadyRun As Boolean
Private Sub Worksheet_Activate()
If Not AlreadyRun Then
Columns("A:P").Select
ActiveWindow.Zoom = True
Range("A1").Select
AlreadyRun = True
End If
End Sub
它只会在第一次激活工作表时执行某些操作(因为 AlreadyRun 变量最初为 False,但一旦运行一次就会更改为 True),或者
Private AlreadyRun As Boolean
Private Sub Worksheet_Activate()
Dim CurRng as Range
Set CurRng = Selection
Columns("A:P").Select
ActiveWindow.Zoom = True
CurRng.Select
If Not AlreadyRun Then
Range("A1").Select
AlreadyRun = True
End If
End Sub
每次激活时都会调整工作表的大小,但只会将选定的单元格第一次移动到 A1。
为避免工作簿保存时的当前工作表在重新打开工作簿时不通过 Worksheet_Activate 事件引起的问题,您可以包含一个 Workbook_Open 事件,说明
Private Sub Workbook_Open()
Application.Screenupdating = False
Dim ws As Worksheet
Set ws = Activesheet
'For the next two lines, just pick any two of your worksheets
'All it is trying to do is to ensure whichever sheet was active at open
'is deactivated before being activated again in the "ws.Activate" command
Worksheets("Sheet1").Activate
Worksheets("Sheet2").Activate
ws.Activate
Application.Screenupdating = True
End Sub
(在事件运行时禁用屏幕更新将避免用户看到任何“闪烁”的工作表。)
【讨论】:
感谢 YowE3k,第一个代码非常接近。但是,我需要所有 3 个工作表在打开时进行调整和缩放,以便发票表格显示相同的范围,无论用户在其显示器上设置什么分辨率或缩放。我可以在每张激活表的顶部添加一个“workbook_open()”吗? 当用户不看它时,您可能并不关心工作表的缩放级别。您可能只关心用户想要实际查看的缩放级别。因此,如果工作表被激活,您只需要确保它处于正确的缩放级别,而不是之前。 Workbook_Open 事件只会在工作簿打开时触发,但 Worksheet_Activate 事件将在用户每次切换到该工作表以查看它时触发。 我也使用了第三个代码,它可以工作。我现在唯一的问题是,当用户第二次选择一张工作表时,它会调整大小但突出显示整个工作表。是否可以让它只选择用户上次使用的单元格? 我忘记了。我将稍作修改以按照您的要求进行编辑。 @Stackexplorer - 我刚刚想到另一个问题 - 保存工作簿时处于活动状态的工作表在重新打开工作簿时未“激活”。如果您的应用程序可以有一个“闪屏”工作表(比如“这个工作簿是由 StackExplorer 创建的——他(或她)应该得到更多的钱!”?)那么你可以有一个 Workbook_Open 事件来激活那个闪屏表——从而确保你所有的正常工作表都将通过 Worksheet_Activate 事件。以上是关于如何将 workbook_open 应用于多个工作表的主要内容,如果未能解决你的问题,请参考以下文章
EXCEL工作表,当前工作簿中的“Workbook_Open”在哪里?
使用 Python 和 XLSXWriter 将格式应用于多个 Excel 工作表