如何将我在Excel单元格中输入的值乘以常数,结果出现在同一个单元格上?

时间:2014-11-20 18:41:51

标签: excel excel-formula

我有一个Excel电子表格,我需要在一列中的单元格中输入天数值,并自动将它们转换为秒。我怎么能这样做?

例如,假设我希望B列中的值反映为秒。所以在B1中输入1,按Enter键,现在B1中的值是86400;在B2 I中键入2,按Enter键,B2变为172800。

更清晰?

3 个答案:

答案 0 :(得分:1)

如果没有VBA,您可以使用公式列,类似于以下示例:

enter image description here

也就是说,您完成Days列,而Seconds列中的条目将采用Days列中的值并将它们乘以86000(每天24小时x每小时60分钟x每分钟60秒)。这可能是最好的方法,因为您仍然保留原始数据集(天)。

使用VBA,您可以使用以下内容进入与工作表对象关联的更改过程:

Dim redo As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ChangedCell As Variant

If Target.Count = 1 Then
  For Each ChangedCell In Target
    If redo Then
      If (ChangedCell.Column = 2) And (ChangedCell.Row > 1) Then
        redo = False
        ChangedCell.Value = ChangedCell.Value * 86400 ' * 24 * 60 * 60
      End If
    Else
      redo = True
    End If
  Next
End If
End Sub

以上代码循环遍历Target范围内的所有元素(所有已更改的单元格),并使用前面提到的相同公式更新它们(将调用.Value乘以86400)仅当单元格在特定范围内时才。上述特定范围是第2列和第2列中的单元格。 1.避免在此范围之外进行任何计算。此外,由于每次更改都会执行更改过程,因此您可能会以递归方式更新工作表。为此,创建了一个布尔redo以避免重新计算任何更改。

虽然使用VBA解决方案很棒,但是您使用此更新丢失了原始数据集,因此我建议您不要使用它。

最后,您可以使用粘贴特殊方法,在其中复制值86400(从工作表上的任何位置),然后选择您要更新的范围并选择选择性粘贴>操作>相乘:

enter image description here

答案 1 :(得分:0)

如果您希望自动将键入D列的任何数字转换为秒作为真实时间值,请右键单击工作表的名称标签,然后选择View Code。当VBE打开时,将以下内容粘贴到右侧的窗格中,标题为 Book1 - Sheet1(Code)

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Not Intersect(Target, Columns("A")) Is Nothing Then
        On Error GoTo Erreur
        Application.EnableEvents = False
        Dim a As Range, ms As Boolean
        For Each a In Intersect(Target, Columns("A"))
            If IsNumeric(a.Value) Then
                If a.Value <> 0 Then
                    a.Offset(0, 1) = a.Value * 86400
                Else
                    a.Offset(0, 1).ClearContents
                End If
            End If
        Next a
    End If
    GoTo Fìn
Erreur:
    Debug.Print Err
Fìn:
    Application.EnableEvents = True
End Sub

点按Alt+Q返回工作表,然后将秒作为数字开到D列。

我正在将整数或双数字输入到单元格中,然后是第一个小时,然后是分钟,最后是秒。我发现这是保持Excel的floating point precision 15位数的{{3}}显着性值的任意毫秒的准确性的最佳方法。

修改 修改为更接近OP的编辑问题

答案 2 :(得分:0)

我修改了Jeeped代码以满足我的需求

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Not Intersect(Target, Columns("D")) Is Nothing Then
        On Error GoTo Erreur
        Application.EnableEvents = False
        Dim d As Range
        For Each d In Intersect(Target, Columns("D"))
            If IsNumeric(d.Value) And d.Value > 0 Then
                ' Interested in a 8-hour day
                d.Value = d.Value * 3600 * 8
            Else
                d.Value = ""
            End If
        Next d
    End If
    GoTo Fìn
Erreur:
    Debug.Print Err
Fìn:
    Application.EnableEvents = True
End Sub