Option Explicit ' このプログラムを実行するには ' ' ●今見ているこのテキスト上で [Ctrl]+[A]、[Ctrl]+[C] としてコピーする ' ●エクセル、ワードなどを起動する ' ●[Alt]+[F11] を押してVBEを起動する ' ●メニューの [挿入(I)] → [標準モジュール(M)] を選択する。 ' ●[Ctrl]+[V] として貼り付ける ' ●[F5] として、あとは指示に従う Private Const NAME = "Mizunara" Private Const HKEY_CURRENT_USER = &H80000001 Private Const REG_BINARY = 3 Private Const KEY_ALL_ACCESS = &HF003F Private Const IME_PATH97 = "Software\Microsoft\Ime\msime97\RomaDef" Private Const IME_PATH98 = "Software\Microsoft\Windows\CurrentVersion\ime\Japan\ime98\RomaDef" Private Const IME_PATH2000 = "Software\Microsoft\Windows\CurrentVersion\IME\Japan\IMEJP\RomaDef" Private Const IME_PATH_OLD = "Software\Microsoft\IMEJP\" Private Const IME_PATH_NEW1 = "Software\Microsoft\IME\" Private Const IME_PATH_NEW2 = "\IMEJP" #If Win64 Then Private Declare PtrSafe Function RegCreateKeyExA Lib "advapi32" _ (ByVal h As LongPtr, ByVal sb As String, ByVal reserved As Long, ByVal cls As Long, _ ByVal opt As Long, ByVal sam As Long, ByVal sec As LongPtr, _ res As LongPtr, dis As Long) As Long Private Declare PtrSafe Function RegOpenKeyExA Lib "advapi32" _ (ByVal h As LongPtr, ByVal sb As String, ByVal ipt As Long, ByVal san As Long, res As LongPtr) As Long Private Declare PtrSafe Function RegCloseKey Lib "advapi32" (ByVal h As LongPtr) As Long Private Declare PtrSafe Function RegSetValueExA Lib "advapi32" _ (ByVal h As LongPtr, ByVal NAME As String, ByVal res As Long, _ ByVal tp As Long, ddata As Any, ByVal sz As Long) As Long Private Declare PtrSafe Function RegQueryValueExA Lib "advapi32" _ (ByVal h As LongPtr, ByVal NAME As String, ByVal res As LongPtr, _ ByRef tp As Long, ddata As Any, ByRef sz As Long) As Long Private Declare PtrSafe Function RegDeleteValueA Lib "advapi32" (ByVal h As LongPtr, ByVal NAME As String) As Long Private Declare PtrSafe Function RegDeleteKeyA Lib "advapi32" (ByVal h As LongPtr, ByVal NAME As String) As Long Private h As LongPtr #Else Private Declare Function RegCreateKeyExA Lib "advapi32" _ (ByVal h As Long, ByVal sb As String, ByVal reserved As Long, ByVal cls As Long, _ ByVal opt As Long, ByVal sam As Long, ByVal sec As Long, res As Long, _ dis As Long) As Long Private Declare Function RegOpenKeyExA Lib "advapi32" _ (ByVal h As Long, ByVal sb As String, ByVal ipt As Long, ByVal san As Long, lp As Long) As Long Private Declare Function RegCloseKey Lib "advapi32" (ByVal h As Long) As Long Private Declare Function RegSetValueExA Lib "advapi32" _ (ByVal h As Long, ByVal NAME As String, ByVal res As Long, _ ByVal tp As Long, ddata As Any, ByVal sz As Long) As Long Private Declare Function RegQueryValueExA Lib "advapi32" _ (ByVal h As Long, ByVal NAME As String, ByVal res As Long, _ ByRef tp As Long, ByVal ddata As Long, ByVal sz As Long) As Long Private Declare Function RegDeleteValueA Lib "advapi32" (ByVal h As Long, ByVal NAME As String) As Long Private Declare Function RegDeleteKeyA Lib "advapi32" (ByVal h As Long, ByVal NAME As String) As Long Private h As Long #End If Private num As Long Private BinData(0 To 10000) As Byte Private mizu As String Private roma As String Private TSUKI_DEF As String Private TSUKI_NAME As String Private Sub InitTsuki() mizu = "" mizu = mizu & "d'」 d[「 d]」 " mizu = mizu & "qも wに eは rて tで yれ uっ iし oと pの aか fな gる hき " mizu = mizu & "jん ;い zこ xが cだ vた bょ nく mう kqご kwづ keぼ krほ ktへ " mizu = mizu & "kaあ ksけ kdす kfお kgさ kzや kxゆ kcぜ kvね kbよ dyぉ duぷ diぶ doえ " mizu = mizu & "dpゃ d@「 dhひ djつ dkち dlじ d;ま d:」 dnぬ dmみ d,ぺ d.ゅ d/ぴ lqべ " mizu = mizu & "lwぃ leぁ lrど ltぞ laら lsせ ldわ lfろ lgそ lzび lxぇ lcげ lvふ lbざ " mizu = mizu & "suぱ siぽ soば spず shぎ sjー skめ slり s;を snぐ smむ s,ヴ s.ぅ s/ぢ " mizu = mizu & " " roma = "" roma = roma & "-ー aあ baば beべ biび boぼ buぶ byaびゃ byeびぇ " roma = roma & "byiびぃ byoびょ byuびゅ caか ceせ chaちゃ cheちぇ chiち choちょ " roma = roma & "chuちゅ ciし coこ cuく cyaちゃ cyeちぇ cyiちぃ cyoちょ cyuちゅ " roma = roma & "daだ deで dhaでゃ dheでぇ dhiでぃ dhoでょ dhuでゅ diぢ doど " roma = roma & "duづ dwaどぁ dweどぇ dwiどぃ dwoどぉ dwuどぅ dyaぢゃ dyeぢぇ dyiぢぃ " roma = roma & "dyoぢょ dyuぢゅ eえ faふぁ feふぇ fiふぃ foふぉ fuふ fwaふぁ " roma = roma & "fweふぇ fwiふぃ fwoふぉ fwuふぅ fyaふゃ fyeふぇ fyiふぃ fyoふょ fyuふゅ " roma = roma & "gaが geげ giぎ goご guぐ gwaぐぁ gweぐぇ gwiぐぃ gwoぐぉ " roma = roma & "gwuぐぅ gyaぎゃ gyeぎぇ gyiぎぃ gyoぎょ gyuぎゅ haは heへ hiひ " roma = roma & "hoほ huふ hyaひゃ hyeひぇ hyiひぃ hyoひょ hyuひゅ iい jaじゃ " roma = roma & "jeじぇ jiじ joじょ juじゅ jyaじゃ jyeじぇ jyiじぃ jyoじょ jyuじゅ " roma = roma & "kaか keけ kiき koこ kuく kwaくぁ kyaきゃ kyeきぇ kyiきぃ " roma = roma & "kyoきょ kyuきゅ laぁ leぇ liぃ lkaヵ lkeヶ loぉ ltsuっ " roma = roma & "ltuっ luぅ lwaゎ lyaゃ lyeぇ lyiぃ lyoょ lyuゅ maま " roma = roma & "meめ miみ moも muむ myaみゃ myeみぇ myiみぃ myoみょ myuみゅ " roma = roma & "n'ん naな neね niに nnん noの nuぬ nyaにゃ nyeにぇ " roma = roma & "nyiにぃ nyoにょ nyuにゅ oお paぱ peぺ piぴ poぽ puぷ " roma = roma & "pyaぴゃ pyeぴぇ pyiぴぃ pyoぴょ pyuぴゅ qaくぁ qeくぇ qiくぃ qoくぉ " roma = roma & "quく qwaくぁ qweくぇ qwiくぃ qwoくぉ qwuくぅ qyaくゃ qyeくぇ qyiくぃ " roma = roma & "qyoくょ qyuくゅ raら reれ riり roろ ruる ryaりゃ ryeりぇ " roma = roma & "ryiりぃ ryoりょ ryuりゅ saさ seせ shaしゃ sheしぇ shiし shoしょ " roma = roma & "shuしゅ siし soそ suす swaすぁ sweすぇ swiすぃ swoすぉ swuすぅ " roma = roma & "syaしゃ syeしぇ syiしぃ syoしょ syuしゅ taた teて thaてゃ theてぇ " roma = roma & "thiてぃ thoてょ thuてゅ tiち toと tsaつぁ tseつぇ tsiつぃ tsoつぉ " roma = roma & "tsuつ tuつ twaとぁ tweとぇ twiとぃ twoとぉ twuとぅ tyaちゃ tyeちぇ " roma = roma & "tyiちぃ tyoちょ tyuちゅ uう vaヴぁ veヴぇ viヴぃ voヴぉ vuヴ " roma = roma & "vyaヴゃ vyeヴぇ vyiヴぃ vyoヴょ vyuヴゅ waわ weうぇ whaうぁ wheうぇ " roma = roma & "whiうぃ whoうぉ whuう wiうぃ woを wuう xaぁ xeぇ xiぃ " roma = roma & "xkaヵ xkeヶ xnん xoぉ xtuっ xtsuっ xuぅ xwaゎ xyaゃ " roma = roma & "xyeぇ xyiぃ xyoょ xyuゅ yaや yeいぇ yiい yoよ yuゆ " roma = roma & "zaざ zeぜ ziじ zoぞ zuず zyaじゃ zyeじぇ zyiじぃ zyoじょ " roma = roma & "zyuじゅ " roma = roma & " " TSUKI_DEF = "\RomaDef\" & NAME TSUKI_NAME = NAME End Sub Private Function MakeData(ByVal src As String, ByVal ime97 As Boolean, ByVal test As Boolean) As Long Dim t As String Dim table(0 To 4096) As String Dim i, j, c, n, dsize As Long Dim f As Boolean dsize = 0 i = 1 n = 0 Do While i <= Len(src) table(n) = "" Do While i <= Len(src) t = Mid(src, i, 1) If t <> " " And t <> " " And t <> vbTab Then Exit Do i = i + 1 Loop If i > Len(src) Then Exit Do Do c = Asc(Mid(src, i, 1)) If c < 0 Or c >= 128 Then Exit Do i = i + 1 If i > Len(src) Then Exit Do table(n) = table(n) & Chr(c) Loop If i > Len(src) Then Exit Do table(n) = table(n) & "=" Do t = Mid(src, i, 1) c = Asc(t) If t = " " Or t = " " Or t = vbTab Then Exit Do table(n) = table(n) & t i = i + 1 If i > Len(src) Then Exit Do Loop Do t = Mid(src, i, 1) If t <> " " And t <> " " And t <> vbTab Then Exit Do i = i + 1 If i > Len(src) Then Exit Do Loop n = n + 1 If i > Len(src) Then Exit Do Loop For i = 1 To n - 1 If table(i - 1) > table(i) Then t = table(i) j = i - 1 Do table(j + 1) = table(j) j = j - 1 If j < 0 Then f = False ElseIf table(j) <= t Then f = False Else f = True End If Loop While f table(j + 1) = t End If Next i For i = 0 To n - 1 t = StrConv(table(i), vbFromUnicode) For j = 1 To LenB(t) BinData(dsize) = AscB(MidB(t, j, 1)) dsize = dsize + 1 Next j BinData(dsize) = 0 dsize = dsize + 1 If ime97 Then BinData(dsize) = 0 dsize = dsize + 1 End If Next i If Not ime97 Then BinData(dsize) = 0 dsize = dsize + 1 End If If test Then t = "" For i = 0 To n - 1 t = t & table(i) & vbTab Next i MsgBox t End If MakeData = dsize End Function Private Sub SetTsuki() Dim d, i, a, b, t(64), dsize As Long Dim buf, v, s(64) As String Dim r As Integer buf = "" num = 0 If RegOpenKeyExA(HKEY_CURRENT_USER, IME_PATH97, 0, KEY_ALL_ACCESS, h) = 0 Then If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If num = num + 1 s(num) = IME_PATH97 t(num) = 97 buf = buf & s(num) & vbCr End If If RegOpenKeyExA(HKEY_CURRENT_USER, IME_PATH98, 0, KEY_ALL_ACCESS, h) = 0 Then If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If num = num + 1 s(num) = IME_PATH98 t(num) = 98 buf = buf & s(num) & vbCr End If If RegOpenKeyExA(HKEY_CURRENT_USER, IME_PATH2000, 0, KEY_ALL_ACCESS, h) = 0 Then If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If num = num + 1 s(num) = IME_PATH2000 t(num) = 2000 buf = buf & s(num) & vbCr End If For a = 8 To 24 For b = 0 To 2 If a <= 14 Then v = IME_PATH_OLD & a & "." & b Mod 10 Else v = IME_PATH_NEW1 & a & "." & b & IME_PATH_NEW2 End If If RegOpenKeyExA(HKEY_CURRENT_USER, v, 0, KEY_ALL_ACCESS, h) = 0 Then If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If num = num + 1 s(num) = v t(num) = a buf = buf & v & vbCr End If Next b Next a If num = 0 Then MsgBox "IME が見つかりませんでした" Else MsgBox buf & vbCr & "を見つけました。" End If For i = 1 To num If False Then If num = 1 Then v = "" Else If i = num Then v = "(推奨)" Else v = "(非推奨)" End If Else v = "" End If buf = s(i) & " に配列を設定しますか?" & v If t(i) = 97 Or t(i) = 98 Then buf = s(i) & " " & v & vbCrLf & vbCrLf & " Yes:みずなら配列/No:ローマ字配列?" r = MsgBox(buf, vbYesNoCancel) If r <> vbCancel Then If r = vbYes Then dsize = MakeData(mizu, t(i) = 97, False) If r = vbNo Then dsize = MakeData(roma, t(i) = 97, False) If RegOpenKeyExA(HKEY_CURRENT_USER, s(i), 0, KEY_ALL_ACCESS, h) <> 0 Then MsgBox "Create失敗" Exit Sub End If If RegSetValueExA(h, "ROMA0", 0, REG_BINARY, BinData(0), dsize) <> 0 Then MsgBox "SetValue失敗" If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" End If Exit Sub End If If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If MsgBox "成功" & vbCrLf & vbCrLf & "この設定はOSを再起動後に有効になります" End If ElseIf t(i) = 2000 Then If MsgBox(buf, vbYesNo) = vbYes Then If RegOpenKeyExA(HKEY_CURRENT_USER, s(i), 0, KEY_ALL_ACCESS, h) <> 0 Then MsgBox "Create失敗" Exit Sub End If dsize = MakeData(mizu, False, False) If RegSetValueExA(h, TSUKI_NAME, 0, REG_BINARY, BinData(0), dsize) <> 0 Then MsgBox "SetValue失敗" If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" End If Exit Sub End If If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If MsgBox "成功" & vbCrLf & vbCrLf & "IMEのプロパティを設定すると有効になります" End If Else If MsgBox(buf, vbYesNo) = vbYes Then If RegCreateKeyExA(HKEY_CURRENT_USER, s(i) & TSUKI_DEF, 0, 0, 0, KEY_ALL_ACCESS, 0, h, d) <> 0 Then MsgBox "Create失敗" Exit Sub End If dsize = MakeData(mizu, False, False) If RegSetValueExA(h, "table", 0, REG_BINARY, BinData(0), dsize) <> 0 Then MsgBox "SetValue失敗" If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" End If Exit Sub End If If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If MsgBox "成功" & vbCrLf & vbCrLf & "IMEのプロパティを設定すると有効になります" End If End If Next i End Sub Private Sub DelTsuki() Dim d, i, a, b, t(64) As Long Dim v, buf, s(64) As String buf = "" num = 0 If RegOpenKeyExA(HKEY_CURRENT_USER, IME_PATH2000, 0, KEY_ALL_ACCESS, h) = 0 Then If RegQueryValueExA(h, TSUKI_NAME, 0, d, 0, 0) = 0 Then num = num + 1 s(num) = IME_PATH2000 t(num) = 2000 buf = buf & s(num) & vbCr End If If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If End If For a = 8 To 19 For b = 0 To 2 If a <= 14 Then v = IME_PATH_OLD & a & "." & b & TSUKI_DEF Else v = IME_PATH_NEW1 & a & "." & b & IME_PATH_NEW2 & TSUKI_DEF End If If RegOpenKeyExA(HKEY_CURRENT_USER, v, 0, KEY_ALL_ACCESS, h) = 0 Then If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If num = num + 1 s(num) = v t(num) = a buf = buf & v & vbCr End If Next b Next a If num = 0 Then MsgBox "みずなら配列が見つかりませんでした" Else MsgBox buf & vbCr & "にみずなら配列を見つけました。" End If For i = 1 To num If MsgBox(s(i) & vbCrLf & vbCrLf & "のみずなら配列を削除しますか?" & vbCrLf & vbCrLf & _ "(みずなら配列を選択している場合は削除しないでください)", vbYesNo) = vbYes Then If t(i) = 2000 Then If RegOpenKeyExA(HKEY_CURRENT_USER, s(i), 0, KEY_ALL_ACCESS, h) <> 0 Then MsgBox "Open失敗(1)" Exit Sub End If If RegDeleteValueA(h, TSUKI_NAME) <> 0 Then MsgBox "DeleteValue失敗" If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" End If Exit Sub End If If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If MsgBox "成功" Else If RegOpenKeyExA(HKEY_CURRENT_USER, s(i), 0, KEY_ALL_ACCESS, h) <> 0 Then MsgBox "Open失敗(1)" Exit Sub End If If RegDeleteValueA(h, "table") <> 0 Then MsgBox "DeleteValue失敗" If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" End If Exit Sub End If If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If v = s(i) a = 0 b = 1 Do While b <= Len(v) If Mid(v, b, 1) = "\" Then a = b b = b + 1 Loop v = Left(v, a - 1) If RegOpenKeyExA(HKEY_CURRENT_USER, v, 0, KEY_ALL_ACCESS, h) <> 0 Then MsgBox "Open失敗(2)" Exit Sub End If If RegDeleteKeyA(h, TSUKI_NAME) <> 0 Then MsgBox "DeleteKey失敗" If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" End If Exit Sub End If If RegCloseKey(h) <> 0 Then MsgBox "Close失敗" Exit Sub End If MsgBox "成功" End If End If Next i End Sub Public Sub ExeTsuki() Call InitTsuki Call MakeData(mizu, False, True) If MsgBox("配列を設定しますか?" & vbCrLf & vbCrLf & "(IME97,IME98 をローマ字に戻すときも「はい」を選びます)", vbYesNo) = vbYes Then Call SetTsuki ElseIf MsgBox("配列を削除しますか?" & vbCrLf & vbCrLf & "(通常、削除しなくても問題ありません)", vbYesNo) = vbYes Then Call DelTsuki End If End Sub