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
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.
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: