处理Excel中的TimeRecording文件(格式化单元格)

时间:2017-03-06 11:26:57

标签: excel

Excel对细胞的假设令我感到困惑。我在Office 365 - Excel for Mac,版本15.28。

我是时间记录很多事情,我想计算不同事物的关系和倾向。我已经导出了我的日志文件,并在excel中打开了它。一个简单的版本看起来像这样:

enter image description here

在实际工作表中,我有40多个任务和50多个日期。我希望能够对这些数据进行一些计算。但Excel并不“知道它是什么”(持续时间),因此无法添加或执行任何操作。

所以有一个问题是,如何让Excel知道,这是持续时间?我试着做this question建议的事情。但是当我将单元格格式化为[h]:mm时,它会给我这个错误:

enter image description here

仅供参考:在大表中,那么有很多次,所以总数达到了633:33的范围。

我希望能够进行简单的计算,例如:

=SUM(B1, C4, D5)

=SUM(B1, C4, D5)/COUNT(B1, C4, D5)

也许还可以制作一些图表和图表。

我所做的另一项尝试是尝试让所有单元格的格式为hh.mm,而不是hh:mm,但这给了我一些问题。我的方法是:

  • 将所有单元格转换为“文本”以告诉Excel:'嘿.​​.....不要在此处进行任何自动转换/猜测,也不要将任何单元格转换为日期或十进制数字或折叠折纸天鹅!'
  • 之后,我将:简单地“全部替换”为.
  • 但在'全部替换'之后,633:33变为633.36.00(即使单元格是'文本'单元格)。
  • 如果我只是双击单元格进行编辑,那么数字'神奇地'从633.36.00变为27/01/1900 15.36.00 ......到底怎么回事!?我需要一个程序,不要求我浏览所有数以千计的数字并编辑其中的任何数字(或确保Excel已将数字转换成飞行的独角兽。

EDIT1

Here's an example我在Google表格中处理的总表单。

EDIT2

如果我将单元格格式化为[h]:mm,那么我会收到错误(参见上文)。但是,如果我将其格式化为[t]:mm,那么我不会收到错误(感谢Axel Richter指出这一点)。它可能与我的Excel安装的初始语言(丹麦语)有关。    但是......如果我尝试总结一堆单元格,在对所有内容进行格式化之后,它总计为0:00

如果我将所有单元格格式化为Time(很清楚它是错误的格式,但希望Excel可以看到并修复它) - 然后尝试总结几个单元格,那么它总计为{ {1}}(即使它不是空单元格)。

同样重要的是,当我总结一些数字时,我是从一个通用单元格中做到的 - 或者Excel知道,如果我从00.00.00 - 符号开始,它将会是计算(因此单元格格无关紧要)?

5 个答案:

答案 0 :(得分:1)

Excel将以下列形式将日期时间值存储为浮点双精度值:

1天= 1

1小时= 1/24 = 0.0416666666666667

1分钟= 1/24/60 = 0.000694444444444444

如此格式化为时间所有大于或等于0但小于1的值将是从00:00到23:59。大于1的值将是1 = 01/01/1900 00:00:00的日期。但是,如果您仅使用hh:mm将这些值格式化为时间,则仅显示时间。日期只是隐藏。

例如,使用1.25格式化的hh:mm会显示06:00,但它是1 1/4天01/01/1900 06:00:00。要查看多天的小时数,可以使用格式[h]:mm。例如,使用1.25格式化的[h]:mm将显示30:00,即1天(24:00)+ 1/4天(06:00)。

虽然Excel将独立于区域设置执行此操作,但用户定义的格式代码以及Excel将作为时间值采用的输入值类型取决于区域设置。

例如,您的语言环境丹麦语(格陵兰岛)的格式代码不同。请参阅Formatere tal som datoer eller klokkeslæt

因此,您的格式代码将为[t]:mm而不是[h]:mm

此外,您的语言区域丹麦语(格陵兰岛)的时间分隔符为.,而不是:。因此,Excel将采用时间值123.45(123小时45分钟)而不是123:45的值。

在你的上一条评论中,你会说:“之后它看起来很奇怪,例如:123:45而不是123.45”。是的,因为您的用户定义格式[t]:mm也包含时间分隔符:。但这与您的语言环境设置不同,.是时间分隔符。虽然输入值Excel会考虑区域设置,因此需要123.45作为123小时45分钟的时间值。但是,在输入Excel应用格式设置[t]:mm后,显示123:45

在上一条评论中,您说17:24 * 24等于417:36让您感到困惑。但这正是应有的。

17:24是17小时24分钟。乘以24是17小时* 24 = 408小时和24分钟* 24 = 576分钟。 576分钟是9小时36分钟。所以我们得到(408小时+9小时)和36分钟= 417小时36分钟= 417:36

答案 1 :(得分:0)

我无法编辑工作表,因此我copied it。正如您在专栏AS和行43中看到的那样,Google提供了#duration;#39;格式。你不必操纵某些东西。只需更改单元格格式即可。 enter image description here

在Excel中,持续时间格式为[h]:mm。在单元格中点击ctrl + 1,然后选择Custom并在[h]:mm键入Type并点击enter。 如果SO答案太难理解,请尝试this

答案 2 :(得分:0)

我提前道歉这是多么粗糙,但我主要是把这些代码打包在一起以适应任务,并且不想浪费时间在它上面。但是原则是存在的,所以至少它应该指向你需要前进的方向。

Sub Time_Summarization()
    Dim i As Long
    Dim j As Long

    Dim cell As Range

    Dim sHolder As String
    Dim vHolder As Variant
    Dim arrHolder() As Double
    Dim bAdd As Boolean

    Dim dHolder_Whole As Double
    Dim dHolder_Remainder As Double

    Dim sOutput As String

    ReDim arrHolder(0 To 2)

    ' Use a set range. Selection here is just for testing
    ' Ideally there should be data validation in this loop to ensure that the input
    ' values are numeric time values.
    For Each cell In Selection
        ' Convert the cell value to a date to permit splitting.
        ' The value is then split into a 1-d array with 3 positions (H, M, S)
        vHolder = Split(CDate(cell.value), ":")

        ' Loop through the split values from first to last, and trim off the AM/PM.
        ' If it is a PM date, set the flag to add 12 (13:00:00 gets displayed as 1:00:00 PM)
        For j = LBound(vHolder) To UBound(vHolder)
            ' If PM, set the flag.
            If InStr(vHolder(j), "PM") Then bAdd = True

            ' Remove "AM" and "PM"
            vHolder(j) = Replace(vHolder(j), " AM", vbNullString)
            vHolder(j) = Replace(vHolder(j), " PM", vbNullString)

            ' Add the values into the array in the same order.
            arrHolder(j) = arrHolder(j) + vHolder(j)
        Next

        ' Add 12 hours if needed
        If bAdd Then arrHolder(0) = arrHolder(0) + 12

        ' Reset the flag for the next loop
        bAdd = False
    Next

    ' Step backwards through the array to round up increments of 60.
    For i = UBound(arrHolder) To LBound(arrHolder) + 1 Step -1
        ' This will return the number of times the value goes into 60.
        dHolder_Whole = arrHolder(i) \ 60

        ' This will return the remainder of the value divided by 60.
        dHolder_Remainder = arrHolder(i) Mod 60

        ' Round up seconds to minutes, and minutes to hours.
        arrHolder(i - 1) = arrHolder(i - 1) + dHolder_Whole

        ' Overwrite the remainder
        arrHolder(i) = dHolder_Remainder
    Next

    ' Combine the separate values into a string.
    sHolder = arrHolder(0) & ":" & arrHolder(1) & ":" & arrHolder(2)

    ' Just for testing, do with the values whatever you wish.
    Debug.Print sHolder
End Sub

同样,这主要是工作的模型,但需要根据您的需要进行调整。

答案 3 :(得分:0)

Zeth,我下载了你的文件,我可以用你的时间数据做一些计算。我选择了具有持续时间的所有单元格,并将单元格的格式更改为" time"。看起来你应该改变所有单元格格式,包括空单元格。

如果不起作用,请找到"更多格式的数字"吃了数字"数字"菜单。然后,选择选项" Hour"并选择最接近数据格式的格式。同时注意选项" locality"在这个菜单的底部。小时格式选项取决于所选区域。 (世界上每个地区都有一些关于它的召集,而且Excel会在很大程度上重新协调。

答案 4 :(得分:0)

格式化数字不会改变Excel执行计算的方式。
因此,格式化为时间且显示01:28:00的单元格(c3)实际上包含0.061111,因为Excel将时间视为24小时日的分数。
当你加起来很多次并且他们加起来超过24小时时,基础数字超​​过1天,所以你得到小数点前的天数和小数点后的剩余24小时的分数。 />因此,要将持续时间或时间转换为小时,您只需将其乘以24并将其格式化为数字或一般(小数点后面的数字是一小时的分数)。
如果您只想格式化小时和分钟的结果使用格式[h]:mm并且不要乘以24 - 在您的系统上查看格式单元格 - 自定义以查看相应的[h:mm]是什么。