检查不同的值VBA

时间:2014-04-27 01:01:37

标签: vba conditional-statements

我有一个do循环,我想继续循环,直到所有9个左右的值都是唯一的。

Do
     m1 = createManager
     m2 = createManager
     m3 = createManager
     m4 = createManager
     m5 = createManager
     m6 = createManager
     m7 = createManager
     m8 = createManager
     m9 = createManager
Loop Until m1 <> m2 <> m3 <> m4 <> m5 <> m6 <> m7 <> m8 <>m9 

这9个值是由一个从数组中获取随机索引值的函数创建的。

Function createManager() As Variant

    'Creates a random manager between the ages of 30 & 60
    Do
        Randomize Timer()
        pos = Int((UBound(arr2)) * Rnd + 1)
        age = arr2(pos)
    Loop Until age > 30 And age < 65

    'Assigns the appropiate mangerID to the manager
    managerID = arr(pos)

    createManager = managerID

End Function

我遇到的问题是循环直到部分。 m1&lt;&gt; m2&lt;&gt; m3&lt;&gt; m4&lt;&gt; m5&lt;&gt; m6&lt;&gt; m7&lt;&gt; m8&lt;&gt; m9是我作为占位符所拥有的,但有一种简单的方法可以在没有长IF AND语句的情况下编写它吗?

更新:目前正在探索收藏品,看看这是否会提供我所追求的......

3 个答案:

答案 0 :(得分:0)

这是一个函数,它将根据开始和结束年龄返回指定数量的经理年龄(分别使用30和65)。

这可能会也可能不会对您有所帮助。您的评论表明,您提出的问题还有很多。代码中没有作用域的公共变量,我不知道你正在做什么或试图用它们等等,因此,你真正的问题是什么,或者我们是怎么回事也许能够提供帮助。

祝你好运。

Sub Test()
Dim m as Variant

'Create 9 managers between 30 and 65
m = createManager(30, 65, 9)

End Sub

Function createManager(startAge As Integer, endAge As Integer, Optional numManagers As Integer = 1) As Variant
Dim dict As Object
If numManagers > (endAge - startAge) Then 
    createManager = CVerr(9)
    GoTo EarlyExit
End If

Set dict = CreateObject("Scripting.Dictionary")

Do
    dict(Application.WorksheetFunction.RandBetween(startAge, endAge)) = ""

Loop Until dict.Count = numManagers

createManager = dict.Keys()
Set dict = Nothing
EarlyExit:
End Function

答案 1 :(得分:0)

使用集合似乎是最好的方法,因为我无法在集合中添加非独特的键。在这种情况下,变量“控制”我所需要的所有管理人员数量,以便跨越和控制18个。即,没有经理可以拥有超过18名员工。

Do
    Call createManager
    on error resume next
    managercollection.Add managerID, CStr(managerID)
Loop Until managercollection.count = CInt(control)

创建经理的程序

Sub createManager()

    'Creates a random manager between the ages of 30 & 60
    Do
        Randomize Timer()
        pos = Int((UBound(arr2)) * Rnd + 1)
        age = arr2(pos)
    Loop Until age > 30 And age < 65

    'Assigns the appropiate mangerID to the manager
    managerID = arr(pos)

End Sub

答案 2 :(得分:0)

您可以使用Scripting.Dictionary,它可以为集合带来好处:

Dim dict As New Scripting.Dictionary
Do While dict.Count < 9
    dict(createManager) = 1 'arbitrary value
Loop