You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:57:21