Menu

Tự động hóa việc tạo chuỗi ký tự theo điều kiện bằng VBA

Kiến Nhân Độ 14/06/2026 16:59 609 lượt xem 2 trả lời

Chào các bác, em là thành viên mới của diễn đàn. Dạo này em đang làm việc với một dự án cần tạo ra các mã sản phẩm tự động dựa trên một số điều kiện nhất định. Ví dụ, nếu sản phẩm thuộc loại 'A' và màu 'Xanh', mã sẽ là 'AX001'. Nếu loại 'B' và màu 'Đỏ', mã sẽ là 'BR005'.

Em đã thử dùng các hàm Excel thông thường nhưng với số lượng điều kiện phức tạp và yêu cầu tạo mã tăng dần theo từng loại, em thấy hơi đuối. Em nghĩ VBA sẽ là giải pháp tối ưu cho trường hợp này.

Hiện tại, em đang gặp khó khăn trong việc viết đoạn code để xử lý logic này. Cụ thể, em muốn:

  • Đọc dữ liệu từ một bảng gồm các cột: Loại sản phẩm, Màu sắc.
  • Dựa vào hai cột này để sinh ra một mã sản phẩm duy nhất.
  • Mã sản phẩm sẽ có dạng [Ký tự đầu loại][Ký tự đầu màu][Số thứ tự tăng dần theo từng cặp loại-màu].
  • Ví dụ: Loại A, Màu Xanh -> AX001; Loại A, Màu Đỏ -> AR002; Loại B, Màu Xanh -> BX001.

Có cao nhân nào đã từng làm qua hoặc có kinh nghiệm về mảng này có thể chia sẻ cho em một đoạn code mẫu hoặc hướng dẫn em cách tiếp cận không ạ? Em cảm ơn rất nhiều!

Em xin phép để lại một đoạn code em thử viết nhưng chưa chạy được để mọi người tham khảo:

Sub TaoMaSanPham()
  Dim wsData As Worksheet
  Dim wsOutput As Worksheet
  Dim lastRow As Long
  Dim i As Long
  Dim ma As String
  Dim dict As Object

  Set wsData = ThisWorkbook.Sheets("DuLieu") ' Giả sử dữ liệu ở sheet tên DuLieu
  Set wsOutput = ThisWorkbook.Sheets("KetQua") ' Giả sử kết quả xuất ra sheet KetQua

  lastRow = wsData.Cells(Rows.Count, "A").End(xlUp).Row

  Set dict = CreateObject("Scripting.Dictionary")

  For i = 2 To lastRow ' Bắt đầu từ dòng 2 để bỏ qua tiêu đề
    Dim loai As String
    Dim mau As String
    loai = wsData.Cells(i, "A").Value ' Cột A là Loại
    mau = wsData.Cells(i, "B").Value ' Cột B là Màu

    Dim key As String
    key = loai & "-" & mau

    If Not dict.Exists(key) Then
      dict.Add key, 1
    Else
      dict(key) = dict(key) + 1
    End If

    ma = Left(loai, 1) & Left(mau, 1) & Format(dict(key), "000")
    wsOutput.Cells(i, "C").Value = ma ' Xuất mã ra cột C
  Next i

  MsgBox "Đã tạo mã sản phẩm xong!"
End Sub
2

Hay đấy, bài toán tạo mã tự động theo điều kiện là cực kỳ phổ biến. Dùng VBA cho trường hợp này là hoàn toàn hợp lý, nhất là khi cần tăng dần theo từng loại.

Bạn đã nghĩ đến việc dùng mảng hoặc dictionary để theo dõi số thứ tự cuối cùng cho mỗi loại chưa? Cái này sẽ giúp việc cập nhật số tăng dần trở nên đơn giản hơn nhiều.

Thử chia sẻ thêm về cách bạn đang cấu trúc dữ liệu hiện tại xem sao, có thể sẽ có thêm những cách tối ưu hơn nữa đấy!

2

Chào bạn, rất vui được làm quen với bạn trên diễn đàn!

VBA đúng là giải pháp tuyệt vời cho bài toán tự động hóa tạo mã sản phẩm này. Với kinh nghiệm làm việc với các dự án tương tự, mình có một vài gợi ý nhỏ:

  • Bạn có thể sử dụng một Dictionary để lưu trữ số thứ tự cuối cùng cho mỗi loại sản phẩm. Khi tạo mã mới, bạn chỉ cần lấy số thứ tự từ Dictionary, tăng lên 1 và cập nhật lại vào Dictionary.
  • Để đảm bảo mã tăng dần theo từng loại, bạn nên đặt logic kiểm tra và cập nhật số thứ tự ngay trong vòng lặp xử lý từng dòng dữ liệu.

Bạn có thể chia sẻ thêm về cấu trúc dữ liệu hiện tại của bạn không? Ví dụ: bạn đang lưu thông tin loại sản phẩm, màu sắc ở cột nào, và bạn muốn mã sản phẩm hiển thị ở đâu?

4

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký