Đánh số thứ tự 10 triệu số, vừa chữ, vừa ký tự có điều kiện

Liên hệ QC
Cái này làm một lần rồi xong chứ đâu có phải làm đi làm lại
Không đâu bác,cái file kia mà các mã ghép là random rồi ghép lại thành chuỗi mã hoàn chỉnh thêm lọc trùng nữa là dùng được nhiều lần á
 
Mã có 3 đoạn.
Đoạn thứ nhất 222-999 -> 778 kiểu
Đoạn thứ nhì AAAA-ZZZZ -> 23^4 = 279841 kiểu (không có B, O, I thì chỉ còn 23 ký tự)
Đoạn thứ ba 222-999 -> 778 kiểu
Ráp 3 đoạn này lại thì được 23^4 * 778^2 kiểu

Công ty này lớn đến mức độ có hàng chục triệu mã hàng.

Bài toán này ăn 0,1 đồng một mã là đúng giá rồi.

Chú: không có O, I là do mã muốn tránh O trông giống 0 và I trông giống 1. Không rõ B tại sao lại phải tránh - giống 8?
Trời ơi, phục A sát đất, đó là tránh nhầm mã, do mã in nhỏ nên dễ nhầm
Bài đã được tự động gộp:

Mình tư duy như sau nhé:
- Có 10 số từ 0 đến 9 bỏ 0,1,8 còn 7 số
- Có 26 chữ cái bỏ B,O,I còn 23
=> 1 vị trí trong chuỗi ký tự của bạn có 30 cách chọn, vậy chuỗi ít nhất phải là 5 ký tư (do 30^4<10 triệu, 30^5 mới lớn hơn 10 triệu)
Bạn lập 1 bảng gồm 2 cột: STT---Ký tự
Lấy 1 ký tự ngẫu nhiên bằng hàm: VLOOKUP(RANDBETWEEN(1;30);$J$14:$K$43;2;0) trong đó $J$14:$K$43 là bảng nói trên
Bạn ghep 5 hoặc 6 ký tự nêu trên bằng ký tự &: =VLOOKUP(RANDBETWEEN(1;30);$J$14:$K$43;2;0)&VLOOKUP(RANDBETWEEN(1;30);$J$14:$K$43;2;0).....
Để các chuỗi không nhảy bạn copy value sang 1 cột khác
Cột bên cạnh bạn kiểm tra có lặp lại không bằng lệnh countif
Excel chỉ chạy dc khoảng 100k dòng thôi, và máy chạy rất nặng, bạn nên chia thành nhiều lần và copy value sang 1 file khác, vì hàm randbetween chạy liên tục rất nặng file
Mình gửi file ví dụ của mình, mong giúp được bạn
Em trân thành cám ơn bác đã bỏ chút thời gian giúp,
Bài đã được tự động gộp:

Code chạy khá nhanh, gán kết quả 10.000.000 ô khá chậm
Mã:
Sub Main()
  Dim aSo, aKT, stt() As String, stt2() As String, Res() As String
  Dim i&, i2&, i3&, k&, j&, sR&, sR2&
  Const N& = 10 ^ 6

  aSo = Array(, "2", "3", "4", "5", "6", "7", "9")
  aKT = Array(, "A", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", _
                  "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")

  stt = CH_L(aSo, 3)
  sR = UBound(stt)
  stt2 = CH_L(aKT, 4)
  sR2 = UBound(stt2)

  ReDim Res(1 To N, 1 To 10)
  j = 1
  For i = 1 To sR
    For i2 = 1 To sR2
      For i3 = 1 To sR
        If k = N Then k = 1: j = j + 1 Else k = k + 1
        If j = 11 Then
          Range("B2").Resize(N, 10) = Res
          Exit Sub
        End If
        Res(k, j) = stt(i, 1) & stt2(i2, 1) & stt(i3, 1)
      Next i3
    Next i2
  Next i
End Sub

Private Function CH_L(ByVal Arr As Variant, ByVal k&) As Variant
  Dim Res() As String, M&, i&, r&, j&, sRow&

  M = UBound(Arr)
  ReDim Res(1 To M ^ k, 1 To 1)
  sRow = 1:  r = 1
  Res(r, 1) = String(k, Arr(1))
  For N = k To 1 Step -1
    For j = 2 To M
      For i = 1 To sRow
        tmp = Res(i, 1)
        Mid(tmp, N, 1) = Arr(j)
        r = r + 1
        Res(r, 1) = tmp
      Next i
    Next j
    sRow = M * sRow
  Next N
  CH_L = Res
End Function
Em trân thành cám ơn Bác đã bỏ chút thời gian ra giúp
 
