如何解决函数输入数据类型是否影响循环速度/效率
这可能是用户“不喜欢”的另一个问题,因为它是与问题相关的更多建议。
我有一个在保存并打开工作簿时触发的代码。 它选择f中的正确工作表(白天与黑夜,日期与实际日期)。 周一至周三我的情况都一样,但是周四的时间表有所不同,因此我想测试
instr(ws.name,"Thursday") > 0
我的疑问是:在测试函数中输入sheetname as string
或ws as worksheet
效率更高。
代码在这里:
来电者
Public Sub SelectionDeQuartAuto()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Visible Then
With ws.Range("B4")
If .Value = Date Then
Exit For
End If
End With
End If
Next
If isDayShift(Now,ws) Then
Set ws = DayShiftSheet
Else
Set ws = NightShiftSheet
End If
If ws Is Nothing Then
Sheets("Vendredi jour").Activate
Else
ws.Activate
End If
End Sub
功能:
Public Function isDayShift(DateTime As Date,ws As Worksheet) As Boolean
If InStr(ws.Name,"Jeudi") > 0 Then
isDayShift = TimeValue(DateTime) > TimeValue("03:00:00") And TimeValue(DateTime) < TimeValue("15:15:00")
Else
isDayShift = TimeValue(DateTime) > TimeValue("03:00:00") And TimeValue(DateTime) < TimeValue("16:15:00")
End If
End Function
将会成为:
Public Sub SelectionDeQuartAuto()
Dim ws As Worksheet
Dim sheetname as string
' For etc..
' Exit for with right ws
sheetname = ws.Name
If isDayShift(Now,sheetname) Then
' etc...
End Sub
Public Function isDayShift(DateTime As Date,sheetname As string) As Boolean
If InStr(sheetname,"Jeudi") > 0 Then
' ... rest
End Function
如果没什么大不了和/或我的问题不适当,只需在评论中说出来即可,然后按原样删除并删除男孩和假人
解决方法
这与绩效无关,而与职责和最低知识原则有关。
如果所有功能需要知道的是工作表的名称,那么编写该函数的最佳方法是使其以工作表的名称为一个参数。
通过使用String
而不是Worksheet
,您可以使函数的目的更加明确,将其与Excel对象模型分离(其逻辑可与任何String
值一起使用,更易于测试),并有助于防止将来实现中的作用域蠕变(即,如果它可以访问Worksheet
对象,那么它可以做所有此类引用允许的操作) )。
我什至会争辩说,您的函数甚至都不关心工作表名称,它真正想要使用的是weekdayName
,并且它是法语值可能很重要,所以我会使用类似wkDayFrenchName
的东西-字符串值来自Worksheet
的事实与它无关。
Public Function IsDayShift(ByVal DateTime As Date,ByVal wkDayFrenchName As string) As Boolean
If InStr(wkDayFrenchName,"Jeudi") > 0 Then
' ...
End If
End Function
请注意,可以进一步简化逻辑以从给定日期算出工作日,这将使其更易于使用且更可靠:
Public Function IsDayShift(ByVal DateTime As Date) As Boolean
If WeekDay(DateTime,vbSunday) > vbThursday Then
' ...
End If
End Function
现在处理名为Jeudi
(“星期四”)但包含实际上是Date
(“星期一”)的Lundi
的工作表仍会产生正确的输出。可以说该函数可以是无参数的,并且可以自行计算出当前日期,但是将日期作为参数使用它的用途更加广泛,过程/函数的职责越少越好。
您不应该介意效率-您将无法衡量任何差异。
始终使用最适合您的需求。如果处理工作表,则传递工作表;如果处理字符串,则传递字符串。
如果您确定必须始终检查字符串,则将工作表名称作为字符串传递。如果您可能改变主意并检查工作表是否因其他条件(例如单元格或命名范围)而匹配,最好通过工作表。在这两种情况下,请使用清晰的名称(但您已经使用了)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。