【问题标题】:If-statement routine into a function将 if 语句例程转换为函数
【发布时间】:2014-10-09 23:13:18
【问题描述】:

也许你可以帮助我解决这个问题。 ckuhn203 建议我将所有重复的if-statement 分解为function。我正在尝试,但我无法弄清楚我做错了什么。 我有这个子:

Sub st_verdelen()
    Worksheets("totaallijst").Activate
    lastRtot = Sheets("totaallijst").Cells.SpecialCells(xlCellTypeLastCell).row
    counter_all = 0

    For a = 1 To lastRtot
        slbkoppeling = Sheets("totaallijst").Cells(a, 8).Value
        slbAanwezig = Sheets("totaallijst").Cells(a, 9).Value

        If Sheets("totaallijst").Cells(a, 7).Value = "2A2" And SLBers = "Mvs" And slbstdperklas = Sheets("StdntKlas").Cells(15, 5).Value And slbkoppeling = "" And slbAanwezig = "" Then
            If counter_all <= slbstdperklas And UUU = 0 Then
                Sheets("totaallijst").Cells(a, 9).Value = SLBers
                counter_all = counter_all + 1
                If counter_all = slbstdperklas Then
                    UUU = 1
                End If
            End If
        End If

        If Sheets("totaallijst").Cells(a, 7).Value = "1B4C" And SLBers = "htp" And slbstdperklas = Sheets("StdntKlas").Cells(16, 5).Value And slbkoppeling = "" And slbAanwezig = "" Then
            If counter_all <= slbstdperklas And VVV = 0 Then
                Sheets("totaallijst").Cells(a, 9).Value = SLBers
                counter_all = counter_all + 1
                If counter_all = slbstdperklas Then
                    VVV = 1
                End If
            End If
        End If

        If Sheets("tot_list").Cells(a, 7).Value = "2G4" And blsers = "htp" And blsstdperklas = Sheets("StdntKlas").Cells(16, 6).Value And blskoppeling = "" And blsAanwezig = "" Then
            If counterW <= blsstdperklas And WWW = 0 Then
                Sheets("tot_list").Cells(a, 9).Value = blsers
                counter_all = counter_all + 1

                If counterW = blsstdperklas Then
                    WWW = 1
                End If
            End If
        End If
next a
end sub

我试图将它们切成碎片,但不幸的是没有成功。我做过这样的事情:

Sub st_verdelen()
    Worksheets("totaallijst").Activate
    lastRtot = Sheets("totaallijst").Cells.SpecialCells(xlCellTypeLastCell).row
    counter_all = 0

For a = 1 To lastRtot
    If scan_slb("VCIT2A2", "Mvs", 15, 5, 0) Then

    End If
    If scan_slb("VCIT2A2", "htp", 16, 5, 0) Then

    End If
    If scan_slb("VCIT2A2", "htp", 16, 5, 0) Then

    End If
next a

end sub

Function scan_slb(value1, value2, row, col, noneactief) As Boolean
    scan_slb = (Sheets("totaallijst").Cells(a, 7).Value = value1 And SLBers = value2 And slbstdperklas = Sheets("StdntKlas").Cells(row, col).Value And slbkoppeling = "" And slbAanwezig = "")
    counter_all = counter_all + 1
    If counter_all = slbstdperklas Then
       noneactief = 1
    End If
End Function

我不知道我做错了什么。有什么建议吗?

counter_all 是必需的,这样它就不会再重复本节了。如果我把它排除在外,那么我就无法激活noneactief,这样if语句在被激活后就不会被激活。

【问题讨论】:

  • 我很难理解你的 counter_all 应该做什么?

标签: function excel if-statement office-2013 vba


【解决方案1】:

函数 scan_slb(value1, value2, row, col, noneactief) 似乎有一些问题,或者没有足够的上下文。使用“row”作为参数名称不是一个好习惯,因为它是一个属性名称。您有时会修改传递给函数的 noneactief 的值。这很好,因为 excel-vba 默认是通过引用传递的;但是调用代码并没有使用 noneactief ,所以你需要编写代码来做一些事情。我会做一些假设并试一试:

counter_all = 0

For a = 1 To lastRtot
    slbkoppeling = Sheets("totaallijst").Cells(a, 8).Value
    slbAanwezig = Sheets("totaallijst").Cells(a, 9).Value

    If scan_slb(sheets("totaallijst").Cells(a, 7).Value, "2A2",  _ 
      SLBers, "Mvs", slbstdperklas, Sheets("StdntKlas").Cells(15, 5).Value, _ 
      slbkoppeling, "", slbAanwezig, "") Then
        If counter_all <= slbstdperklas And UUU = 0 Then
            Sheets("totaallijst").Cells(a, 9).Value = SLBers
            counter_all = counter_all + 1
            If counter_all = slbstdperklas Then
                UUU = 1
            End If
        End If
    End If

    If scan_slb(Sheets("totaallijst").Cells(a, 7).Value, "1B4C", _ 
      SLBers, "htp", slbstdperklas, Sheets("StdntKlas").Cells(16, 5).Value, _ 
      slbkoppeling, "", slbAanwezig, "") Then
        If counter_all <= slbstdperklas And VVV = 0 Then
            Sheets("totaallijst").Cells(a, 9).Value = SLBers
            counter_all = counter_all + 1
            If counter_all = slbstdperklas Then
                VVV = 1
            End If
        End If
    End If

    If scan_slb(Sheets("tot_list").Cells(a, 7).Value, "2G4", _ 
      blsers, "htp", blsstdperklas, Sheets("StdntKlas").Cells(16, 6).Value, _ 
      blskoppeling, "", blsAanwezig, "") Then
        If counterW <= blsstdperklas And WWW = 0 Then
            Sheets("tot_list").Cells(a, 9).Value = blsers
            counter_all = counter_all + 1

            If counterW = blsstdperklas Then
                WWW = 1
            End If
        End If
    End If
next a
End Sub

function scan_slb(a1,a2,b1,b2,c1,c2,d1,d2)
    scan_slb = (a1 = a2 and b1 = b2 and c1 = c2 and d1 = d2)  
End Function

假设除了 counter_all 之外您还有全局变量,并且您正在测试“”的变量是字符串类型。使用函数可以考虑更多这些因素,特别是如果您愿意更改通过 ByRef 传递的变量。就我个人而言,我会将“ByVal”放在 scan_slb 中的所有变量之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2023-04-08
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多