具有结构的VBA中的IIF

NWT*_*Bob 2 excel vba excel-vba

我有一个With语句来访问我为某些代码开发的结构.结构(我正在工作)男性和女性的两个分支,我正在进入子程序一个整数来指定性别.

粗略地说我有

Type MyDetails
    green As Integer
    black As Integer
    yellow As Integer
    blue As Integer
End Type

Type Genders
    Males As MyDetails
    Females As MyDetails
End Type

Type GlobalData
   RegionName As String
   Ages(0..100) As Genders
End Type

Public Dim PopData As GlobalData
Run Code Online (Sandbox Code Playgroud)

然后在我的子程序中

With PopData.Ages(Cur_Age)
    If Cur_Sex = 0 Then
        ... Do the stuff for males
    Else
        ... Do the exact same stuff but for females
    End If
End With
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果我可以通过将一个IIF语句放入WITH块...或类似的东西来摆脱内部IF语句.这主要是一个学术问题,因为代码工作得很好......但是不要因为改变所有.Males的简单差异而不必复制我的所有代码..女.在If Cur_Sex = 0 Then块的每个部分内.

提前致谢.希望这是有道理的.

我正在添加有问题的实际代码,希望能让它更清晰......

Cur_Eth是当前种族的缩写DistInfo是人口种族分布的缩写Cur_Eth_Total是一个Double,它是.D + .M + .I + .N的总和(对于男性或女性,取决于我何时调用例程).

With PopData(Cur_CSD).DistInfo
    Cur_Rand = Rnd
    Cur_Eth = -1
    If Cur_Sex = 0 Then
        Cur_Eth_Total = .Males.D + .Males.M + .Males.I + .Males.N
        Select Case Cur_Rand
            Case Is < CDbl(.Males.D) / Cur_Eth_Total
                Cur_Eth = 0
            Case Is < CDbl(.Males.D + .Males.M) / Cur_Eth_Total
                Cur_Eth = 1
            Case Is < CDbl(.Males.D + .Males.M + .Males.I) / Cur_Eth_Total
                Cur_Eth = 2
            Case Else
                Cur_Eth = 3
        End Select
    Else
        Cur_Eth_Total = .Females.D + .Females.M + .Females.I + .Females.N
        Select Case Cur_Rand
            Case Is < CDbl(.Females.D) / Cur_Eth_Total
                Cur_Eth = 0
            Case Is < CDbl(.Females.D + .Females.M) / Cur_Eth_Total
                Cur_Eth = 1
            Case Is < CDbl(.Females.D + .Females.M + .Females.I) / Cur_Eth_Total
                Cur_Eth = 2
            Case Else
                Cur_Eth = 3
        End Select
    End If
End With
Run Code Online (Sandbox Code Playgroud)

cyb*_*shu 6

IIf通过它调用方法是非常低效的.只要您进行简单的变量赋值,就可以了,但如果您尝试使用测试条件调用函数,则会遇到麻烦.事实IIf是,无论条件的真或假状态,它实际上评估/执行两个参数.

因此,就代码而言,这可能是分类器,在执行方面效率非常低.

看例子:

Function test1() As String
  MsgBox "Test1 called"
  test1 = "test1"
End Function

Function test2() As String
    MsgBox "Test2 called"
    test2 = "test2"
End Function

Sub Test()

    Dim x  As String
    Dim Y  As Long
    Dim Z  As String

    x = 0

    Y = IIf(x = 1, 1, 2)
    MsgBox Y

    '/ Although condition evaluates to false, it will still call test1 
    '/which is bound to true condition,before calling test2.
    Z = IIf(x = 1, test1, test2)
    MsgBox Z

End Sub
Run Code Online (Sandbox Code Playgroud)

  • @NWT_Bob我维护了10年以上的vba代码.而且我可以告诉你,除非你的'IIF'非常简单(就像上面的例子中所说的那样),否则随着时间的推移它将成为一场噩梦.而这4条额外的线条根本不会使它更易于维护. (2认同)