当同时抽奖的人数和未中奖的剩余人数一样多时,程序不响应.
Private Sub Timer1_Timer()
    Dim ArrAllRY() As String    '未中奖人员
    Dim ArrZJRY() As Integer '抽中人员
    Dim nNum As Integer '抽奖人数
    Dim nAllNum As Integer '总人数
    Dim i As Integer
    Dim j As Integer
    Dim n As Integer
    
    Dim b As Boolean
    Dim b2 As Boolean
   
    Timer1.Enabled = False
    For i = 0 To nNum - 1
        Randomize
        b = True
        b2 = True
        Do While b2
            n = (nAllNum - 1) * Rnd()
            b = False
            For j = 0 To i
                If ArrZJRY(j) = n Then
                        
                    b = True
                     
                End If
            Next j
            b2 = b
        Loop
        ArrZJRY(i) = n
                       
        xm(i).Caption = ArrAllRY(ArrZJRY(i), 1) & "(" & ArrAllRY(ArrZJRY(i), 0) & ")"
     
    Next
 Timer1.Enabled = True
    cmd_start.Enabled = True
End Sub

解决方案 »

  1.   

    已经赋值了.
    nNum = txt_peo.Text  'txt_peo.text是同时抽取的人数
    这个是在"开始"按钮里面赋值的.然后再调用Timer1_Timer
      

  2.   


    Dim nNum As Integer '抽奖人数 
    这个不应该定义在这里,放到窗体代码的头部
      

  3.   


    就是这个代码."开始"按钮后就调用Timer1_Timer
      

  4.   

    Do While b2
        n = (nAllNum - 1) * Rnd() '<-1'
        B = False
        For j = 0 To i
            If ArrZJRY(j) = n Then '<-2'
                B = True
            End If
        Next j
        b2 = B
    Loop
    1)n 取值可以是 0
    2)如果没猜错的话 ArrZJRY(j) 默认值为 0,这样等于将 n 为 0 的情况排除了。
    当 nNum = nAllNum 时,要选出 nNum 个,可符合条件的只有 nNum-1 个,当然无法结束循环了。建议将 ArrZJRY 数组的所有成员初始化为 -1。
      

  5.   


    Private Sub cmd_start_Click()
            ReDim ArrZJRY(nNum - 1)
            Sleep 500
            readAllRY   '读取所有未中奖人员
            Timer1.Enabled = True
    End Sub"开始"按钮的代码
      

  6.   

    ReDim 后面用循环对 ArrZJRY(i) 逐个赋初始值 -1