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)
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)