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
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
3条答案
按热度按时间6yjfywim1#
创建每小时序列
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
。eqzww0vc3#
一个简单的解决方案给你的例子(清除单元格,这是你的工作:-)这将是更好的写入数组,但作为例子,它应该是确定的。