在Excel 2007中用VBA写一个总和公式(= t1 + t2 + tN)

时间:2013-01-31 09:50:59

标签: excel vba excel-vba

在下面的代码中,我在名为“chrono”的一系列单元格上捕获双击事件。如果目标单元格包含值,则将其与应用于右侧下一个单元格的公式中已包含的值连接。我想获得像=0,1+0,1这样的东西,但是单元格仍然是空的。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
Dim rng As Range
Set rng = Range("chrono")
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, rng) Is Nothing Then
    Application.EnableEvents = False
    Cancel = True 'stop the edit mode
    With Target
        If .Value = "" Then
            .Value = Time
        Else:
            Dim nextCell As Range
            Set nextCell = ActiveCell.Offset(0, 1)
            If nextCell.Formula = "" Then
                nextCell.Formula = "=" & ((Time - .Value) * 24 * 60 * 60)
            Else:
                nextCell.Formula = nextCell.Formula & "+" & ((Time - .Value) * 24 * 60 * 60)
            End If
            .Value = ""
        End If
    End With
End If
Application.EnableEvents = True
End Sub

修改

我很抱歉不清楚,我的英语不太好。我想计算两次双击之间的经过时间(因此没有现有数据)。我能够完成这项任务:

nextCell.Value = Time - .Value

此外,我可以将多个输入相加:

If nextCell.Value = "" Then
    nextCell.Value = Time - .Value
Else:
    nextCell.Value = nextCell.Value + Time - .Value

问题是每个新输入都会超过nextCell.Value,而我想跟踪每一个输入。我试图在第一个代码示例中使用公式(=t1+t2),但双击不会产生任何结果。


修改

我正在尝试制作秒表。我的目标是计算在任务上花费的时间。为了使事情更加清晰,这就是我正在尝试做的,一步一步:

  1. 两个单元格:A1和B1
  2. 双击A1
  3. A1值:当前时间
  4. 双击A1
  5. B1公式:“=”& (当前时间 - A1值)
  6. A1值:空
  7. 重复2,3,4
  8. B1公式:B1公式& “+”& (当前时间 - A1值)
  9. 重复2,3,4
  10. 等......

3 个答案:

答案 0 :(得分:2)

我终于发现问题来自我正在使用的特定语言。我只是将Formula替换为FormulaLocal,现在它可以了!作为额外的,(Time - .Value) * 1允许将经过的时间转换为相应的十进制值。非常感谢大家:)

答案 1 :(得分:1)

Excel中的日期在内部存储为自19/1/19以来的天数 因此1天= 1.
因此1小时= 1/24 所以要以十进制秒为单位,将其乘以24 * 60 * 60


编辑:
当您引用单元格的值时,我会引用nextCell.Value而不是nextCell.Formula,例如nextCell.Formula = nextCell.Formula & "+" & (Time - .Value)

答案 2 :(得分:1)

仍然很难理解你所追求的是什么,但这是一次尝试......

以下版本设置基准时间,每次双击都会显示自那时起的累积时间。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
Dim rng As Range
Set rng = Range("chrono")
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, rng) Is Nothing Then
    Application.EnableEvents = False
    Cancel = True 'stop the edit mode
    With Target
        Dim nextCell As Range
        Set nextCell = ActiveCell.Offset(0, 1)
        If .Value = "" Then
            nextCell.Formula = ""
            .Value = Time
        Else:
            If nextCell.Formula = "" Then
                nextCell.Formula = "=" & Round((Time - .Value) * 24 * 60 * 60, 2)
            Else:
                nextCell.Formula = nextCell.Formula & "+" & _
                    Round(((Time - .Value) * 24 * 60 * 60) - nextCell.Value, 2)
            End If
'            .Value = ""  'this commented line can be deleted - we'll use the base time
        End If
    End With
End If
Application.EnableEvents = True
End Sub

设置基准时间后,它不会改变。然后nextCell公式只是附加增量时差 恩。 = 2 + 4 + 1 + 0 + 7
每个值都是自上次双击以来的秒数。