1

这是我的第一个重要的 VBA 程序,虽然我以前在 BASIC 的各种方言中使用过数组,并且在过去的三四个晚上都在研究 Walkenbach 的“Excel VBA for Dummies”,但我感到很困惑。

我预计会发现数组的一个元素的值增加了 1,并且在 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
4

1 回答 1

1

当 MOSSkill 运行时,有 1/6 的概率会增加 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

于 2013-11-07T00:18:31.557 回答