如何基于主工作表下拉列表值,通过按钮打开指定Excel工作表?
问题与解决方案
问题描述
需要实现:点击“IOP-F&I”工作表中的按钮时,根据“RESUMO”工作表E7单元格下拉列表的值,打开对应的指定工作表。目前已在“RESUMO”工作表编写Worksheet_Change事件代码,可根据E7的值控制VistaCliente_DNN、VistaCliente_SESA等工作表的可见性,但不清楚如何修改按钮触发的宏来打开对应工作表。
原有按钮宏代码:
Sub VistaCliente() Sheets("VistaCliente").Visible = True Sheets("VistaCliente").Select Range("A1").Select Condicoes.Show End Sub
现有Worksheet_Change事件代码:
Private Sub Worksheet_Change(ByVal Target As Range) If [E7] = "DNN" Then Sheets("VistaCliente_DNN").Visible = True Else Sheets("VistaCliente_DNN").Visible = False End If If [E7] = "SESA" Then Sheets("VistaCliente_SESA").Visible = True Else Sheets("VistaCliente_SESA").Visible = False End If If [E7] = "SOM" Then Sheets("VistaCliente_SOM").Visible = True Else Sheets("VistaCliente_SOM").Visible = False End If If [E7] = "SATE" Then Sheets("VistaCliente_SATE").Visible = True Else Sheets("VistaCliente_SATE").Visible = False End If End Sub
解决方案
1. 修改按钮触发的宏
替换原有VistaCliente宏代码为以下内容,宏会自动读取E7的值,匹配对应的工作表并打开:
Sub VistaCliente() Dim targetSheetName As String Dim ws As Worksheet Dim resumeWs As Worksheet ' 获取RESUMO工作表E7的值 Set resumeWs = ThisWorkbook.Sheets("RESUMO") targetSheetName = "VistaCliente_" & resumeWs.Range("E7").Value ' 检查目标工作表是否存在 On Error Resume Next Set ws = ThisWorkbook.Sheets(targetSheetName) On Error GoTo 0 If Not ws Is Nothing Then ' 设置工作表可见并选中 ws.Visible = True ws.Select ws.Range("A1").Select ' 保留原有的用户窗体显示 Condicoes.Show Else ' 若没有匹配的工作表,弹出提示 MsgBox "未找到对应工作表:" & targetSheetName, vbExclamation End If End Sub
2. 优化Worksheet_Change事件代码
原有事件代码可简化,避免重复判断逻辑:
Private Sub Worksheet_Change(ByVal Target As Range) ' 只在E7单元格修改时触发 If Not Intersect(Target, Me.Range("E7")) Is Nothing Then Dim wsName As String Dim allSheets As Variant Dim ws As Variant ' 定义所有需要控制可见性的工作表 allSheets = Array("VistaCliente_DNN", "VistaCliente_SESA", "VistaCliente_SOM", "VistaCliente_SATE") ' 先隐藏所有目标工作表 For Each ws In allSheets ThisWorkbook.Sheets(ws).Visible = False Next ws ' 根据E7的值显示对应工作表 wsName = "VistaCliente_" & Me.Range("E7").Value On Error Resume Next ThisWorkbook.Sheets(wsName).Visible = True On Error GoTo 0 End If End Sub
内容的提问来源于stack exchange,提问作者Joao
相关产品推荐
相关产品推荐

