Nhờ giúp hàm: ghép 5 số tự nhiên thành 1 số

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

mrjun80

Thành viên mới
Tham gia
30/3/23
Bài viết
29
Được thích
-1
Các bác chỉ giúp hàm ghép 5 số ngẫu nhiên từ 0 đến 9, thành 1 số có 5 chữ số
ví dụ: 0-1-2-3-4 thành các số: 01234, 02134, 12340, 14023, 23041, 24301, 30142, 42301.... (ko có 2 số trùng nhau cả ở đầu vào, lẫn kết quả ghép)
trên excel các số sẽ ở các cột từ A1:E1 , chuỗi các số ghép đc sẽ nằm ở cột F1:F999
xin cảm ơn
 
Các bác chỉ giúp hàm ghép 5 số ngẫu nhiên từ 0 đến 9, thành 1 số có 5 chữ số
ví dụ: 0-1-2-3-4 thành các số: 01234, 02134, 12340, 14023, 23041, 24301, 30142, 42301.... (ko có 2 số trùng nhau cả ở đầu vào, lẫn kết quả ghép)
trên excel các số sẽ ở các cột từ A1:E1 , chuỗi các số ghép đc sẽ nằm ở cột F1:F999
xin cảm ơn
Lấy tất cả kết quả chỉnh hợp chập k
Mã:
Option Explicit
Sub ChinhHopChap_K()
  Dim res$(), sRow$, N&, i&, id&, RndNum&, tmp$
  Const K& = 5 'So ky tu: 5

  sRow = Application.Fact(10) / Application.Fact(10 - K)
  ReDim res(1 To sRow, 1 To 1)
  Call DeQuy(res, K, id, Empty, 1, 0)
  Randomize 'Lay Ngau Nhien
  N = sRow
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    tmp = res(RndNum, 1)
    res(RndNum, 1) = res(N, 1)
    res(N, 1) = tmp
    N = N - 1
  Next i
  Range("F1").Resize(sRow) = res
End Sub

Sub DeQuy(arr, K, id, ByVal t$, ByVal j&, ByVal i&)
  For i = 0 To 9
    If InStr(1, t, CStr(i)) = 0 Then
      If j < K Then
        Call DeQuy(arr, K, id, t & i, j + 1, 0)
      Else
        id = id + 1
        arr(id, 1) = t & i
      End If
    End If
  Next i
End Sub
 
Upvote 0
Lấy tất cả kết quả chỉnh hợp chập k
Mã:
Option Explicit
Sub ChinhHopChap_K()
  Dim res$(), sRow$, N&, i&, id&, RndNum&, tmp$
  Const K& = 5 'So ky tu: 5

  sRow = Application.Fact(10) / Application.Fact(10 - K)
  ReDim res(1 To sRow, 1 To 1)
  Call DeQuy(res, K, id, Empty, 1, 0)
  Randomize 'Lay Ngau Nhien
  N = sRow
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    tmp = res(RndNum, 1)
    res(RndNum, 1) = res(N, 1)
    res(N, 1) = tmp
    N = N - 1
  Next i
  Range("F1").Resize(sRow) = res
End Sub

Sub DeQuy(arr, K, id, ByVal t$, ByVal j&, ByVal i&)
  For i = 0 To 9
    If InStr(1, t, CStr(i)) = 0 Then
      If j < K Then
        Call DeQuy(arr, K, id, t & i, j + 1, 0)
      Else
        id = id + 1
        arr(id, 1) = t & i
      End If
    End If
  Next i
End Sub

Cảm ơn Bác nhiều, e ko biết sài VBA, nên sẽ cố xem cách xủ lý.
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy tất cả kết quả chỉnh hợp chập k
Mã:
Option Explicit
Sub ChinhHopChap_K()
  Dim res$(), sRow$, N&, i&, id&, RndNum&, tmp$
  Const K& = 5 'So ky tu: 5

  sRow = Application.Fact(10) / Application.Fact(10 - K)
  ReDim res(1 To sRow, 1 To 1)
  Call DeQuy(res, K, id, Empty, 1, 0)
  Randomize 'Lay Ngau Nhien
  N = sRow
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    tmp = res(RndNum, 1)
    res(RndNum, 1) = res(N, 1)
    res(N, 1) = tmp
    N = N - 1
  Next i
  Range("F1").Resize(sRow) = res
End Sub

