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

如何通过单元格参数动态复制对应单元格区域值?(求公式/VBA方案)

公式解决方案(Excel 365/2021 及以上)

如果你的Excel版本支持动态数组和SWITCH函数,直接在L2单元格输入以下公式,按回车后会自动溢出填充L2:L7:

=INDEX($J$2:$J$7, SWITCH($L$8, 30, {1,2,3,5,4,6}, ROW($A$1:$A$6)))
  • 逻辑说明:SWITCH根据L8的参数匹配对应索引数组,输入30时返回{1,2,3,5,4,6};若输入未预设参数,默认返回ROW($A$1:$A$6)(原序列的1-6索引)。INDEX函数通过该索引数组从J2:J7提取对应位置的值。
  • 扩展:如需添加更多参数对应序列,直接在SWITCH中追加参数, {对应索引数组}即可,比如30, {1,2,3,5,4,6}, 40, {6,5,4,3,2,1}, ...。
兼容旧版Excel的公式方案

若你的Excel版本不支持动态数组和SWITCH,可通过定义名称+INDEX实现:

  1. 点击「公式」选项卡 → 「定义名称」,名称设为ParamIndex,引用位置输入:
=IF(Sheet1!$L$8=30, {1,2,3,5,4,6}, {1,2,3,4,5,6})
  1. 在L2输入=INDEX($J$2:$J$7, INDEX(ParamIndex, ROW(A1))),下拉填充到L7。
VBA解决方案

如果需要更灵活的逻辑或兼容所有Excel版本,可通过工作表事件实现自动更新:

  1. 右键目标工作表标签 → 「查看代码」,粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' 仅监听L8单元格的变化
    If Target.Address <> "$L$8" Then Exit Sub
    
    Dim sourceData As Variant
    sourceData = Me.Range("J2:J7").Value ' 读取J列源数据
    
    Dim targetRange As Range
    Set targetRange = Me.Range("L2:L7")
    
    ' 根据L8参数定义索引序列
    Dim indexArr As Variant
    Select Case Target.Value
        Case 30
            indexArr = Array(1, 2, 3, 5, 4, 6) ' 示例对应序列
        ' 可添加更多参数分支
        ' Case 50
        '     indexArr = Array(2,1,4,5,3,6)
        Case Else
            indexArr = Array(1, 2, 3, 4, 5, 6) ' 默认返回原序列
    End Select
    
    ' 将对应数据写入L列
    Dim i As Integer
    For i = LBound(indexArr) To UBound(indexArr)
        targetRange.Cells(i + 1).Value = sourceData(indexArr(i), 1)
    Next i
End Sub
  1. 关闭VBA编辑器,回到工作表。修改L8的参数,L2:L7会自动更新为对应序列。

内容的提问来源于stack exchange,提问作者Starwinwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:07:57