Tạo Unique ID, GUID trong Excel

Liên hệ QC

kuldokk

Thành viên hoạt động
Tham gia
12/10/07
Bài viết
149
Được thích
165
Giới tính
Nam
Nghề nghiệp
CEO
Trong quá trình sử dụng Excel, sẽ có lúc bạn muốn tạo ra một cái tên, một địa chỉ duy nhất, địa chỉ này chỉ có một và không bao giờ lặp lại, địa chỉ này không chứa thông tin gì khác và chỉ nhằm mục đích phân biệt giữa các dòng trong Excel chẳng hạn. Làm thế nào để chúng ta có thể tạo ra 1 địa chỉ như vậy ở trong Excel?

Mỗi thời điểm đều là duy nhất, với suy nghĩ như vậy, ở trong Excel chúng ta có thể đơn giản dùng hàm sau đây để tạo thành 1 ID duy nhất:

="ID" & TEXT(NOW(),"yyyymmddhhmmss")


Ở đây, các bạn có thể tuỳ ý thay phần ID. Nhưng nếu dữ liệu của chúng ta được thêm vào nhanh hơn 1 giây đồng hồ, thì cách này sẽ không dùng được!

Cái chúng ta cần ở đây là GUID - Globally Unique Identifier

Một GUID có dạng như sau:

3F2504E0-4F89-41D3-9A0C-0305E82C3301

hoặc

3F2504E04F8941D39A0C0305E82C3301


hoặc

{3F2504E0-4F89-41D3-9A0C-0305E82C3301}

Nếu ai hay nghịch Windows Registry chắc hẳn đã có lần nhìn thấy những dãy số tương tự như thế này rồi. Theo sách nói thì một GUID không hẳn sẽ là duy nhất, nhưng tỉ lệ có 2 GUID trùng nhau vào khoảng 1/2^122 - nếu bạn hiểu con số này nhỏ đến mức nào và tổng số GUID nhiều đến mức nào khi so sánh với việc trên 1 Excel Sheet phiên bản 2010 có khoảng 2^34 ô.

Tin vui là chúng ta hoàn toàn có thể tạo ra GUID trong Excel bằng 2 cách với 1 chút giúp đỡ của VBA như sau

Mã:
''''''''''''''''''''''''''''''''''''
' http://hocexcel.online
' source for createGUID: http://www.cpearson.com/excel/CreateGUID.aspx
' source for genGUID: http://stackoverflow.com/questions/7031347/how-can-i-generate-guids-in-excel
''''''''''''''''''''''''''''''''''''


Option Explicit


''''''''''''''''''''''''''''''''''''


Private Declare Function CoCreateGuid Lib "OLE32.DLL" (pGuid As GUID) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long


''''''''''''''''''''''''''''''''''''


Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type


''''''''''''''''''''''''''''''''''''


Public Function genGUID()
    genGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36)
End Function


''''''''''''''''''''''''''''''''''''


Function genID() As String
    genID = Format(Now, "yymmddhhmmss")
End Function


''''''''''''''''''''''''''''''''''''


Public Function CreateGUID() As String
    Dim G As GUID
    With G
    If (CoCreateGuid(G) = 0) Then
    CreateGUID = _
        String$(8 - Len(Hex$(.Data1)), "0") & Hex$(.Data1) & _
        String$(4 - Len(Hex$(.Data2)), "0") & Hex$(.Data2) & _
        String$(4 - Len(Hex$(.Data3)), "0") & Hex$(.Data3) & _
        IIf((.Data4(0) < &H10), "0", "") & Hex$(.Data4(0)) & _
        IIf((.Data4(1) < &H10), "0", "") & Hex$(.Data4(1)) & _
        IIf((.Data4(2) < &H10), "0", "") & Hex$(.Data4(2)) & _
        IIf((.Data4(3) < &H10), "0", "") & Hex$(.Data4(3)) & _
        IIf((.Data4(4) < &H10), "0", "") & Hex$(.Data4(4)) & _
        IIf((.Data4(5) < &H10), "0", "") & Hex$(.Data4(5)) & _
        IIf((.Data4(6) < &H10), "0", "") & Hex$(.Data4(6)) & _
        IIf((.Data4(7) < &H10), "0", "") & Hex$(.Data4(7))
    End If
    End With
End Function


''''''''''''''''''''''''''''''''''''


Sub TickBenchmark()


Dim Start_gen As Long
Dim Finish_gen As Long
Dim Start_create As Long
Dim Finish_create As Long
'genGUID
Start_gen = GetTickCount()


Sheet1.Range("A1:A" & Sheet1.Range("H2").Value2).Formula = "=genGUID()"


Finish_gen = GetTickCount()


'createGUID
Start_create = GetTickCount()


Sheet1.Range("B1:B" & Sheet1.Range("H2").Value2).Formula = "=CreateGUID()"


Finish_create = GetTickCount()
 
MsgBox "(Col A) gen    method : " & CStr((Finish_gen - Start_gen) / 1000) & vbNewLine & _
       "(Col B) create method : " & CStr((Finish_create - Start_create) / 1000)
End Sub

Trong đoạn code trên, có 2 cách để tạo ra GUID là sử dụng hàm genGUID() và hàm CreateGUID(). Để cho các bạn dễ chọn lựa hàm nào khi sử dụng vào 1 project của các bạn thì mình đã thêm vào 1 benchmark nhỏ để đánh giá tốc độ của 2 hàm này. Nếu muốn biết kết quả benchmark và xem hàm nào phù hợp hơn cho nhu cầu của bạn, https://dl.dropboxusercontent.com/u/22049094/Excel Tuttorials/VBA create GUID.xlsm

Lưu ý: môi trường chạy benchmark là Excel 2010.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom