Board logo

標題: [發問] excel vba 20個數字分組成4組(隨機) [打印本頁]

作者: tray1203    時間: 2014-12-4 12:30     標題: excel vba 20個數字分組成4組(隨機)

本帖最後由 GBKEE 於 2014-12-4 15:38 編輯

麻煩各位大大幫我解題(我還是初學者 T^T)
就是有1~20個數字,想隨機分組成4組
可請大大們提供您的撰寫方式嗎?(並稍加注解)

感謝各位的幫忙
作者: luhpro    時間: 2014-12-6 01:01

麻煩各位大大幫我解題(我還是初學者 T^T)
就是有1~20個數字,想隨機分組成4組
可請大大們提供您的撰寫方式 ...
tray1203 發表於 2014-12-4 12:30
  1. Sub nn()
  2.   Dim iI%, iJ%, iMax%, iGet% ' 定義整數
  3.   Dim sStr$ ' 字串
  4.   Dim vA(), vT() ' 陣列
  5.   
  6.   Randomize (Rnd) ' 初始化亂數
  7.   vA = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20) ' 宣告陣列包含每個數字 (1~20)
  8.   ReDim vT(4, 0) ' 設定標的陣列的初始大小
  9.   iMax = 20 ' 20 個數字
  10.   Do While iMax > 0 ' Do 迴圈開始,當計數值大於0則繼續執行迴圈
  11.     For iI = 0 To 4 ' For 迴圈開始,每組5個數字(0 ~ 4, 共4組)
  12.       iGet = Int((iMax - iI - 1 + 1) * Rnd + 1) ' 抓取下個數字
  13.       vT(iI, UBound(vT, 2)) = vA(iGet - 1) ' 存到標的陣列
  14.       For iJ = iGet To iMax - iI - 1
  15.         vA(iJ - 1) = vA(iJ) '  將該數字之後的元素依序填補上來
  16.       Next
  17.       If UBound(vA) > 0 Then f ' If 條件式開始(若尚未到最後一個數字)
  18.         ReDim Preserve vA(UBound(vA) - 1) ' 則陣列元素數量減 1
  19.       Else ' 否則
  20.         Erase vA ' 清除該陣列
  21.       End If ' If 條件式結束
  22.     Next  ' For 迴圈結束
  23.     If UBound(vT, 2) < 3 Then ReDim Preserve vT(4, UBound(vT, 2) + 1) ' 若尚未處理完成, 標的陣列新增存放下1組5 (0 ~ 4)個數字的空間
  24.     iMax = iMax - 5 ' 計數值減去1組的數量 (5)
  25.   Loop ' Do 迴圈結束
  26.   
  27.   sStr = "" ' 底下將各元素依序放入 sStr 變數內, 以便後續顯示隨機分組結果用
  28.   For iMax = 0 To 3 ' 4組設字
  29.     For iI = 0 To 4 ' 每組5個數字
  30.       If sStr <> "" Then
  31.         sStr = sStr & ", " & vT(iI, iMax) ' 非首次添加數字, 前面加上 , 做為數字的區隔
  32.       Else
  33.         sStr = vT(iI, iMax) ' 首次添加數字, 前面不加 ,
  34.       End If
  35.     Next
  36.     sStr = sStr & Chr(10) ' 1組數字添加完成, 加上換行字元
  37.   Next
  38.   MsgBox sStr
  39. End Sub
複製代碼

作者: ashan0418    時間: 2014-12-10 09:36

回復 1# tray1203
  1. Sub test()
  2.     Dim Ary(1, 19), Rng As Range
  3.     Cells.Clear
  4.     [a1] = "資料"
  5.     [b1] = "亂數排列"
  6.     For i = 0 To 19
  7.         Ary(0, i) = i + 1
  8.         Ary(1, i) = Int(Rnd() * 100) '取亂數值
  9.     Next
  10.    
  11.     With ActiveSheet
  12.         Set Rng = .[a2:b2].Resize(UBound(Ary, 2) + 1) '設定儲存格數
  13.         Rng.Value = Application.Transpose(Ary) '將Ary的陣列資料存入儲存格中
  14.         [a2:b2].Resize(UBound(Ary, 2) + 1).Select '選取儲存格的資料
  15.         Selection.Sort Key1:=Rng(2), Order1:=xlAscending, Header:=xlNo '依亂數由小至大排序
  16.     End With

  17.     For i = 1 To 4
  18.         Cells((i - 1) * 5 + 2, 1).Resize(5).Copy
  19.         Cells(i + 1, 4) = "第 " & i & " 組"
  20.         Cells(i + 1, 5).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
  21.         False, Transpose:=True '儲存格轉置
  22.     Next
  23. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)