如何通过单元格参数动态复制对应单元格区域值?(求公式/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实现:
- 点击「公式」选项卡 → 「定义名称」,名称设为
ParamIndex,引用位置输入:
=IF(Sheet1!$L$8=30, {1,2,3,5,4,6}, {1,2,3,4,5,6})
- 在L2输入
=INDEX($J$2:$J$7, INDEX(ParamIndex, ROW(A1))),下拉填充到L7。
VBA解决方案
如果需要更灵活的逻辑或兼容所有Excel版本,可通过工作表事件实现自动更新:
- 右键目标工作表标签 → 「查看代码」,粘贴以下代码:
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
- 关闭VBA编辑器,回到工作表。修改L8的参数,L2:L7会自动更新为对应序列。
内容的提问来源于stack exchange,提问作者Starwinwin
相关产品推荐
相关产品推荐

