Excel VBA如何根据单元格值动态引用同工作簿其他工作表固定区域
VBA动态引用对应年份工作表实现方案
可以实现,只需将代码中硬编码的固定工作表名替换为读取主工作表指定单元格的动态值,同时增加简单容错避免输入错误时程序崩溃即可。
核心修改逻辑
- 固定绑定名为
HONORAIRES VS. SALAIRE的主工作表,读取其E15单元格存储的目标年份工作表名称 - 原有
B5:B102的单元格区域引用完全保留,不需要调整 - 增加表名合法性校验,当E15为空、或输入的工作表不存在时弹出提示,避免程序报错中断
修改后的完整代码片段
将原有事件代码替换为如下内容,你之前写的后续判断逻辑直接接在循环后面即可,不需要改动:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Honoraires As Double Dim Revenu As Variant Dim LastValues As Variant Dim k As Double Dim drow As Double Dim DValue As Double Dim CountRow As Integer Dim wsMain As Worksheet Dim targetSheetName As String Dim wsYear As Worksheet ' 绑定主工作表,避免活动表切换导致引用错误 Set wsMain = ThisWorkbook.Worksheets("HONORAIRES VS. SALAIRE") If Target.Address = "$B$20" Then ' 读取E15单元格选择的目标年份表名 targetSheetName = Trim(wsMain.Range("E15").Value) ' 空值校验 If targetSheetName = "" Then MsgBox "请先在E15单元格选择目标年份", vbExclamation Exit Sub End If ' 校验目标工作表是否存在 On Error Resume Next Set wsYear = ThisWorkbook.Worksheets(targetSheetName) On Error GoTo 0 If wsYear Is Nothing Then MsgBox "不存在名为【" & targetSheetName & "】的工作表,请检查E15输入内容", vbCritical Exit Sub End If Honoraires = wsMain.Range("B19").Value LastValues = 0 CountRow = 4 ' 动态引用对应年份工作表的固定区域 For Each Cell In wsYear.Range("B5:B102") If Cell.Value > Honoraires Then ' 原有后续业务逻辑保持不变,直接续写即可
使用规则
- 可提前给主工作表E15单元格设置数据有效性下拉列表,录入所有年份工作表名(格式需和实际表名完全一致,比如
_2018、_2019),也支持手动输入表名 - 选中B20单元格触发原有SelectionChange事件时,代码会自动匹配E15指定的年份工作表,读取固定区域数据,无需每次手动修改代码内的年份参数
- 若E15为空、或输入的表名不存在,会弹出明确提示,不会直接抛出运行时错误中断程序
内容的提问来源于stack exchange,提问作者Erik_
相关产品推荐
相关产品推荐

