LoginSignup
0
0

More than 1 year has passed since last update.

VBAでエクスプローラーからファイルを選択したファイルをInputとし、最初の列をMD5でハッシュ化した上で今の日時をファイル名にして出力する

Posted at
Sub HashFirstColumn()
    ' エクスプローラーからファイルを選択
    Dim fileName As Variant
    fileName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", , "ファイルを選択してください")
    If VarType(fileName) = vbBoolean And Not fileName Then
        ' ファイルが選択されなかった場合は何もしない
        Exit Sub
    End If
    
    ' ファイルを開く
    Dim csvFile As Object
    Set csvFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(fileName, 1, False, -1)
    
    ' ファイル名を作成
    Dim fileDateTime As String
    fileDateTime = Format(Now(), "YYYYMMDD_HHMMSS")
    Dim newFileName As String
    newFileName = Replace(csvFile.Name, ".csv", "_" & fileDateTime & ".csv")
    
    ' ファイルを出力
    Dim newCsvFile As Object
    Set newCsvFile = CreateObject("Scripting.FileSystemObject").CreateTextFile(newFileName, True, False)
    
    ' ファイルの最初の列をMD5でハッシュ化して出力
    Do While Not csvFile.AtEndOfStream
        Dim line As String
        line = csvFile.ReadLine
        Dim columns() As String
        columns = Split(line, ",")
        Dim hashValue As String
        hashValue = HashString(columns(0))
        newCsvFile.WriteLine hashValue & "," & Join(columns, ",", 1)
    Loop
    
    ' ファイルを閉じる
    csvFile.Close
    newCsvFile.Close
End Sub

Function HashString(str As String) As String
    ' 文字列をMD5でハッシュ化する関数
    Dim md5 As Object
    Set md5 = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
    Dim bytes() As Byte
    bytes = StrConv(str, vbFromUnicode)
    bytes = md5.ComputeHash_2((bytes))
    Dim hash As String
    Dim i As Integer
    For i = 0 To UBound(bytes)
        hash = hash & LCase(Right("0" & Hex(bytes(i)), 2))
    Next i
    HashString = hash
End Function
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0