You need to enable JavaScript to run this app. Excel VBA如何提取被修改单元格对应的行首列首单元格值存入数组
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA如何提取被修改单元格对应的行首列首单元格值存入数组

VBA代码修改方案

核心修改逻辑

原代码直接调用Target对象的行列属性无法适配多单元格修改场景,我们需要在提取每个被修改单元格基础数据时,同步抓取对应行首、列首的值存入数组,适配任意多单元格同时修改的场景。

完整修改后代码

Private Sub Worksheet_Change(ByVal Target As Range)

Dim RangeValues As Variant, r As Long, boolOne As Boolean, TgValue '存储修改前的目标单元格值数组
 Dim sh As Worksheet: Set sh = Sheets("Log")
 Dim UN As String: UN = Application.UserName
 
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
 
 If Target.Cells.count > 1 Then
    TgValue = extractData(Target)
 Else
    TgValue = Array(Array(Target.Value, Target.Address(0, 0), _
        Cells(Target.Row, 1).Value, Cells(1, Target.Column).Value))  '单个单元格场景也同步存储行首、列首值
    boolOne = True
 End If
 Application.EnableEvents = False                               '避免Undo后触发二次Change事件
     Application.Undo
     RangeValues = extractData(Target)                                 '提取修改前的值
     putDataBack TgValue, ActiveSheet                           '恢复修改后的值
     If boolOne Then Target.Offset(1).Select
 Application.EnableEvents = True

 For r = 0 To UBound(RangeValues)
    If RangeValues(r)(0) <> TgValue(r)(0) Then
        '数组新增两个元素:对应行首值、对应列首值,Resize列数从6改为8
        sh.Cells(Rows.count, 1).End(xlUp).Offset(1, 0).Resize(1, 8).Value = _
          Array(Now, UN, RangeValues(r)(1), RangeValues(r)(0), TgValue(r)(0), _
          Target.Parent.Name, RangeValues(r)(2), RangeValues(r)(3))
        
    End If
 Next r
 
 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
End Sub

Sub putDataBack(arr, sh As Worksheet)
    Dim El
    For Each El In arr
        sh.Range(El(1)).Value = El(0)
    Next
End Sub

Function extractData(rng As Range) As Variant
    Dim a As Range, arr, count As Long, i As Long
    ReDim arr(rng.Cells.count - 1)
    For Each a In rng.Areas
            For i = 1 To a.Cells.count
                '数组存储结构调整为:[单元格值, 单元格地址, 行首(A列同行)值, 列首(第1行同列)值]
                arr(count) = Array(a.Cells(i).Value, a.Cells(i).Address(0, 0), _
                Cells(a.Cells(i).Row, 1).Value, Cells(1, a.Cells(i).Column).Value): count = count + 1
            Next
    Next
    extractData = arr
End Function

自定义调整说明

如果你的行首不是A列、列首不是第1行,仅需修改extractData函数中对应参数即可:

  • 调整行首列:将Cells(a.Cells(i).Row, 1)里的1改为行首对应的列号(如B列改为2)
  • 调整列首行:将Cells(1, a.Cells(i).Column)里的1改为列首对应的行号(如第2行改为2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:27:07