Sub DeQuy(arr, K, id, ByVal t$, ByVal j&, ByVal i&)
  For i = 0 To 9
    If InStr(1, t, CStr(i)) = 0 Then
      If j < K Then
        Call DeQuy(arr, K, id, t & i, j + 1, 0)
      Else
        id = id + 1
        arr(id, 1) = t & i
      End If
    End If
  Next i
End Sub
Đã chạy được rồi bác, nhưng nó lại ko như ý muốn, bác chỉ cách chỉnh cho đúng 5 số mà mình thay vào thôi, các số này thay đổi tuỳ chọn tuỳ lúc
Bài đã được tự động gộp:

Khi chạy theo code bác đưa, nó ra loạn xạ số chứ ko đúng như 5 số mình đã chọn thôi
 

File đính kèm

  • z4303550678564_e2e05106be7cf257b3f94a8dd421cb66.jpg
    z4303550678564_e2e05106be7cf257b3f94a8dd421cb66.jpg
    97.2 KB · Đọc: 18
  • SANH.xlsm
    12.3 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
. . . . . ., VÀ E LÀM TRÊN EXCEL NÊN MUỐN XIN HÀM GÌ ĐÓ CHO PHÙ HỢP. CHỨ CÁI NÀY E KO BIẾT XỬ LÝ SAO
(1) Bạn đăng yếu cầu trong mục 'Lập trình' nên nhận được hàm tự tạo là phải rồi
(2) Toàn bài viết chữ in là không nên hoàn toàn;
(3) Mình cũng xin lót dép & chờ sung rụng với bạn bằng công thức của Excel.
 
Upvote 0
(1) Bạn đăng yếu cầu trong mục 'Lập trình' nên nhận được hàm tự tạo là phải rồi
(2) Toàn bài viết chữ in là không nên hoàn toàn;
(3) Mình cũng xin lót dép & chờ sung rụng với bạn bằng công thức của Excel.
Cảm ơn bạn đã nhắc, tại mình... mình đã sửa, mong mọi ng bỏ qua ạ. Mình google cách chèn VBA vào excel, và đã chạy đc code của Bác ấy cho, nhg nó lại ko như ý, nó lên tất các số ngẫu nhiên, chứ ko phải chỉ 5 số như mình chọn
 
Upvote 0
Chuẩn chỉ yêu cầu rồi còn gì. Dao cắt thì gà ngỏm thôi.
"Các bác chỉ giúp hàm ghép 5 số ngẫu nhiên từ 0 đến 9, thành 1 số có 5 chữ số".
 
Upvote 0
Làm ăn bậy bạ. Chen ngang bài người khác hỏi tùm lum.

1682700632877.png

 
Upvote 0
Chuẩn chỉ yêu cầu rồi còn gì. Dao cắt thì gà ngỏm thôi.
"Các bác chỉ giúp hàm ghép 5 số ngẫu nhiên từ 0 đến 9, thành 1 số có 5 chữ số".
Trích dẫn thiếu:
trên excel các số sẽ ở các cột từ A1:E1 , chuỗi các số ghép đc sẽ nằm ở cột F1:F999
 
Upvote 0
Trích dẫn thiếu:
trên excel các số sẽ ở các cột từ A1:E1 , chuỗi các số ghép đc sẽ nằm ở cột F1:F999

Thiếu phần đó cũng đâu có làm sai lệch yêu cầu gì đâu anh.
Kết quả 5 số chọn ngẫu nhiên được ghi vào A1:E1.
Dãy số ghép ghi cột F, từ ô F1.

Đấy là chưa bắt lỗi cột từ A1:E1... đấy. Vì sai quá cơ bản nên bỏ phần đó lại.
 
Upvote 0
Bác @HieuCD giúp e nốt với ạ, tức là chỉ trong phạm vi 5 số mình chọn, như file e gửi thì sữ nhập liệu vào các ô A1:E1, thì kết quả sẽ chỉ bao gồm 5 số mihf nhập đó thôi, chứ ko phải là tất cả các số từ 0-9 ghép lại (dù khi nhập sẽ nhập ngẫu nhiên 5 số trong các số từ 0-9), cái này chắc do e diễn đạt ko chuẩn ^^. Chứ lắm cao thủ quá vào nói loạn xạ chả để làm gì
 

File đính kèm

  • z4303550678564_e2e05106be7cf257b3f94a8dd421cb66.jpg
    z4303550678564_e2e05106be7cf257b3f94a8dd421cb66.jpg
    97.2 KB · Đọc: 5
Upvote 0
Bác @HieuCD giúp e nốt với ạ, tức là chỉ trong phạm vi 5 số mình chọn, như file e gửi thì sữ nhập liệu vào các ô A1:E1, thì kết quả sẽ chỉ bao gồm 5 số mihf nhập đó thôi, chứ ko phải là tất cả các số từ 0-9 ghép lại (dù khi nhập sẽ nhập ngẫu nhiên 5 số trong các số từ 0-9), cái này chắc do e diễn đạt ko chuẩn ^^. Chứ lắm cao thủ quá vào nói loạn xạ chả để làm gì
Bạn nói cẩn thận. Bạn loạn xạ trước cho người ta viết tốn công mà không đúng ý.
 
Upvote 0
Mình có cách thủ công như sau:

5312453,124=A1*10000+B1*1000+C1*100+D1*10+E1
35,124=B1*10000+A1*1000+C1*100+D1*10+E1
13,524=C1*10000+B1*1000+A1*100+D1*10+E1
23,154=D1*10000+B1*1000+C1*100+A1*10+E1
43,125=E1*10000+B1*1000+C1*100+D1*10+A1
. . .. .
. . . . .
. . . . .


Chuyện còn lại là tạo 5 số ngẫu nguyên dương bé hơn 10 tại [A1:E1] bằng macro sau:

PHP:
Sub Tao5SoNgauBeHon10()
 Dim W As Byte, J As Byte, Num As Integer
 Dim StrC As String
 
 Randomize
 For J = 1 To 9
    W = 7 + 3 * Rnd() \ 1
    If W Mod 2 = 0 Then
        StrC = StrC & CStr(J)
    Else
        StrC = CStr(J) & StrC
    End If
 Next J
 For J = 3 To 7
    Num = Mid(StrC, J, 1)
    Cells(1, J - 2).Value = Num
    Cells(1, J - 2).Interior.ColorIndex = 34 + CInt(Num)
 Next J
End Sub
 
Upvote 0
Mình có cách thủ công như sau:

5312453,124=A1*10000+B1*1000+C1*100+D1*10+E1
35,124=B1*10000+A1*1000+C1*100+D1*10+E1
13,524=C1*10000+B1*1000+A1*100+D1*10+E1
23,154=D1*10000+B1*1000+C1*100+A1*10+E1
43,125=E1*10000+B1*1000+C1*100+D1*10+A1
. . .. .
. . . . .
. . . . .


Chuyện còn lại là tạo 5 số ngẫu nguyên dương bé hơn 10 tại [A1:E1] bằng macro sau:

PHP:
Sub Tao5SoNgauBeHon10()
 Dim W As Byte, J As Byte, Num As Integer
 Dim StrC As String
 
 Randomize
 For J = 1 To 9
    W = 7 + 3 * Rnd() \ 1
    If W Mod 2 = 0 Then
        StrC = StrC & CStr(J)
    Else
        StrC = CStr(J) & StrC
    End If
 Next J
 For J = 3 To 7
    Num = Mid(StrC, J, 1)
    Cells(1, J - 2).Value = Num
    Cells(1, J - 2).Interior.ColorIndex = 34 + CInt(Num)
 Next J
End Sub
Cảm ơn bạn, thủ công vậy nó cũng ko hết, vẫn phải chờ bác @HieuCD thôi, vì như bạn làm nó chỉ đc vài số, mình lấy ví dụ nếu làm đc đủ thì từ 1-2-3-4-5 phải đc kết quả là:
12345 13245 14235 15432 14523......
21345 25431 23451 21453 ....
32145 31254 34215 ....
45123 31235....
51234 ....
nhiều lắm chứ ko chỉ vài số như vậy, mình ko biết diễn đạt sao cho dễ hiểu, nên bị mấy ô kia bắt bẻ lọ chai, mob cũng vào khè, kinh thật ^^
Mong bác @HieuCD giúp nốt với ạ, đội ơn bác
 
Upvote 0
. . . .i vì như bạn làm nó chỉ đc vài số, mình lấy ví dụ nếu làm đc đủ thì từ 1-2-3-4-5 phải đc kết quả là:
12345 13245 14235 15432 14523......
....
....
....
....
(1) nhiều lắm chứ ko chỉ vài số như vậy, mình ko biết diễn đạt sao cho dễ hiểu, nên bị . . . . .
(1) Nhiều lắm nhưng số lượng là bao nhiêu, bạn có tính ra được không?
& Mình không khi nào có ý định làm thay để ra luôn đáp án cho bạn 1 cách đủ đầy
Tất nhiên với số nguyên liệu là 5 thì thành phẩm vẫn có thể viết thủ công ra được;

