函数输入数据类型是否影响循环速度/效率

Pat*_*ées 1 excel vba input function

这可能是用户“不喜欢”的另一个问题,因为它与建议相关而不是与问题相关。

我有一个在保存和工作簿打开时触发的代码。它在 f(白天与夜晚,日期与实际日期)中选择正确的工作表。我周一到周三的情况相同,但周四的时间表不同,然后我想测试

instr(ws.name,"Thursday") > 0 
Run Code Online (Sandbox Code Playgroud)

我的问题是:输入sheetname as stringws 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
Run Code Online (Sandbox Code Playgroud)

功能:

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
Run Code Online (Sandbox Code Playgroud)

这将成为:

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
Run Code Online (Sandbox Code Playgroud)

如果这无关紧要和/或我的问题不合适,请在评论中说出来,我就这样离开并删除,谢谢男孩和女孩

Mat*_*don 6

这与绩效无关,而与责任最少知识原则有关

如果一个函数只需要知道一个工作表的名称,那么编写该函数的最佳方法就是让它以工作表的名称作为参数。

通过采用 aString而不是 a Worksheet,您可以使函数的目的更清晰,将其与 Excel 对象模型分离(其逻辑适用于任何String值,使其更易于测试),并有助于防止未来在其实现中的范围蔓延(即如果它可以访问一个Worksheet对象,那么它可以做任何这样的引用允许它做的事情)。

我什至会争辩说,您的函数甚至不关心工作表名称,它真正想要使用的是 a weekdayName,并且它是法语值可能很重要,所以我会采用类似的方法wkDayFrenchName- 事实上字符串值来自 aWorksheet无关紧要。

Public Function IsDayShift(ByVal DateTime As Date, ByVal wkDayFrenchName As string) As Boolean
    If InStr(wkDayFrenchName, "Jeudi") > 0 Then
        ' ...
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

请注意,可以进一步简化逻辑以仅从给定日期计算工作日,这将使其更易于使用且更可靠:

Public Function IsDayShift(ByVal DateTime As Date) As Boolean
    If WeekDay(DateTime, vbSunday) > vbThursday Then
        ' ...
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

现在处理名为Jeudi("Thursday") 但包含Date实际上是Lundi("Monday")的工作表仍将产生正确的输出。可以说,该函数可以是无参数的,并负责计算当前日期本身,但将日期作为参数更通用,过程/函数的职责越少越好。

  • @PatatesPilées au plaisir!仅供参考 [Rubberduck](http://www.rubberduckvba.com/) 可以帮助您避免一些常见的 VBA 陷阱,并提供工具让 VBA 开发变得更加愉快;我也会时不时地在项目博客上发布文章和 VBA 教程。干杯! (2认同)