我有一个Excel电子表格,我需要在一列中的单元格中输入天数值,并自动将它们转换为秒。我怎么能这样做?
例如,假设我希望B列中的值反映为秒。所以在B1中输入1,按Enter键,现在B1中的值是86400;在B2 I中键入2,按Enter键,B2变为172800。
更清晰?
答案 0 :(得分:1)
如果没有VBA,您可以使用公式列,类似于以下示例:
也就是说,您完成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(从工作表上的任何位置),然后选择您要更新的范围并选择选择性粘贴>操作>相乘:
答案 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