TẠO CODE VBA CHẠY HIỂN THỊ CÁC CHỮ CÁI NGẪU NHIÊN KHÔNG TRÙNG TRONG CÁC TRƯỜNG HỢP

Liên hệ QC

duong22000

Thành viên thường trực
Tham gia
8/5/13
Bài viết
322
Được thích
23
Em có một trường hợp lấy một danh sách tương ứng với các các chữ cái A, B, C, D, … trong các trường hợp (9 trường hợp) hiển thị
Yêu cầu: Các chữ cái A, B, C, D, ... xuất hiện không trùng nhau theo hàng dọc và không trùng nhau ở hàng ngang trong 9 trường hợp trên
Em có gửi file mẫu ví dụ để các bác trên GPE giúp đỡ viết đoạn code VBA chạy thực hiện yêu cầu trên. Em xin cảm ơn GPE!
 

File đính kèm

  • DS_chucaingaunhien.xlsx
    11.9 KB · Đọc: 14
Em có một trường hợp lấy một danh sách tương ứng với các các chữ cái A, B, C, D, … trong các trường hợp (9 trường hợp) hiển thị
Yêu cầu: Các chữ cái A, B, C, D, ... xuất hiện không trùng nhau theo hàng dọc và không trùng nhau ở hàng ngang trong 9 trường hợp trên
Em có gửi file mẫu ví dụ để các bác trên GPE giúp đỡ viết đoạn code VBA chạy thực hiện yêu cầu trên. Em xin cảm ơn GPE!
Tức là ban có danh sách chữ cái không trùng nhau ở cột M, rồi từ cái danh sách đó lập ra danh sách ngẫu nhiên theo 9 trường hợp mà giá trị trong các cột và các hàng tương ứng không trùng hả
 
Tức là ban có danh sách chữ cái không trùng nhau ở cột M, rồi từ cái danh sách đó lập ra danh sách ngẫu nhiên theo 9 trường hợp mà giá trị trong các cột và các hàng tương ứng không trùng hả
Mình cảm ơn bạn đã quan tâm.
Việc lấy nguồn chữ cái ở cột M hay ở đâu cũng dk. Miễn là khi chạy code thì các chữ cái đó được sắp xếp vào 9 trường hợp không trùng trong 1 cột và không trùng trong 1 hàng
 
Vầy được không vậy, chủ bài đăng:

STTHọ và tênTH 01TH 02TH 03TH 04TH 05TH 06TH 07TH 08TH 09Ghi chú
1Hoàng Ninh Linh12625242322212019
A
2Lê Ngọc Khánh Linh212625
B​
3Nguyễn Phước Lộc32126
C​
4Đặng Thị Thu Mai4321
D​
5Nguyễn Nhật Mai543
E​
6Đoàn Ngọc Minh654
F​
7Lê Tuấn Minh765
G​
8Nguyễn Thị Ngọc Minh876
H​
9Nguyễn Trần Nhật Nam987
I​
10Phạm Lê Ngọc Nhi1098
J​
11Nguyễn Trung Thành Phát11109
K​
12Phạm Gia Phát121110
L​
13Vũ Mai Phương131211
M​
14Vũ Nguyễn Hà Phương141312
N​
15Bùi Ngọc Quang151413
O​
16Trần Minh Quang161514
P​
17Lê Mạnh Quân171615
Q​
18Trần Lê Hồng Sơn181716
R​
19Trần Đỗ Minh Tâm191817
S​
20Trần Thanh Tâm201918
T​
21Vũ Huy Thành212019
U​
22Lê Nguyễn Hiếu Thảo222120
V​
23Bùi Nhật Thiên232221
W​
24Nguyễn Thủy Tiên242322
X​
25Hà Lê Minh Trang252423
Y​
 
Vầy được không vậy, chủ bài đăng:

STTHọ và tênTH 01TH 02TH 03TH 04TH 05TH 06TH 07TH 08TH 09Ghi chú
1Hoàng Ninh Linh12625242322212019
A
2Lê Ngọc Khánh Linh212625
B​
3Nguyễn Phước Lộc32126
C​
4Đặng Thị Thu Mai4321
D​
5Nguyễn Nhật Mai543
E​
6Đoàn Ngọc Minh654
F​
7Lê Tuấn Minh765
G​
8Nguyễn Thị Ngọc Minh876
H​
9Nguyễn Trần Nhật Nam987
I​
10Phạm Lê Ngọc Nhi1098
J​
11Nguyễn Trung Thành Phát11109
K​
12Phạm Gia Phát121110
L​
13Vũ Mai Phương131211
M​
14Vũ Nguyễn Hà Phương141312
N​
15Bùi Ngọc Quang151413
O​
16Trần Minh Quang161514
P​
17Lê Mạnh Quân171615
Q​
18Trần Lê Hồng Sơn181716
R​
19Trần Đỗ Minh Tâm191817
S​
20Trần Thanh Tâm201918
T​
21Vũ Huy Thành212019
U​
22Lê Nguyễn Hiếu Thảo222120
V​
23Bùi Nhật Thiên232221
W​
24Nguyễn Thủy Tiên242322
X​
25Hà Lê Minh Trang252423
Y​
cảm ơn bác!
Hình như bác định làm là cho số ngẫu nhiên từ 1 đến 26 ở mỗi cột (nhưng không được trùng ở hàng ngang) sau đó dùng hàm Vlookup để dò tìm chữ cái tương ứng (số lấy ở cột A, dò tìm tương ứng chữ cái ở cột M để điền vào bảng)
Và ta phải làm thêm 1 bảng phụ nữa sau đó cho hiển thị ở bảng khác, có đúng không bác?
 
Lần chỉnh sửa cuối:
cảm ơn bác!
Hình như bác định làm là cho số ngẫu nhiên từ 1 đến 26 ở mỗi cột (nhưng không được trùng ở hàng ngang) sau đó dùng hàm Vlookup để dò tìm chữ cái tương ứng (số lấy ở cột A, dò tìm tương ứng chữ cái ở cột M để điền vào bảng)
Và ta phải làm thêm 1 bảng phụ nữa sau đó cho hiển thị ở bảng khác, có đúng không bác?
C5 gõ công thức, kéo hết bảng:
Mã:
=CHAR(MOD(ROW(A1)+COLUMN()-4,26)+65)
 
Macro của bạn tham khảo dây:
PHP:
Sub GanKiTuNgau()
Const Alf As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim J As Integer, W As Long
Dim StrC As String
Dim Cls As Range
For J = 1 To 10
    StrC = StrC & Alf
Next J
Randomize:                          J = 9 + 13 * Rnd() \ 1
StrC = Mid(StrC, J, Len(StrC)) & Left(StrC, J - 1)
For Each Cls In Range("D2:L26")
    W = W + 1
    Cls.Value = Mid(StrC, W, 1)
Next Cls
End Sub

Thí dụ 1 kết quả qua lần chạy nào đó như sau:

STTHọ và tênTH 01TH 02TH 03TH 04TH 05TH 06TH 07TH 08TH 09GC
1BNQ00Bùi Ngọc QuangEFGHIJKLM
2BNT00Bùi Nhật ThiênNOPQRSTUV
3FNM00Đoàn Ngọc MinhWXYZABCDE
4FTM00Đặng Thị Thu MaiFGHIJKLMN
5HMT00Hà Lê Minh TrangOPQRSTUVW
6HNL00Hoàng Ninh LinhXYZABCDEF
7LHT00Lê Nguyễn Hiếu ThảoGHIJKLMNO
8LKL00Lê Ngọc Khánh LinhPQRSTUVWX
9LMQ00Lê Mạnh QuânYZABCDEFG
10LTM00Lê Tuấn MinhHIJKLMNOP
11NNM00Nguyễn Nhật MaiQRSTUVWXY
12NNM01Nguyễn Thị Ngọc MinhZABCDEFGH
13NNN00Nguyễn Trần Nhật NamIJKLMNOPQ
14NPL00Nguyễn Phước LộcRSTUVWXYZ
15NTP00Nguyễn Trung Thành PhátABCDEFGHI
16NTT00Nguyễn Thủy TiênJKLMNOPQR
17PGP00Phạm Gia PhátSTUVWXYZA
18PNN00Phạm Lê Ngọc NhiBCDEFGHIJ
19THS00Trần Lê Hồng SơnKLMNOPQRS
20TMQ00Trần Minh QuangTUVWXYZAB
21TMT00Trần Đỗ Minh TâmCDEFGHIJK
22TTT00Trần Thanh TâmLMNOPQRST
23VHP00Vũ Nguyễn Hà PhươngUVWXYZABC
24VHT00Vũ Huy ThànhDEFGHIJKL
25VMP00Vũ Mai PhươngMNOPQRSTU
 
Lần chỉnh sửa cuối:
Macro của bạn tham khảo dây:
PHP:
Sub GanKiTuNgau()
Const Alf As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim J As Integer, W As Long
Dim StrC As String
Dim Cls As Range
For J = 1 To 10
    StrC = StrC & Alf
Next J
Randomize:                          J = 1 + 13 * Rnd() \ 1
StrC = Mid(StrC, J, Len(StrC)) & Left(StrC, J - 1)
For Each Cls In Range("D2:L26")
    W = W + 1
    Cls.Value = Mid(StrC, W, 1)
Next Cls
End Sub

Thí dụ 1 kết quả qua lần chạy nào đó như sau:

STTHọ và tênTH 01TH 02TH 03TH 04TH 05TH 06TH 07TH 08TH 09GC
1BNQ00Bùi Ngọc QuangEFGHIJKLM
2BNT00Bùi Nhật ThiênNOPQRSTUV
3FNM00Đoàn Ngọc MinhWXYZABCDE
4FTM00Đặng Thị Thu MaiFGHIJKLMN
5HMT00Hà Lê Minh TrangOPQRSTUVW
6HNL00Hoàng Ninh LinhXYZABCDEF
7LHT00Lê Nguyễn Hiếu ThảoGHIJKLMNO
8LKL00Lê Ngọc Khánh LinhPQRSTUVWX
9LMQ00Lê Mạnh QuânYZABCDEFG
10LTM00Lê Tuấn MinhHIJKLMNOP
11NNM00Nguyễn Nhật MaiQRSTUVWXY
12NNM01Nguyễn Thị Ngọc MinhZABCDEFGH
13NNN00Nguyễn Trần Nhật NamIJKLMNOPQ
14NPL00Nguyễn Phước LộcRSTUVWXYZ
15NTP00Nguyễn Trung Thành PhátABCDEFGHI
16NTT00Nguyễn Thủy TiênJKLMNOPQR
17PGP00Phạm Gia PhátSTUVWXYZA
18PNN00Phạm Lê Ngọc NhiBCDEFGHIJ
19THS00Trần Lê Hồng SơnKLMNOPQRS
20TMQ00Trần Minh QuangTUVWXYZAB
21TMT00Trần Đỗ Minh TâmCDEFGHIJK
22TTT00Trần Thanh TâmLMNOPQRST
23VHP00Vũ Nguyễn Hà PhươngUVWXYZABC
24VHT00Vũ Huy ThànhDEFGHIJKL
25VMP00Vũ Mai PhươngMNOPQRSTU
Hay quá. Em cảm ơn bác SA_DQ ! Em đã áp dụng được vào file của mình.
 
Chủ bài đăng nên xem lại nội qui lần nữa & tự chỉnh tiêu đề theo qui định đi nha!
 
Em có một trường hợp lấy một danh sách tương ứng với các các chữ cái A, B, C, D, … trong các trường hợp (9 trường hợp) hiển thị
Yêu cầu: Các chữ cái A, B, C, D, ... xuất hiện không trùng nhau theo hàng dọc và không trùng nhau ở hàng ngang trong 9 trường hợp trên
Em có gửi file mẫu ví dụ để các bác trên GPE giúp đỡ viết đoạn code VBA chạy thực hiện yêu cầu trên. Em xin cảm ơn GPE!
Chạy code lấy các giá trị có số ký tự bất kỳ
Mã:
Sub XYZ()
  Dim sArr(), aRow, aCol, Res(), sRow&, sCol&, i&, j&

  sCol = 9
  With Sheets("DS")
    sArr = .Range("M5", .Range("M" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  If sCol > sRow Then sCol = sRow
  ReDim Res(1 To sRow, 1 To sCol)
  aCol = UniqueRand(sRow)
  aRow = UniqueRand(sRow)
  For i = 1 To sRow
    For j = 1 To sCol
      Res(i, j) = sArr(((aRow(i) + aCol(j)) Mod sRow) + 1, 1)
    Next j
  Next i
  Sheets("DS").Range("C5").Resize(sRow, sCol) = Res
End Sub

Function UniqueRand(ByVal N As Long) As Variant
  Dim Arr&(), i&, RndNum&, tmp&
  ReDim Arr(1 To N)
  Randomize
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If Arr(RndNum) = 0 Then tmp = RndNum Else tmp = Arr(RndNum)
    If Arr(N) = 0 Then Arr(RndNum) = N Else Arr(RndNum) = Arr(N)
    Arr(N) = tmp
    N = N - 1
  Next i
  UniqueRand = Arr
End Function
 
Lần chỉnh sửa cuối:
Chạy code lấy các giá trị có số ký tự bất kỳ
Mã:
Sub XYZ()
  Dim sArr(), aRow, aCol, Res(), sRow&, sCol&, i&, j&

  sCol = 9
  With Sheets("DS")
    sArr = .Range("M5", .Range("M" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  If sCol > sRow Then sCol = sRow
  ReDim Res(1 To sRow, 1 To sCol)
  aCol = UniqueRand(sRow)
  aRow = UniqueRand(sRow)
  For i = 1 To sRow
    For j = 1 To sCol
      Res(i, j) = sArr(((aRow(i) + aCol(j)) Mod sRow) + 1, 1)
    Next j
  Next i
  Sheets("DS").Range("C5").Resize(sRow, sCol) = Res
End Sub

Function UniqueRand(ByVal N As Long) As Variant
  Dim Arr&(), i&, RndNum&, tmp&
  ReDim Arr(1 To N)
  Randomize
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If Arr(RndNum) = 0 Then tmp = RndNum Else tmp = Arr(RndNum)
    If Arr(N) = 0 Then Arr(RndNum) = N Else Arr(RndNum) = Arr(N)
    Arr(N) = tmp
    N = N - 1
  Next i
  UniqueRand = Arr
End Function
Em đã test thử code của bác. Kết quả cho đúng các chữ cái không trùng nhau ở cột và hàng. Em cảm ơn bác đã quan tâm và giúp đỡ ạ.
 
Mã:
Function UniqueRand(ByVal N As Long) As Variant
...
Đúng tiếng Anh gọi hành động này là "shuffle" hoặc "reshuffle" (xáo trộn thứ tự, điển hình: xào bài)

Function RndShuffle(n As Long)
' returns an array of randomly shuffled numbers from 1 to n
' note: call a randomize beforehand if you need true random
...
End Function
 
Web KT
Back
Top Bottom