excel 以1小时为间隔分割时间范围

3mpgtkmj  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(198)

我想将时间范围分割为1小时的间隔

将单元格A2和A3中的给定时间范围分割为1小时间隔,时间范围将更改为几个时间,并在(宏)单击时将给定时间范围分割为1小时间隔。

6yjfywim

6yjfywim1#

创建每小时序列

Sub CreateHourlySequence()

    Dim ws As Worksheet: Set ws = ActiveSheet ' improve!
    
    Dim dt1: dt1 = ws.Range("A2").Value
    Dim dt2: dt2 = ws.Range("A3").Value
    
    Dim dfCell As Range: Set dfCell = ws.Range("C2")
    dfCell.Resize(ws.Rows.Count - dfCell.Row + 1).ClearContents

    Select Case False
        Case IsDate(dt1), IsDate(dt2): Exit Sub
    End Select
    
    Dim dtDiff As Long: dtDiff = DateDiff("h", dt1, dt2)
    
    Dim dtStart As Date, dStep As Long
    
    Select Case dtDiff
        Case Is > 0: dtStart = dt1: dStep = 1
        Case Is < 0: dtStart = dt2: dStep = -1
    End Select
    
    Dim rCount As Long: rCount = Abs(dtDiff) + 1
    Dim Data() As Date: ReDim Data(1 To rCount, 1 To 1)
    
    Dim d As Long, r As Long
    
    If dStep = 0 Then
        Data(1, 1) = dtStart
    Else
        For d = 0 To dtDiff Step dStep
            r = r + 1
            Data(r, 1) = DateAdd("h", d, dtStart)
        Next d
    End If
    
    dfCell.Resize(rCount).Value = Data
    
End Sub
q3qa4bjr

q3qa4bjr2#

如果您可以使用非VBA解决方案,那么您还有一些选择。

选项1:序列

对于列出here的Excel版本,可以使用chris neilsen建议的SEQUENCE函数。
示例:
假设您的数据从A1开始,如下所示:

然后,在C2中,您可以:
=SEQUENCE((A3-A2)/VALUE("01:00:00")+1,1,A2,VALUE("01:00:00"))
注意,VALUE("01:00:00")表示1小时(但是您也可以使用Mayukh Bhattacharya建议的TIME(1,,))。

选项2:动态数组公式

你有一个Excel版本的here列表,你可以使用动态数组公式。

示例:

假设与选项1相同,对于数据的位置,可以使用如下公式:
=(ROW(INDIRECT("1:"&(A3-A2)/VALUE("01:00:00")+1))-1)*VALUE("01:00:00")+A2

解释:

ROW函数中使用INDIRECT函数是一个获得连续值数组的好方法,例如,INDIRECT("1:9")返回包含第1到9行的数组,并将其传递给ROW,将以列的形式返回数组,如{1;2;3;4;5;6;7;8;9}所示(每行只获得一个元素)。
由于我们事先不知道要执行多少步骤,因此我们使用(A3-A2)/VALUE("01:00:00")+1计算元素的数量,并将其连接到"1:"以获得所需的大小范围。
当我们有一个顺序数组时,我们只需要确保它从零开始,这就是为什么我们像这样把数组的所有元素都去掉1:ROW(INDIRECT("1:"&(A3-A2)/VALUE("01:00:00")+1))-1
最后,将数组的每个元素乘以对应于1小时的值,并将A2中的起点相加。

选项3:旧数组公式

与选项3相同的想法,但使用了这里解释的旧数组公式。基本上,您必须使用Ctrl+Shift+Enter

eqzww0vc

eqzww0vc3#

一个简单的解决方案给你的例子(清除单元格,这是你的工作:-)这将是更好的写入数组,但作为例子,它应该是确定的。

Option Explicit
    
    Sub TimeToHour()
    Dim startTime As Double, endTime As Double, i As Double, z As Double
    startTime = Range("a2")
    endTime = Range("a3")
    Columns(3).NumberFormat = Range("a2").NumberFormat ' Column C
    z = 2
    For i = startTime To endTime Step 1 / 24
    Cells(z, 3) = i ' write to column c starting in row 2
    z = z + 1
    Next
    End Sub

相关问题