这是我的第一个非常重要的VBA计划,虽然我之前使用BASIC的各种方言使用数组,并且花了最后三到四个晚上仔细考虑了Walkenbach' Excel VBA for Dummies& #39;我很困惑。
我希望发现数组中一个元素的值增加了一个,而在475次运行中,代码按预期执行了449次。其他26次运行产生的一个元素增加了2。为了增加这个初始代码块访问的十二个元素的奇怪性,其中只有四个表现出这种行为,其他的按预期返回1。
如果有帮助我可以发布错误功能使用的两个表,但我不知道无论数据如何都会发生这种情况。
'UDF to roll a number of Dice of specified size and total them
Function Dice(NoOfDice, DiceSize)
Dice = 0
For i = 1 To NoOfDice
Dice = Dice + WorksheetFunction.RandBetween(1, DiceSize)
Next
End Function
'UDF to generate a skill from the MOS Table
Function MOSSkill(ArmOfService, TechLevel)
Roll = Dice(1, 6)
If TechLevel = 2 Then Roll = Roll + 1 'TL-11 or less = 1; TL-12+ = 2
MOSSkill = WorksheetFunction.VLookup((WorksheetFunction.VLookup(Roll, (Range(Cells(4, 2), Cells(10, 8))), ArmOfService, False)), (Range(Cells(9, 32), Cells(39, 33))), 2, False)
End Function
Sub MercOne()
Randomize
Dim Merc(86)
45 For i = 1 To 86
Merc(i) = 0
Next
TechLevel = Dice(1, 2)
Roll = Dice(2, 6)
If Merc(2) >= 6 Then Roll = Roll + 1
If Merc(3) >= 5 Then Roll = Roll + 2
If Roll < 5 Then GoTo 45
ArmOfService = Dice(1, 4)
If ArmOfService = 4 Then
ArmOfService = ArmOfService + 2
Else: ArmOfService = ArmOfService + 1
End If
'Array Check 1
For i = 7 To 37
Debug.Print Merc(i); ",";
Next
Debug.Print
Merc(MOSSkill(ArmOfService, TechLevel)) = Merc(MOSSkill(ArmOfService, TechLevel)) + 1
'Array Check 2
For i = 7 To 37
Debug.Print Merc(i); ",";
Next
Debug.Print
End Sub
答案 0 :(得分:1)
有一个概率为1/6,当MOSSkill运行时,它会增加Roll,这会影响查找。
因此,当您通过
访问阵列时Merc(MOSSkill(ArmOfService, TechLevel))
然后递增
Merc(MOSSkill(ArmOfService, TechLevel)) + 1
有可能第二个,不会引用与第一个相同的东西,所以你增加了错误的一个。
你需要:
temp=MOSSkill(ArmOfService, TechLevel)
Merc(temp)=Merc(temp)+1
这样他们将永远是相同的
您的代码有时会这样做:
(我在索引中添加+1或+0,因为那是MOSSkill所做的)
Merc(1)=Merc(1)+1; //Merc(1+0)=Merc(1+0)+1
Merc(3)=Merc(2)+1; //Merc(2+1)=Merc(2+0)+1
Merc(4)=Merc(3)+1; //Merc(3+1)=Merc(3+0)+1
Merc(5)=Merc(5)+1; //Merc(4+1)=Merc(4+1)+1
像那样。所以在这种情况下,Merc(4)是2