是影响环路速度/效率的功能输入数据类型



这可能是用户"不喜欢"因为这更多的是与建议有关,而不是与问题有关。

我有一个在保存和打开工作簿时触发的代码。它在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("星期四"(但包含实际上是Lundi("星期一"(的Date的工作表仍然会产生正确的输出。可以说,该函数可以是无参数的,并负责计算当前日期本身,但将日期作为参数的用途要广泛得多,程序/函数的职责越少越好。

你不应该在意效率——你将无法衡量任何差异。

总是使用最适合你需要的东西。如果你处理的是工作表,就传递一个工作表;如果你处理字符串,就传递字符串。

如果确定必须始终检查字符串,请将工作表名称作为字符串传递。如果您可能因为其他条件(可能是单元格或命名范围(而改变主意并检查工作表是否匹配,那么最好传递一个工作表。只是在这两种情况下,都要使用清晰的名称(但您已经这样做了(。

最新更新