Lần chỉnh sửa cuối:
Code chạy khá nhanh, gán kết quả 10.000.000 ô khá chậm
Mã:
Sub Main()
  Dim aSo, aKT, stt() As String, stt2() As String, Res() As String
  Dim i&, i2&, i3&, k&, j&, sR&, sR2&
  Const N& = 10 ^ 6

  aSo = Array(, "2", "3", "4", "5", "6", "7", "9")
  aKT = Array(, "A", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", _
                  "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")

  stt = CH_L(aSo, 3)
  sR = UBound(stt)
  stt2 = CH_L(aKT, 4)
  sR2 = UBound(stt2)

  ReDim Res(1 To N, 1 To 10)
  j = 1
  For i = 1 To sR
    For i2 = 1 To sR2
      For i3 = 1 To sR
        If k = N Then k = 1: j = j + 1 Else k = k + 1
        If j = 11 Then
          Range("B2").Resize(N, 10) = Res
          Exit Sub
        End If
        Res(k, j) = stt(i, 1) & stt2(i2, 1) & stt(i3, 1)
      Next i3
    Next i2
  Next i
End Sub

Private Function CH_L(ByVal Arr As Variant, ByVal k&) As Variant
  Dim Res() As String, M&, i&, r&, j&, sRow&

  M = UBound(Arr)
  ReDim Res(1 To M ^ k, 1 To 1)
  sRow = 1:  r = 1
  Res(r, 1) = String(k, Arr(1))
  For N = k To 1 Step -1
    For j = 2 To M
      For i = 1 To sRow
        tmp = Res(i, 1)
        Mid(tmp, N, 1) = Arr(j)
        r = r + 1
        Res(r, 1) = tmp
      Next i
    Next j
    sRow = M * sRow
  Next N
  CH_L = Res
End Function
Em cám ơn Bác, thật sự là cái E cần. Bác zalo điện thoại j ko? tài khoảng NH j cũng đc? E gửi cf. Cám ơn Bác sâu sắc.
 
Em cám ơn Bác, thật sự là cái E cần. Bác zalo điện thoại j ko? tài khoảng NH j cũng đc? E gửi cf. Cám ơn Bác sâu sắc.
Giúp dược bạn là mình vui rồi, hiện nay số điện thoại và số tài khoản ngân hàng của mình đều không dùng được :)
 
Em trân thành cám ơn tất cả các AC,
cám ơn đặt biệt Bác HieuCD
------------
Đây là các con nhãn, mã in phiá sau nhãn (rider) để dán vào sản phẩm (xuất khẩu). Nhằm mục đích cho treo giải trúng mã thưởng.
Mục đích các mã này là giống như ở trên E đã trình bày. Do mã in nhỏ nên điều kiện là không có các con số: 0,1,8. Không có các ký tự : B,I,O > tránh nhìn nhầm.
---------
Đây chỉ là bước đầu ạ.
Em còn phải in, làm, ktr, cắt thành phẩm ....sao cho các thứ tự khi sản xuất không xáo trộn thay đổi mã (từ trên xuống dưới, không lộn xộn ấy).
Lúc sắp bài và loại tờ in không đạt ra phải làm dấu là mất mã nào nữa.
----------
10 triệu con mã này phải in theo thứ tự (không ngẫu nhiên) và phải quản lý chặt, in lỗi, mất mã phải làm thống kê và tờ khai.
---------
Một lần nữa, E trân thành cám ơn các AC và Bác HieuCD
 
Xác suất trúng thưởng khá cao đấy: 1/10.000.000
o_O
Xuất khẩu mờ. Ít hơn 10% chịu khó dự giải.
Muốn dự giải phải qua một đống thủ tục ghi danh qua mạng hoặc tin nhắn.
Chưa kể chuyện nhà tổ chức giải (bên bán hàng, tức là công ty của thớt) có đăng ký với quốc gia ấy hay không. Hầu hết các nước trên thế giới có bộ luật kiểm soát việc tổ chức giải khuyến mãi.
 
Bạn đập bể nồi cơm của người ta rồi. :p

Cái này làm một lần rồi xong chứ đâu có phải làm đi làm lại. Dẫu có mất vài tiếng đồng hồ cũng chả chết ai.
class Nguoi
2 {
3 public:
4 virtual void Chao() // Hàm ảo
5 {
6 cout << "Toi chua biet chao";
7 };
8 };
9 //------------------
10 class NguoiViet: public Nguoi
11 {
12 public:
13 void Chao()
14 {
15 cout << "Xin chao.";
16 }
17 };
18 //------------------
19 class NguoiAnh: public Nguoi
20 {
21 public:
22 void Chao()
23 {
24 cout << "Hello.";
25 }
26 };
27 //------------------
28 int main()
29 {
30 Nguoi *n; NguoiViet nv; NguoiAnh na;
31 n = &nv;
32 n->Chao(); // (*)
33 n = &na;
34 n->Chao(); // cùng dòng code voi (*) nhưng lại cho kết quả khác
35 return 0;
36 }
 
Web KT
Back
Top Bottom