- ねらい:VBAで安全・簡単にUUID(GUID)を生成し、キー・ID管理を楽にする
- 最短で1件作る:Windows Script HostのTypeLibでGUID生成
- 書式整形:ハイフンあり/なし、波括弧の除去、URN形式
- 本格派:Win32 API CoCreateGuidでUUID v4生成(64ビット対応)
- .NETを使う方法:PowerShellのNew-GuidでUUID v4
- シート連携:A列にUUIDを一括付番、重複チェックも自動
- v5(名前ベース)UUID:名前空間+名前から安定的に同じIDを生成
- 大量生成・台帳化:指定件数のUUIDを作ってシートへ書く
- 落とし穴と対策
- まとめ:v4(ランダム)とv5(名前ベース)を使い分け、書式と一意性を“先に決める”
ねらい:VBAで安全・簡単にUUID(GUID)を生成し、キー・ID管理を楽にする
UUIDは世界中で重複しない識別子です。マスタ行の一意キー、ログのトレーサビリティ、外部連携のIDとして実務で大活躍します。Excel VBAでは「COMのGUID生成API」「Windows Script Host」「PowerShell/.NET」を使えば、貼ってすぐ安全に作れます。初心者向けに、最短コードから大量生成・書式整形・重複チェックまで、用途別テンプレートをかみ砕いて解説します。
重要ポイントの深掘り
- UUIDはバージョンによって生成方法が違います。最も一般的な v4(ランダム)と、名前空間から作る v5(ハッシュ)を覚えると実務は十分です。
- 「重複しない」は設計でも保証します。作成後にワークシート内の一意性をチェックする枠を入れると運用が強くなります。
- 出力書式(ハイフンあり、波括弧あり、URN形式)は先に統一しておくと、下流ツールとの齟齬がなくなります。
最短で1件作る:Windows Script HostのTypeLibでGUID生成
1行でGUID(UUID)を得る最短テンプレ
' ModUuid_WSH.bas
Option Explicit
Public Function NewUuid() As String
' TypeLib(TLB)オブジェクトのGUIDを生成
NewUuid = CreateObject("Scriptlet.TypeLib").GUID
' 既定は "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"(波括弧付き)
End Function
Public Sub Demo_OneUuid()
MsgBox NewUuid(), vbInformation
End Sub
VB重要ポイントの深掘り
- これが最短。参照設定不要(Late Binding)で動きます。既定は波括弧付きのGUIDなので、必要なら書式を整えます(次節)。
- v4相当のランダムGUIDが返ります。高頻度生成でも重複は極めて稀ですが、念のため後段の重複チェック枠を合わせて使うと万全です。
書式整形:ハイフンあり/なし、波括弧の除去、URN形式
生成直後に好みの形へ整えるヘルパー
' ModUuid_Format.bas
Option Explicit
Public Function UuidBare() As String
' ハイフンなし・波括弧なし
UuidBare = Replace(Replace(NewUuid(), "{", ""), "}", "")
End Function
Public Function UuidHyphen() As String
' 波括弧なし・ハイフンあり(一般的)
UuidHyphen = Replace(Replace(NewUuid(), "{", ""), "}", "")
End Function
Public Function UuidBraced() As String
' 波括弧付き(COM系のツールと相性良)
UuidBraced = NewUuid()
End Function
Public Function UuidUrn() As String
' URN(RFC4122)形式:urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Dim s As String: s = Replace(Replace(NewUuid(), "{", ""), "}", "")
UuidUrn = "urn:uuid:" & s
End Function
VB重要ポイントの深掘り
- 受け側ツールの期待形式が違うことがよくあります。ハイフンの有無、波括弧の有無、URN形式をあらかじめ揃える関数を用意しておくと事故が減ります。
- データベースのキーは「ハイフンあり・波括弧なし」が無難です。文字列長36で読みやすさも確保できます。
本格派:Win32 API CoCreateGuidでUUID v4生成(64ビット対応)
64ビット対応宣言と生成関数
' ModUuid_API.bas
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function CoCreateGuid Lib "ole32" (ByRef pguid As GUID) As Long
#Else
Private Declare Function CoCreateGuid Lib "ole32" (ByRef pguid As GUID) As Long
#End If
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Public Function NewUuidApi() As String
Dim g As GUID
If CoCreateGuid(g) = 0 Then
NewUuidApi = GuidToString(g) ' {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
Else
Err.Raise vbObjectError + 1, , "CoCreateGuid失敗"
End If
End Function
Private Function GuidToString(ByRef g As GUID) As String
Dim b() As Byte: ReDim b(0 To 15)
Dim i As Long
' メモリ上の並びを文字列へ(ネットワークバイト序のルールに合わせて整形)
' 簡潔に:各フィールドを16進へ整形
GuidToString = _
"{" & HexPad(g.Data1, 8) & "-" & _
HexPad(g.Data2, 4) & "-" & _
HexPad(g.Data3, 4) & "-" & _
HexPad256(g.Data4, 0, 2) & "-" & _
HexPad256(g.Data4, 2, 6) & "}"
End Function
Private Function HexPad(ByVal v As Long, ByVal n As Long) As String
Dim s As String: s = Hex$(v)
HexPad = String$(n - Len(s), "0") & s
End Function
Private Function HexPad256(ByRef a() As Byte, ByVal start As Long, ByVal count As Long) As String
Dim i As Long, s As String
For i = start To start + count - 1
s = s & Right$("0" & Hex$(a(i)), 2)
Next
HexPad256 = s
End Function
VB重要ポイントの深掘り
- OSのCOMライブラリが生成するため、最も“正統”で高速・安全。Excelの32/64ビット差は宣言で吸収します。
- 出力は波括弧付き。書式は前節のヘルパーで整えます。大量生成はこのAPIが安定。
.NETを使う方法:PowerShellのNew-GuidでUUID v4
PowerShell経由で安全・簡単に生成(大量でも速い)
' ModUuid_PS.bas
Option Explicit
Public Function NewUuidPs() As String
Dim sh As Object: Set sh = CreateObject("WScript.Shell")
Dim p As Object: Set p = sh.Exec("powershell -NoProfile -Command ""[guid]::NewGuid().ToString()""")
NewUuidPs = Trim$(p.StdOut.ReadAll) ' 例: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
End Function
Public Sub Demo_UuidBatchPs()
Dim i As Long, s As String
For i = 1 To 5
s = NewUuidPs()
Debug.Print s
Next
End Sub
VB重要ポイントの深掘り
- PowerShellは既定でハイフンあり・波括弧なしの文字列を返します。DBやWeb連携で“そのまま使える”のが嬉しいポイント。
- 外部依存が許容される現場では、バッチ生成の速度と安定性に優れます。
シート連携:A列にUUIDを一括付番、重複チェックも自動
空行へだけUUID付番、重複は警告する
' ModUuid_Sheet.bas
Option Explicit
Public Sub AssignUuidToEmptyA(ByVal wsName As String, Optional ByVal usePs As Boolean = False)
Dim ws As Worksheet: Set ws = Worksheets(wsName)
Dim rg As Range: Set rg = ws.Range("A1").CurrentRegion
Dim a As Variant: a = rg.Value
Dim setDict As Object: Set setDict = CreateObject("Scripting.Dictionary")
Dim r As Long
For r = 2 To UBound(a, 1)
Dim v As String: v = LCase$(Trim$(CStr(a(r, 1))))
If Len(v) > 0 Then setDict(v) = True
Next
Dim gen As String
For r = 2 To UBound(a, 1)
If Len(Trim$(CStr(a(r, 1)))) = 0 Then
gen = IIf(usePs, NewUuidPs(), Replace(Replace(NewUuid(), "{", ""), "}", ""))
If setDict.Exists(LCase$(gen)) Then
MsgBox "生成UUIDが既存と衝突しました。再試行してください。", vbExclamation
Exit Sub
End If
a(r, 1) = gen
setDict(LCase$(gen)) = True
}
Next
rg.Value = a
ws.Columns("A").AutoFit
MsgBox "UUID付番完了", vbInformation
End Sub
VB重要ポイントの深掘り
- 既存値と突き合わせる“集合”を先に作ると、重複リスクをゼロにできます。UUIDの仕様上ほぼ重複しませんが、実務では検知枠を置くのが安心。
- 空行だけ付番する設計にすると、既存データを壊しません。新規追加時のルーチンに組み込む使い方が定番です。
v5(名前ベース)UUID:名前空間+名前から安定的に同じIDを生成
名前空間(例:URL)と文字列からUUID v5を作る
' ModUuid_V5.bas
Option Explicit
' 例:DNS名前空間(RFC4122既定) "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
Private Const NS_DNS As String = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
Public Function UuidV5(ByVal nsUuidHyphen As String, ByVal nameText As String) As String
' PowerShellでSHA-1名前ベースUUID生成(RFC4122)
Dim cmd As String
cmd = "powershell -NoProfile -Command " & _
"""$ns='" & nsUuidHyphen & "'; $name='" & EscapePS(nameText) & "';" & _
"$u=[guid]$ns; " & _
"$nsb=$u.ToByteArray(); " & _
"$text=[Text.Encoding]::UTF8.GetBytes($name);" & _
"$input=$nsb+$text;" & _
"$sha=new-object System.Security.Cryptography.SHA1Managed;" & _
"$hash=$sha.ComputeHash($input);" & _
"$bytes=$hash[0..15]; " & _
"$bytes[6]=$bytes[6] -bor 0x50 -band 0x5F; " & _ ' version 5
"$bytes[8]=$bytes[8] -bor 0x80 -band 0xBF; " & _ ' variant RFC4122
"$g=new-object guid($bytes);" & _
"$g.ToString()"""
UuidV5 = ExecReadAll(cmd)
End Function
Private Function EscapePS(ByVal s As String) As String
EscapePS = Replace(Replace(s, "'", "''"), """", "`" & """")
End Function
Private Function ExecReadAll(ByVal cmd As String) As String
Dim sh As Object: Set sh = CreateObject("WScript.Shell")
Dim p As Object: Set p = sh.Exec(cmd)
ExecReadAll = Trim$(p.StdOut.ReadAll)
End Function
Public Sub Demo_V5()
Dim id As String
id = UuidV5(NS_DNS, "example.com")
MsgBox id, vbInformation
End Sub
VB重要ポイントの深掘り
- v5は「同じ名前空間+同じ名前→必ず同じUUID」。外部キーや派生IDを“安定生成”したい場面に向きます。
- v4(ランダム)と使い分けが肝心。動的レコードは v4、名称から恒久的識別子を作るなら v5。
大量生成・台帳化:指定件数のUUIDを作ってシートへ書く
件数指定で連番行へ吐き出す
' ModUuid_Batch.bas
Option Explicit
Public Sub GenerateUuidBatch(ByVal wsName As String, ByVal count As Long, Optional ByVal ps As Boolean = False)
Dim ws As Worksheet: Set ws = Worksheets(wsName)
Dim startRow As Long: startRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
Dim a() As Variant: ReDim a(1 To count, 1 To 1)
Dim i As Long
For i = 1 To count
a(i, 1) = IIf(ps, NewUuidPs(), Replace(Replace(NewUuid(), "{", ""), "}", ""))
Next
ws.Range("A" & startRow).Resize(count, 1).Value = a
ws.Columns("A").AutoFit
End Sub
VB重要ポイントの深掘り
- 配列に入れて一括書き込みが高速のコツ。セルへ逐次書くと遅く・固まりやすくなります。
- 大量生成の前後で、一意性チェック(Dictionaryで重複検査)をかけるとより安心です。
落とし穴と対策
書式バラつきによる突合ミス
システムごとに期待形式が違います。最初に「波括弧の有無、ハイフン有無、URN」を合意し、関数で統一。
重複チェックの過信・不実装
UUIDは重複しませんが、運用上の貼り付けや手入力で重複が混入することはあります。集合チェックを枠として入れておく。
VBAの32/64ビット宣言差でのエラー
API利用時はPtrSafe宣言を必ず。不安ならWSHやPowerShell方式に統一すると導入が楽。
外部依存の実行ポリシー
PowerShellを使う環境では、-NoProfileを付けて予期せぬプロファイル影響を避けます。社内ポリシーに合わせて運用。
まとめ:v4(ランダム)とv5(名前ベース)を使い分け、書式と一意性を“先に決める”
- 最短は Scriptlet.TypeLib、正統は CoCreateGuid、外部委譲は PowerShell。[guid]::NewGuid。
- 書式整形を関数化(波括弧/ハイフン/URN)。シート付番は一括書き込み+重複チェックで堅牢。
- 安定IDが必要なら v5 を採用。目的に合わせたUUIDを“同じ型で”作り続けるのが実務品質を守る近道です。
