Tạo mã số gồm 4 chữ cái không trùng nhau (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

chau1001

Thành viên mới
Tham gia
20/4/14
Bài viết
5
Được thích
0
example.jpg
Chào mọi người, mình là người mới tập làm quen với VBA, hôm nay mình có câu hỏi này mong các bạn giúp đỡ mình:
Mình đang định tạo một Form để tạo mã số gồm 4 chữ cái ngẫu nhiên, không trùng nhau để mình có thể sử dụng mã để đặt tên. Mình xin mô tả sơ bộ như sau:
1. Mã số: Hiển thị giá trị gồm 4 chữ số (không được trùng với các mã đã có trong danh sách). Ngoài ra, ta có thể nhập một mã tùy ý và kiểm tra xem nó có trùng với các mã đã có hay không bằng cách nhấn nút kiểm tra.
2. Danh sách: Hiển thị các mã số đã được tạo( trong phần danh sách này, ta có thể nhấp vào một mã bất kì, và có thể xóa nó nếu muốn).
3. Tạo mã: Button để tạo ra mã
4. Kiểm tra: button kiểm tra mã khi ta muốn kiểm tra mã tự tạo.
5. Xóa: xóa mã đã chọn trong danh sách
6. Lưu: Lưu mã vào trong danh sách(phần này có thêm một yêu cầu là trước khi lưu, sẽ hiện lên một bản description về tên người tạo mã, mô tả thông tin về mã, mô tả sơ bộ về chi tiết…)
7. Thoát: end khỏi form
Mong các bạn và anh chị giúp đỡ mình, mình xin chân thành cảm ơn
 
Mã:
= fourRandomCapitalizedCharacters[B]()[/B]
Mã:
Function fourRandomCapitalizedCharacters[B]()[/B]
    Dim first[B],[/B] last As Integer
    first [B]=[/B] Asc[B]([/B]"A"[B])[/B]
    last [B]=[/B] Asc[B]([/B]"Z"[B])[/B]
    '
    Dim s As String
    '
    Dim c1[B],[/B] c2[B],[/B] c3[B],[/B] c4 As String
    c1 [B]=[/B] Chr[B]([/B]Int[B](([/B]last [B]-[/B] first [B]+[/B] [B]1[/B][B])[/B] [B]*[/B] Rnd [B]+[/B] [B]65[/B][B]))[/B]
    Do
        c2 [B]=[/B] Chr[B]([/B]Int[B](([/B]last [B]-[/B] first [B]+[/B] [B]1[/B][B])[/B] [B]*[/B] Rnd [B]+[/B] [B]65[/B][B]))[/B]
    Loop Until c1 [B]<>[/B] c2
    s [B]=[/B] c1 [B]&[/B] c2
    Do
        c3 [B]=[/B] Chr[B]([/B]Int[B](([/B]last [B]-[/B] first [B]+[/B] [B]1[/B][B])[/B] [B]*[/B] Rnd [B]+[/B] [B]65[/B][B]))[/B]
    Loop While InStr[B]([/B][B]1[/B][B],[/B] s[B],[/B] c3[B],[/B] vbTextCompare[B])[/B]
    s [B]=[/B] c1 [B]&[/B] c2 [B]&[/B] c3
    Do
        c4 [B]=[/B] Chr[B]([/B]Int[B](([/B]last [B]-[/B] first [B]+[/B] [B]1[/B][B])[/B] [B]*[/B] Rnd [B]+[/B] [B]65[/B][B]))[/B]
    Loop While InStr[B]([/B][B]1[/B][B],[/B] s[B],[/B] c4[B],[/B] vbTextCompare[B])[/B]
    fourRandomCapitalizedCharacters [B]=[/B] s [B]&[/B] c4
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
thành thật xin lỗi bạn, bạn có thể chỉ mình cách chạy function này k, mình mới làm quen với VBA nên nhiều cái còn gà lắm, thanks bạn
 
Upvote 0
Chào mọi người, mình là người mới tập làm quen với VBA, hôm nay mình có câu hỏi này mong các bạn giúp đỡ mình:
Mình đang định tạo một Form để tạo mã số gồm 4 chữ cái ngẫu nhiên, không trùng nhau để mình có thể sử dụng mã để đặt tên. Mình xin mô tả sơ bộ như sau:
1. Mã số: Hiển thị giá trị gồm 4 chữ số (không được trùng với các mã đã có trong danh sách). Ngoài ra, ta có thể nhập một mã tùy ý và kiểm tra xem nó có trùng với các mã đã có hay không bằng cách nhấn nút kiểm tra.
2. Danh sách: Hiển thị các mã số đã được tạo( trong phần danh sách này, ta có thể nhấp vào một mã bất kì, và có thể xóa nó nếu muốn).
3. Tạo mã: Button để tạo ra mã
4. Kiểm tra: button kiểm tra mã khi ta muốn kiểm tra mã tự tạo.
5. Xóa: xóa mã đã chọn trong danh sách
6. Lưu: Lưu mã vào trong danh sách(phần này có thêm một yêu cầu là trước khi lưu, sẽ hiện lên một bản description về tên người tạo mã, mô tả thông tin về mã, mô tả sơ bộ về chi tiết…)
7. Thoát: end khỏi form
Mong các bạn và anh chị giúp đỡ mình, mình xin chân thành cảm ơn
Ý bạn mã gồm 4 chữ cái không trùng ở đây là không trùng với những mã trong danh sách còn những mã như AAAA vẫn có thể hợp lệ phải không? Mình thử làm theo ý hiểu như vậy. Chương trình VBA đầu tiên, có gì sai sót các bạn góp ý nhé.
Mã:
dim min As Integer
Dim max As Integer
Dim i As Integer
Sub UserForm_Initialize()
min = Asc("A")
max = Asc("Z")
End Sub
Private Function check(ByVal abcd As String) As Boolean
For i = 0 To ListBox1.ListCount - 1
If abcd = ListBox1.List(i) Then
check = False
Exit Function
End If
Next i
check = True
End Function
Private Function checktextbox() As Boolean
Dim s As String
Dim c1 As Integer, c2 As Integer, c3 As Integer, c4 As Integer
s = TextBox1.Text
If Len(s) <> 4 Then GoTo sai
c1 = Asc(Left(s, 1))
c2 = Asc(Mid(s, 2, 1))
c3 = Asc(Mid(s, 3, 1))
c4 = Asc(Right(s, 1))
If c1 < min Or c1 > max Or c2 < min Or c2 > max Or c3 < min Or c3 > max Or c4 < min Or c4 > max Then GoTo sai
checktextbox = check(s)
Exit Function
sai:
checktextbox = False
End Function
Private Sub CommandButton1_Click()
Dim abcd As String, a As String
Do
abcd = ""
For i = 1 To 4
a = Chr(Int(Rnd * (max - min + 1) + min))
abcd = abcd & a
Next i
Loop Until check(abcd)
ListBox1.AddItem (abcd)
TextBox1.Text = abcd
End Sub


Private Sub CommandButton2_Click()
If checktextbox Then i = MsgBox("Ma hop le", vbOKOnly) Else i = MsgBox("Ma khong hop le hoac da su dung")
End Sub


Private Sub CommandButton3_Click()
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
ListBox1.RemoveItem (i)
Exit Sub
End If
Next i
End Sub


Private Sub CommandButton4_Click()
If checktextbox Then ListBox1.AddItem (TextBox1.Text) Else i = MsgBox("Ma khong hop le hoac da su dung")
End Sub


Private Sub CommandButton5_Click()
End
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Trước hết mình xin chân thành cảm ơn bạn đã bỏ thời gian quý báu để giúp đỡ mình.
Bài của bạn rất TỐT, tuy nhiên mình còn có một thắc mắc là:
Sau khi mình tắt chương trình đi, các giá trị mã số đã tạo trong chương trình sẽ biến mất, như vậy ta không có cách nào để lưu dữ liệu lại (VD: khi tạo một mã mới, ta muốn kiểm tra nó với các mã đã sử dụng trước đây thì ta làm sao?)
Mong các bạn giúp đỡ, cảm ơn các bạn nhiều
 
Upvote 0
Bạn Hau151978 ơi, với lại nhân tiện nhờ bạn chỉ dùm mình sau khi mình nhấn button THOÁT, có cách nào làm cho cửa sổ màn hình vẫn còn trên Excel hay k , k quay lại màn hình VB nữa. Thanks bạn nhiều
 
Upvote 0
Mình nghỉ tạo 4 vòng lặp là được mã 4 chữ cái không trùng nhau mà
Có điều là khi 1 vòng lăp nào đó vừa hết 26 chữ cái thì tăng vòng lặp ngoải thêm 1 đơn vị.
 
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Trước hết mình xin chân thành cảm ơn bạn đã bỏ thời gian quý báu để giúp đỡ mình.
Bài của bạn rất TỐT, tuy nhiên mình còn có một thắc mắc là:
Sau khi mình tắt chương trình đi, các giá trị mã số đã tạo trong chương trình sẽ biến mất, như vậy ta không có cách nào để lưu dữ liệu lại (VD: khi tạo một mã mới, ta muốn kiểm tra nó với các mã đã sử dụng trước đây thì ta làm sao?)
Mong các bạn giúp đỡ, cảm ơn các bạn nhiều
Mình bổ sung thêm nút Load để kiểm tra và load mã ở cột A trong sheet1, khi bấm nút thoát thì list lưu vào cột A, sửa một số lỗi của chương trình đã up trước.
 

File đính kèm

Upvote 0
Nếu mình là chủ topic, mình sẽ làm vầy

Viết hàm tự tạo để kiểm tra mã trước đó & dựa vô đó tạo ra mã mới với điều kiện tăng chữ cái cuối mã lên 1 thứ tự
Như

Mã Cũ|->|Mã mới
AAAA|->|AAAB
ABCZ|->|ABDA
AVZZ|->|AWAA
AZZZ|->|BAAA
%#^#$|->|,,,,,,,
 

File đính kèm

Upvote 0
Viết hàm tự tạo để kiểm tra mã trước đó & dựa vô đó tạo ra mã mới với điều kiện tăng chữ cái cuối mã lên 1 thứ tự
Như

Mã Cũ|->|Mã mới
AAAA|->|AAAB
ABCZ|->|ABDA
AVZZ|->|AWAA
AZZZ|->|BAAA
%#^#$|->|,,,,,,,
Yêu cầu của chủ topic là tạo mã ngẫu nhiên mà bạn, làm như bạn là có quy luật rồi.
 
Upvote 0
Không rõ ông chủ topic này muốn gì khi có cả việc tạo ngẫu nhiện & kiểm, xóa trùng , . . .

Nghĩa là ứng dụng để làm chi nữa?
 
Upvote 0
Viết hàm tự tạo để kiểm tra mã trước đó & dựa vô đó tạo ra mã mới với điều kiện tăng chữ cái cuối mã lên 1 thứ tự
...

Vì việc xoá mã là một trong những yêu cầu cho nên làm cách này một thời gian sẽ bị lỗ hổng tùm lum.

Không rõ ông chủ topic này muốn gì khi có cả việc tạo ngẫu nhiện & kiểm, xóa trùng , . . .

Nghĩa là ứng dụng để làm chi nữa?

Chủ thớt chỉ cốt ý làm bài tập. Tự ra một tư tưởng hay nào đó rồi thực hiện.

Ứng dụng thực tế thì có. Nhưng tôi nghĩ loại CSDL như chủ thớt muốn chưa đạt đủ trình độ ứng dụng.

tb. Nếu bạn thực sự muốn biết: một trong những lý do tạo mã số ngẫu nhiên thay vì liên tục là người tạo mã không muốn đưa ra sự thiên vị trước sau. Ví dụ tôi xét đơn cấp mã cho người ta làm gì đó, tôi không muốn người nhận mã lợi dụng nộp nhiều đơn cùng một lúc để lấy các mã gần nhau. Thậm chí người ta còn có thể đoán để lấy "mã đẹp".
 
Upvote 0

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

Back
Top Bottom