(2) & bạn còn chưa viết hết ra các kết quả mà lại yêu cầu mình làm ra hết kết quả cho bạn?!
(3) Cũng có thể cố gắng thì mình cũng sẽ có kết quả đầy đủ cho bạn, nhưng bạn phải chờ đến Tết CÔNG GÔ nha!
 
Upvote 0
nhiều lắm chứ ko chỉ vài số như vậy, mình ko biết diễn đạt sao cho dễ hiểu, nên bị mấy ô kia bắt bẻ lọ chai, mob cũng vào khè, kinh thật ^^
Tôi không khè ai hết nhé! Bạn nói năng diễn đạt không rõ ràng làm mất công người khác rồi phản ứng khi người khác góp ý là bạn sai. Tôi chỉ nhắc bạn cái sai khi vặc lại người góp ý.
5 số đảo đi đảo lại đó là hoán vị, toán lớp 10 mà không nhớ rồi nói lung tung cho mất công người ta.
 
Upvote 0
Đã chạy được rồi bác, nhưng nó lại ko như ý muốn, bác chỉ cách chỉnh cho đúng 5 số mà mình thay vào thôi, các số này thay đổi tuỳ chọn tuỳ lúc
Bài đã được tự động gộp:

Khi chạy theo code bác đưa, nó ra loạn xạ số chứ ko đúng như 5 số mình đã chọn thôi
Hoán vị 5 số chỉ cần dùng 5 vòng for lồng nhau
Dùng code chỉnh hợp với giới hạn 9 số và vùng A1:E1 phải và chỉ được nhập 1 ký tự
Mã:
Sub HoanVi()
  Dim arr(), res$(), sRow$, N&, i&, id&, j&, RndNum&, tmp$
  Const K& = 5 'So Phan tu
 
  sRow = Application.Fact(K)
  ReDim res(1 To sRow, 1 To 1)
  Call DeQuyHoanVi(res, K, id, Empty, 1, 0)
  Randomize 'Lay Ngau Nhien
  N = sRow
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    tmp = res(RndNum, 1)
    res(RndNum, 1) = res(N, 1)
    res(N, 1) = tmp
    N = N - 1
  Next i
  arr = Range("A1:E1")
  For i = 1 To sRow
    For j = 1 To K
      Mid(res(i, 1), j, 1) = arr(1, CLng(Mid(res(i, 1), j, 1)))
    Next j
  Next i
  Range("F1").Resize(sRow) = res
End Sub

Sub DeQuyHoanVi(arr, K, id, ByVal t$, ByVal j&, ByVal i&)
  For i = 1 To K
    If InStr(1, t, CStr(i)) = 0 Then
      If j < K Then
        Call DeQuyHoanVi(arr, K, id, t & i, j + 1, 0)
      Else
        id = id + 1
        arr(id, 1) = t & i
      End If
    End If
  Next i
End Sub
 
Upvote 0
Hoán vị 5 số chỉ cần dùng 5 vòng for lồng nhau
Góp vui
Mã:
Public Sub NamVongFor()
Dim a&, b&, c&, d&, e&, k&
Dim ta$, tb$, tc$, td$, te$
Dim arr As Variant, Rarr As Variant
arr = Range("A1:E1").Value
ReDim Rarr(1 To 1000000, 1 To 1)
For a = 1 To 5
 ta = arr(1, a)
    For b = 1 To 5
        If InStr(1, ta, arr(1, b)) = 0 Then
        tb = ta & arr(1, b)
        For c = 1 To 5
            If InStr(1, tb, arr(1, c)) = 0 Then
            tc = tb & arr(1, c)
            For d = 1 To 5
                If InStr(1, tc, arr(1, d)) = 0 Then
                td = tc & arr(1, d)
                For e = 1 To 5
                     If InStr(1, td, arr(1, e)) = 0 Then
                        k = k + 1
                        Rarr(k, 1) = td & arr(1, e)
                     End If
                Next e
                End If
            Next d
            End If
        Next c
        End If
    Next b
Next a
If k >= 1 Then Range("F1").Resize(k, 1) = Rarr

End Sub
 

File đính kèm

  • 5VongFor.xlsm
    18.3 KB · Đọc: 6
Upvote 0
Đã ngon lành rồi ạ, cảm ơn các bác @HieuCD và @Phuocam rất nhiều ạ, tuyệt vời ông mặt trời.
đội ơn các bác đã giúp ạ
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom