Excel VBA 逆引き集 | UUID生成

Excel VBA
スポンサーリンク

ねらい: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を“同じ型で”作り続けるのが実務品質を守る近道です。

タイトルとURLをコピーしました