首页 > 解决方案 > 在 Excel VBA 中计算频率

问题描述

我有一个开始时间和一个结束时间,我以小时为单位记录了那个时间。我让用户输入了一个目标,我想知道必须多久投篮一次才能达到目标。

例如,startTime = 08:00 AM简单endTime = 09:00 AMtargetGoal = 5数学逻辑告诉我们,早上 8 点到 9 点之间是 1 小时或 60 分钟,因此要达到 5 的目标目标,用户必须每 12 分钟至少投篮 1 个(=60/ 5)

我对这个逻辑没有意见,但在我的 VBA 中,我无法完全理解它的逻辑。这就是我到目前为止所拥有的。

Dim sHour As Double
Dim eHour As Double
Dim targetMake As Double
Dim hitFreq As Double

targetMake = Sheets("Statistics").Range("C2").Value
sHour = Sheets("Statistics").Range("A2").Value
eHour = Sheets("Statistics").Range("B2").Value

hitFreq = (eHour - sHour) / targetMake

而不是在我运行这个 VBA 时按预期返回 12 我得到4.166666666

计算或声明类型有什么问题?

标签: excelvba

解决方案


请注意工作表中的数据和数据格式。

在这种情况下,该字段似乎被格式化为显示小时数,当它显示一般日期和小时数时,显示的信息后面有一个具体的数字。

例如:

  • 如果单元格的格式设置为显示小时并且显示上午 08:00,则后面有一个数字,类似于“8,333”

  • 当你使用Range("A2").Value它时返回“8,333”而不是 8,正如你所想的那样

因为结束时间是一样的

  • 09:00AM 将由“8,375”之类的东西表示。

这就是你的程序中发生的事情。

要修复它,您需要将检索到的值转换为相应的小时。

尝试以下转换方法:

sHour = Sheets("Statistics").Range("A2").Value
sConverted = (sHour - CInt(sHour)) * 24

eHour = Sheets("Statistics").Range("A2").Value
eConverted = (eHour - CInt(eHour)) * 24

您还需要在最终公式中将小时转换为分钟

hitFreq = (eConverted - sConverted ) * 60 / targetMake

那应该可以解决您的问题


推荐阅读