提问人:Mike T 提问时间:10/17/2023 最后编辑:Mike T 更新时间:10/17/2023 访问量:99
向下舍入 NOW() 函数以在 VLOOKUP 中使用
Rounding down NOW() function for use in VLOOKUP
问:
早上好。今天早上有一个快速的问题供你思考,这个问题的答案对某些人来说可能很容易......但对我来说,我无法理解,呵呵
因此,我从 api.open-meteo.com 中提取了一些数据,只是一些按小时划分的天气数据,如图所示。我想使用右侧的数据(即正在进行的 HUD)在 HUD 显示屏上分离显示当前小时和当前时间后 8 小时的数据。右边的时间需要像你想象的那样是动态的,当前小时是 8 点之后。
我使用 floor 方法将第一个“时间”四舍五入为小时,然后使用公式为每列添加一个小时:
=FLOOR(NOW(),"1:00")
=N1+(1*(1/24))
=O1+(1*(1/24))
主要问题是我不能将 VLOOKUP 与上述公式一起使用,因为出于某种原因它不起作用,即使我输入一个公式,它就会变成真的。=N1=A10
有什么想法可以解决吗?更喜欢只有单元格公式的简单设置,但如果需要,我不介意潜入 VBA 领域!
有什么想法吗?
答:
1赞
FaneDuru
10/17/2023
#1
请使用下一个更新的代码。它将格式化必要的范围,使公式低于范围“N1:AB1”以匹配导入的数据:
Sub openWeather()
Const url As String = "https://api.open-meteo.com/v1/forecast?latitude=53.288&longitude=-1.2881&hourly=temperature_2m,precipitation_probability,precipitation,rain,snowfall,windspeed_10m,winddirection_10m,windgusts_10m,is_day&windspeed_unit=mph&forecast_days=1"
Dim json As Object, ws As Worksheet, dataSet As Long, currRow As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
currRow = 2
With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "GET", url, False
.send
If .Status = 200 Then
Set json = JsonConverter.ParseJson(.responseText)
Application.Calculation = xlCalculationManual: Application.EnableEvents = False
For dataSet = 1 To json("hourly")("time").Count
ws.Cells(currRow, 1) = Replace(json("hourly")("time")(dataSet), "T", " ") 'timestamp
ws.Cells(currRow, 2) = json("hourly")("temperature_2m")(dataSet) 'temp
ws.Cells(currRow, 3) = json("hourly")("precipitation")(dataSet) 'rain
ws.Cells(currRow, 4) = json("hourly")("snowfall")(dataSet) 'snow
ws.Cells(currRow, 5) = json("hourly")("precipitation_probability")(dataSet) 'probability
ws.Cells(currRow, 6) = json("hourly")("windspeed_10m")(dataSet) 'speed
ws.Cells(currRow, 7) = json("hourly")("winddirection_10m")(dataSet) 'direction
ws.Cells(currRow, 8) = json("hourly")("is_day")(dataSet) 'day / night
currRow = currRow + 1
Next dataSet
Application.Calculation = xlCalculationAutomatic: Application.EnableEvents = True
Else
MsgBox "Page not loaded. HTTP status: " & .Status
End If
End With
For Each cel In ws.Range("G2:G" & ws.Cells(Rows.Count, "G").End(xlUp).Row + 1).Cells
Next cel
processRangeForVlookup ws, False 'it creates the appropriate range in N1:AB1
End Sub
Sub processRangeForVlookup(ws As Worksheet, Optional boolChangeDate As Boolean = False)
Dim rngD As Range
'Create the necessary range to be compared:
' first cell to contain local time/local hour:
ws.Range("N1").Formula = Evaluate("=FLOOR(now(), """ & Format(Hour(Now), "00") & ":00"")")
ws.Range("O1").Formula = "=N1+(1*(1/24))": ws.Range("P1").Formula = "=O1+(1*(1/24))"
ws.Range("O1:P1").AutoFill Destination:=ws.Range("O1:AB1")
Set rngD = ws.Range("N1:AB1")
With rngD
.NumberFormat = "dd/mm/yyyy hh:mm"
.Value = .Value
.EntireColumn.AutoFit
End With
If boolChangeDate Then 'to change the date at midnight as the following one.
Dim i As Long
For i = 1 To rngD.Columns.Count
If Hour(rngD.Cells(1, i).Value) = 0 Then
rngD.Cells(1, i).Value = Int(rngD.Cells(1, i).Value) + 1
End If
Next i
End If
End Sub
请在测试后发送一些反馈。
评论
0赞
FaneDuru
10/17/2023
@Mike T 您可以从此处下载更新的工作簿。
0赞
Mike T
10/17/2023
代码非常适合使 VLOOKUP 工作,而且确实如此!我从来没有想过整个 .value=.value....天才!然而,一个问题是使用该公式,出于某种原因,00:00(以今天为例)将自己设置为 17/10/2023 00:00,而不是 18/10/2023 00:00。因此,如果这有意义的话,每小时的流量会跳回一天的开始,只有那一个小时。上传了一张图片,以防万一我解释得有点奇怪 imgur.com/a/lfEFpFB
0赞
Mike T
10/17/2023
此外,我必须将 FLOOR 公式意义更新为“1:00”,以便第一个值根据当前小时而变化
0赞
FaneDuru
10/17/2023
@Mike T 看起来这就是 Windows 解释一天中第一个小时的方式。我的意思是,作为现有一天的最后一天。我想,我们可以欺骗它,如果你认为这样做会更好。我的意思是在小时为“00”时在日期上添加一天,但是您是否检查了“是否”网站如何处理这方面?如果它确实像你(和我)认为的那样正常,我想我可以调查这个问题并找到解决方案......
0赞
FaneDuru
10/17/2023
@Mike T 请清楚地解释哪个是第一个日期/小时,我会尝试为午夜过关的情况找到解决方案......
评论