Windows10標準環境(デフォルト環境)のみでマクロのロック解除
(動作せず。ダメ)
0 準備
たとえば、対象として「locked.xlsm」ファイルを解除したいなら、名前の変更で「locked.xlsm.zip」に変更し、ダブルクリックで解凍し、xlフォルダ内のvbaProject.binファイルに対して変更処理を行うためのコードをchatGpt4に教えてもらう。
1 Bing(ChatGpt4)への質問
Vbscriptでバイナリファイル内の文字列DPBを文字列APBに変更して上書き保存するコードは?文字列の長さは同じことが前提で良いからコードは短い記載でお願い。変数名は長くても良いから分かりやすく命名して。コード内のコメントは各行について、小学生でも分かるくらい優しくお願い。起動の前提があれば詳細に説明して。
2回答
こんにちは、これはBingです。Vbscriptでバイナリファイル内の文字列DPBを文字列APBに変更して上書き保存するコードについてお答えします。
まず、バイナリファイルを読み書きするには、ADODB.Stream1というオブジェクトを使います。このオブジェクトは、バイナリデータをBytesという型のオブジェクトで扱います。しかし、この型はVBScriptにとって標準的な型ではなく、生成や編集ができない、配列っぽくて配列ではない扱いにくいものです。
そこで、MSXML2.DOMDocument2というオブジェクトを使って、Bytesと16進数文字列の相互変換を行います。このオブジェクトは、XMLを扱うものですが、DataTypeをbin.hexとすると、バイナリデータと16進数文字列の変換ができます。16進数文字列は単なる文字列なので、Replace3という関数で文字列の置換ができます。
以下のコードは、vbaProject.binというファイルを読み込んで、16進数文字列に変換し、DPBという文字列をAPBに置換して、同じファイルに上書き保存するものです。コード内のコメントは各行の処理を説明しています。
3コード
' バイナリファイルを読み込む関数 Function ReadBinaryFile(FileName) ' ADODB.Streamオブジェクトを作る Dim Stream Set Stream = CreateObject("ADODB.Stream") ' バイナリモードにする Stream.Type = 1 ' ファイルを開く Stream.Open ' ファイルを読み込む Stream.LoadFromFile FileName ' バイト配列としてデータを取得する ReadBinaryFile = Stream.Read ' ファイルを閉じる Stream.Close ' オブジェクトを破棄する Set Stream = Nothing End Function ' バイナリファイルを書き込む関数 Function WriteBinaryFile(FileName, Data) ' ADODB.Streamオブジェクトを作る Dim Stream Set Stream = CreateObject("ADODB.Stream") ' バイナリモードにする Stream.Type = 1 ' ファイルを開く Stream.Open ' バイト配列としてデータを書き込む Stream.Write Data ' ファイルに保存する Stream.SaveToFile FileName, 2 ' ファイルを閉じる Stream.Close ' オブジェクトを破棄する Set Stream = Nothing End Function ' バイト配列を16進数文字列に変換する関数 Function ConvertBytesToHexString(Data) ' MSXML2.DOMDocumentオブジェクトを作る Dim Dom Set Dom = CreateObject("MSXML2.DOMDocument").createElement("temp") ' DataTypeをbin.hexにする Dom.DataType = "bin.hex" ' バイト配列をNodeTypedValueに代入する Dom.NodeTypedValue = Data ' Textを16進数文字列として取得する ConvertBytesToHexString = Dom.Text ' オブジェクトを破棄する Set Dom = Nothing End Function ' 16進数文字列をバイト配列に変換する関数 Function ConvertHexStringToBytes(Data) ' MSXML2.DOMDocumentオブジェクトを作る Dim Dom Set Dom = CreateObject("MSXML2.DOMDocument").createElement("temp") ' DataTypeをbin.hexにする Dom.DataType = "bin.hex" ' 16進数文字列をTextに代入する Dom.Text = Data ' NodeTypedValueをバイト配列として取得する ConvertHexStringToBytes = Dom.NodeTypedValue ' オブジェクトを破棄する Set Dom = Nothing End Function ' ファイル名を指定する Dim FileName FileName = "vbaProject.bin" ' ファイルを読み込んでバイト配列にする Dim Bytes Bytes = ReadBinaryFile(FileName) ' バイト配列を16進数文字列に変換する Dim HexString HexString = ConvertBytesToHexString(Bytes) ' 16進数文字列のDPBをAPBに置換する HexString = Replace(HexString, "445042", "415042") ' 16進数文字列をバイト配列に変換する Bytes = ConvertHexStringToBytes(HexString) ' ファイルに書き込む WriteBinaryFile(FileName, Bytes)
4 注意
このコードは、文字列の長さが同じであることが前提です。もし文字列の長さが異なる場合は、16進数文字列の長さやファイルのサイズも変わるので、それに合わせて調整する必要があります。
また、このコードは、vbaProject.binというファイルが存在することと、そのファイルがCompound File Binary Formatというファイル形式であることが前提です。もし別のファイルやファイル形式を扱う場合は、それに合わせて調整する必要があります。
このコードは、Vbscriptの標準機能とADODB.Stream1とMSXML2.DOMDocument2というオブジェクトを使っています。これらのオブジェクトは、Windowsの標準コンポーネントとしてインストールされていると思いますが、もしインストールされていない場合は、別途インストールする必要があります。
以上が、Vbscriptでバイナリファイル内の文字列DPBを文字列APBに変更して上書き保存するコードの説明です。ご参考になれば幸いです。😊
5 感想 vbaProject.binのフルパスに書き換える必要がある。