私はいくつかのコードのために開発した構造体にアクセスするためのWith文を持っています。構造体は(私が働いているところに)MaleとFemaleの2つの枝があり、私はサブルーチンにIntegerを渡してセックスを指定しています。構造体を持つVBA内のIIF
大雑把その後、私のサブルーチンで私はWITHにIIF文を置くことによって、内部IF文を取り除くことができれば私の質問がある
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
を持って、私は
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
を持って話しますブロック...または同等の何か。コードは正常に機能するので、これは主に学問的な質問ですが、。メイルズをすべて変更するという単純な違いですべてのコードを複製する必要はありません。~。女性。 If Cur_Sex = 0 Thenブロックの各部分内の。
ありがとうございます。これが理にかなってほしい。私はうまくいけば、それをより明確にするために、問題の実際のコードを追加している
...
Cur_Ethは DistInfoは人口の人種分布 Cur_Eth_Totalは、の和である二重であるため、短いです現在の人種の略です。 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
あなたは、タイプではなくクラスが必要なように聞こえます。 – Comintern
興味深い考え。あなたは正しいかもしれません、元々クラスでそれを構築することが賢明かもしれません。現時点では、この問題を解決するためにすべてのコードを書き直すつもりはないと思います。それは働いている...私はそれを維持することをより簡単にしたいと考えていた。しかし、将来のための良い考え。 –
一般に、クラスにカプセル化できる機能が多くなればなるほど、維持しやすくなります。 [SOLIDデザイン](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design))を参照してください。 – Comintern