计算单元格中值的更改次数

时间:2017-11-20 21:59:29

标签: excel vba excel-vba

我正在评估一列单元格,例如A:A,并且每次单元格中的值发生更改(不包括初始值)时,我希望能够将更改记录到另一列的适当单元格,例如B:B

以下是一对前后截图,展示了所需内容:

enter image description here enter image description here

A2已更新一次,因此B2应显示1计数,A6已更新两次,因此B6应显示{{} 1}}。

可以找到类似的解决方案here,但这仅适用于一个单元格:

2

单元格值未连接到不同的工作表,可以进行硬编码。

2 个答案:

答案 0 :(得分:0)

在输入初始值后将其放在工作表代码中,或添加代码以检查这是否是初始值。

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Range("B" & Target.Row) = Range("B" & Target.Row) + 1
    End If
End Sub

答案 1 :(得分:0)

在我看来,链接中的所有解决方案都没有特别好足以修改,所以我会发布更好的解决方案。

此外,您的要求也不够完全,所以我已经补充了一些额外的。

<强>假设:

  • 所有A:A单元格值都为空。 (可以通过简单的修改来允许非空的初始值。)

  • 导致相同值的单元格编辑仍被视为&#34;更改&#34;。这通常还包括单元格最初为空的位置,但我的代码明确排除了这种边缘情况。

  • &#34;首字母&#34;值是之后的第一个&#34;更改&#34;到细胞。 (可以进行简单的修改,以允许初始值为&#34;空&#34;,如果这是实际要求。)

这是相对简单的代码:

'============================================================================================
' Module     : <The appropriate sheet module>
' Version    : 1.0
' Part       : 1 of 1
' References : N/A
' Source     : https://stackoverflow.com/a/47405528/1961728
'============================================================================================
Option Explicit

Private Sub Worksheet_Change _
            ( _
                       ByVal Target As Range _
            )

  Const s_CheckColumn As String = "A:A"
  Const s_CountColumn As String = "B:B"

  If Intersect(Target, Range(s_CheckColumn)) Is Nothing Then Exit Sub

  Dim rngCell As Range
  For Each rngCell In Intersect(Target, Range(s_CheckColumn))
    With Range(s_CountColumn).Cells(rngCell.Row)
      .Value2 = IIf(.Value2 <> vbNullString, .Value2 + 1, IIf(rngCell.Value2 <> vbNullString, 0, vbNullString))
    End With
  Next rngCell

End Sub


此解决方案正确允许同时编辑多个单元格,就像执行多单元格删除/粘贴或填充时一样。

备注:

  • 最初&#34;更改&#34;计算结果为0。如果您希望隐藏这些零,请为计数列设置#;;的自定义数字格式。

  • 可以修改代码以停止相同的值&#34;从计数编辑为&#34;更改&#34;。这样做的最简单方法之一是使用额外的列来存储旧值。

<强>注意事项:

  • 撤消将无法正常运行。 可以进行纠正,但这样做并非易事。

  • 需要在开始编辑后按ESC才能取消编辑而不会触发更新。