[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『カタカナをアルファベット小文字に変換』(miyafire)Excel2003 WindowsXP
カタカナをアルファベット小文字に変換するマクロです。
ネット上にあったものを改変して作ったので、マクロについて詳しくはないです。
小文字ュ等(ひとつの単語で2回目以降)と末尾のッが変換されません。
変換できるように改変して貰えると助かります。
Public Const Roma_Boin = "aiueo"
Public Const Kata_S1 = "aアイウエオkカキクケコsサシスセソtタチツテトnナニヌネノ"
Public Const Kata_S2 = "hハヒフヘホmマミムメモyヤイユエヨrラリルレロwワイウエヲ"
Public Const Kata_S3 = "gガギグゲゴzザジズゼゾdダヂヅデドbバビブベボpパピプペポv☆☆ヴ☆☆"
Public Function changeKatakana2Romaji(srcMoji As String)
Dim kataMoji As String 'カタカナ文字
Dim RomaMoji As String 'ローマ字
Dim L As Long '文字カウンタ
Dim elm As String '1文字
Dim Pot As Integer '変換テーブルでの位置
Dim wkBoin, wkSiin As String '母音と子音
Dim chgTBL As String '変換テーブル
chgTBL = Kata_S1 & Kata_S2 & Kata_S3
kataMoji = StrConv(srcMoji, vbKatakana + vbWide) '全角カタカナにして『゛゜』を処理
Application.Volatile
For L = 1 To Len(kataMoji) 'カタカナ全角文字の母音と子音を作る
elm = Mid(kataMoji, L, 1): Pot = InStr(chgTBL, elm)
If 0 < Pot And Pot <= 6 Then
wkBoin = Mid(Roma_Boin, Pot - 1, 1): wkSiin = "": elm = wkBoin & wkSiin
ElseIf Pot > 6 Then
wkBoin = Mid(chgTBL, Int((Pot - 1) / 6) * 6 + 1, 1)
wkSiin = Mid(Roma_Boin, (Pot - 1) Mod 6, 1): elm = wkBoin & wkSiin
Else
If elm = "ン" Then elm = "n" '『ン』は特別処理
End If
RomaMoji = RomaMoji & elm
Next
RomaMoji = KomojiOkikae(RomaMoji, "ャ", "ya") '小文字『ャ』の処理
RomaMoji = KomojiOkikae(RomaMoji, "ュ", "yu") '小文字『ュ』の処理
RomaMoji = KomojiOkikae(RomaMoji, "ョ", "yo") '小文字『ョ』の処理
RomaMoji = KomojiOkikae(RomaMoji, "ァ", "xa") '小文字『ァ』の処理
RomaMoji = KomojiOkikae(RomaMoji, "ィ", "xi") '小文字『ィ』の処理
RomaMoji = KomojiOkikae(RomaMoji, "ゥ", "xu") '小文字『ゥ』の処理
RomaMoji = KomojiOkikae(RomaMoji, "ェ", "xe") '小文字『ェ』の処理
RomaMoji = KomojiOkikae(RomaMoji, "ォ", "xo") '小文字『ォ』の処理
For L = 2 To Len(RomaMoji) '小文字『ッ』の処理
If Mid(RomaMoji, L - 1, 1) = "ッ" Then
Mid(RomaMoji, L - 1, 1) = Mid(RomaMoji, L, 1)
End If
Next
changeKatakana2Romaji = StrConv(RomaMoji, vbNarrow)
End Function
'カタカナ小文字の処理(ャュョァィゥェォ)
Public Function KomojiOkikae(Moji As String, komoji As String, Okikae As String)
Dim kPot As Integer
If InStr(Moji, komoji) > 0 Then
Mid(Moji, InStr(Moji, komoji) - 1, 2) = Okikae
End If
KomojiOkikae = Moji
End Function
1.カタカナ小文字の処理は、 こんな風にすれば、複数に対応出来ると思います。 ↓ 'カタカナ小文字の処理(ャュョァィゥェォ)
Public Function KomojiOkikae(Moji As String, komoji As String, Okikae As String)
Dim kPot As Integer
Do While InStr(Moji, komoji) > 0 Mid(Moji, InStr(Moji, komoji) - 1, 2) = Okikae Loop
KomojiOkikae = Moji
End Function
>末尾のッが変換されません。 2.それってローマ字に出来るのですか? 実例を挙げていただけませんか? (カタカナとローマ字)
(半平太) 2011/10/23 21:42
2.マンガ等本のタイトルを変換するので、末尾が
ナリタイッ/スルナヨッ
というデータがあるのです。
小文字のッはxtuで変換されるので、末尾の時のみそちらで対応して頂ければ助かります。
(miyafire)
個人的には、記号の「!」にした方がニュアンスは近いと思いますが・・・・
以下、"xtu" に変える案(最下行近くに3行追加してあります)
Public Function changeKatakana2Romaji(srcMoji As String)
Dim kataMoji As String 'カタカナ文字 Dim RomaMoji As String 'ローマ字 Dim L As Long '文字カウンタ Dim elm As String '1文字 Dim Pot As Integer '変換テーブルでの位置 Dim wkBoin, wkSiin As String '母音と子音 Dim chgTBL As String '変換テーブル
chgTBL = Kata_S1 & Kata_S2 & Kata_S3
kataMoji = StrConv(srcMoji, vbKatakana + vbWide) '全角カタカナにして『゛゜』を処理
Application.Volatile
For L = 1 To Len(kataMoji) 'カタカナ全角文字の母音と子音を作る
elm = Mid(kataMoji, L, 1): Pot = InStr(chgTBL, elm)
If 0 < Pot And Pot <= 6 Then wkBoin = Mid(Roma_Boin, Pot - 1, 1): wkSiin = "": elm = wkBoin & wkSiin ElseIf Pot > 6 Then wkBoin = Mid(chgTBL, Int((Pot - 1) / 6) * 6 + 1, 1) wkSiin = Mid(Roma_Boin, (Pot - 1) Mod 6, 1): elm = wkBoin & wkSiin Else If elm = "ン" Then elm = "n" '『ン』は特別処理 End If
RomaMoji = RomaMoji & elm Next
RomaMoji = KomojiOkikae(RomaMoji, "ャ", "ya") '小文字『ャ』の処理 RomaMoji = KomojiOkikae(RomaMoji, "ュ", "yu") '小文字『ュ』の処理 RomaMoji = KomojiOkikae(RomaMoji, "ョ", "yo") '小文字『ョ』の処理 RomaMoji = KomojiOkikae(RomaMoji, "ァ", "xa") '小文字『ァ』の処理 RomaMoji = KomojiOkikae(RomaMoji, "ィ", "xi") '小文字『ィ』の処理 RomaMoji = KomojiOkikae(RomaMoji, "ゥ", "xu") '小文字『ゥ』の処理 RomaMoji = KomojiOkikae(RomaMoji, "ェ", "xe") '小文字『ェ』の処理 RomaMoji = KomojiOkikae(RomaMoji, "ォ", "xo") '小文字『ォ』の処理
For L = 2 To Len(RomaMoji) '小文字『ッ』の処理 If Mid(RomaMoji, L - 1, 1) = "ッ" Then Mid(RomaMoji, L - 1, 1) = Mid(RomaMoji, L, 1) End If Next
If Right(RomaMoji, 1) = "ッ" Then 'この3行を追加 RomaMoji = Replace(RomaMoji, "ッ", "xtu") 'この3行を追加 End If 'この3行を追加
changeKatakana2Romaji = StrConv(RomaMoji, vbNarrow)
End Function
(半平太) 2011/10/24 11:33
いまさらですが一様作ってみましたのでアップしときます。 無駄コードが有ると思いますが、カタカナ部分のみローマ字変換その他はそのままになる予定(beginner) ナリタイッ/スルナヨッ naritaixtu/surunayoxtu ジョギャット8゚゙890゚ビュ゙7゙ jogyatto8゚゙890゚byu゙7゙
Function kana(txta As String) Dim myStr As String, myData(2) Dim i As Long, ii As Long, c As Long, daku As Long, i2 As Long Dim txt As String, txtx As String, sl As Long, dic As Object, dic2 myData(0) = "ア,イ,ウ,エ,オ,ァ,ィ,ゥ,ェ,ォ,カ,キ,ク,ケ,コ,サ,シ,ス,セ,ソ,タ,チ,ツ,テ,ト,ナ,ニ,ヌ" & _ ",ネ,ノ,ハ,ヒ,フ,ヘ,ホ,マ,ミ,ム,メ,モ,ヤ,ユ,ヨ,ラ,リ,ル,レ,ロ,ガ,ギ,グ,ゲ,ゴ,ヴ,ザ" & _ ",ジ,ズ,ゼ,ゾ,ダ,ヂ,ヅ,デ,ド,バ,ビ,ブ,ベ,ボ,パ,ピ,プ,ペ,ポ,ャ,ュ,ョ,ワ,ヲ,ッ,ン" & _ ",イェ,ウィ,ウェ,ヴァ,ヴィ,ヴェ,ヴォ,ジャ,ジュ,ジェ,ジョ,ファ,フィ,フェ,フォ,キャ,キィ,キュ,キェ,キョ" & _ ",シャ,シィ,シュ,シェ,ショ,チャ,チィ,チュ,チェ,チョ,ニャ,ニィ,ニュ,ニェ,ニョ,ヒャ,ヒィ,ヒュ" & _ ",ヒェ,ヒョ,フャ,フュ,フョ,ミャ,ミィ,ミュ,ミェ,ミョ,リャ,リィ,リュ,リェ,リョ,ギャ,ギィ,ギュ" & _ ",ギェ,ギョ,ジィ,ヂャ,ヂィ,ヂュ,ヂェ,ヂョ,ビャ,ビィ,ビュ,ビェ,ビョ,ピャ,ピィ,ピュ,ピェ,ピョ" & _ ",テャ,ティ,テュ,テェ,テョ,デャ,ディ,デュ,デェ,デョ,ツァ,ツィ,ツェ,ツォ"
myData(1) = StrConv("A,I,U,E,O,XA,XI,XU,XE,XO,KA,KI,KU,KE,KO,SA,SI,SU,SE,SO,TA,TI,TU,TE,TO,NA,NI,NU" & _ ",NE,NO,HA,HI,HU,HE,HO,MA,MI,MU,ME,MO,YA,YU,YO,RA,RI,RU,RE,RO,GA,GI,GU,GE,GO,VU,ZA" & _ ",ZI,ZU,ZE,ZO,DA,DI,DU,DE,DO,BA,BI,BU,BE,BO,PA,PI,PU,PE,PO,XYA,XYU,XYO,WA,WO,XTU,NN" & _ ",YE,WI,WE,VA,VI,VE,VO,JA,JU,JE,JO,FA,FI,FE,FO,KYA,KYI,KYU,KYE,KYO" & _ ",SYA,SYI,SYU,SYE,SYO,TYA,TYI,TYU,TYE,TYO,NYA,NYI,NYU,NYE,NYO,HYA,HYI,HYU" & _ ",HYE,HYO,FYA,FYE,FYO,MYA,MYI,MYU,MYE,MYO,RYA,RYI,RYU,RYE,RYO,GYA,GYI,GYU" & _ ",GYE,GYO,ZYI,DYA,DYI,DYU,DYE,DYO,BYA,BYI,BYU,BYE,BYO,PYA,PYI,PYU,PYE,PYO" & _ ",THA,THI,THU,THE,THO,DHA,DHI,DHU,DHE,DHO,TSA,TSI,TSE,TSO", 3 + 8) 'StrConv 文字種類を変換 myData(2) = "ガ,ギ,グ,ゲ,ゴ,ザ,ジ,ズ,ゼ,ゾ,ダ,ヂ,ヅ,デ,ド,バ,ビ,ブ,ベ,ボ,パ,ピ,プ,ペ,ポ" For ii = 0 To 2 myData(ii) = Split(myData(ii), ",") Next ii Set dic = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(myData(0)) dic.Add myData(0)(i), myData(1)(i) 'myData(0)&myData(1) を格納 (StrConv(myData(1)(i), 3)で単語先頭文字を大文字) Next i
For i2 = 0 To UBound(myData(2)) dic2.Add myData(2)(i2), "" 'myData(2)&"" を格納 Next i2
txt = txta '基準の値を一時保管(大角・小角はそのままで、カタカナ以外を値を変換させない) txta = StrConv(txt, 4) '(仮)として、大角に変換
For sl = 1 To Len(txta) If dic.Exists(Mid(txta, sl, 2)) Then '(仮)2文字が変数に一致?゚ txtx = txtx & dic(Mid(txta, sl, 2)) '値にアルファベット2文字分格納 If Mid(txt, sl + daku, 2) Like "?[゙]" Or Mid(txt, sl + daku, 2) Like "?[゚]" Then daku = daku + 1 'さらに、基準値の2文字分が(゚゙)の判断 sl = sl + 1 ElseIf Mid(txta, sl, 2) Like "[ッ][ア-ン]" Then '(仮)が、ッから始まり次の文字がカタカナ? If dic.Exists(Mid(txta, sl + 1, 2)) Then '(仮)が、ッの次2文字が変数に一致? txtx = txtx & Left(dic(Mid(txta, sl + 1, 2)), 1) & dic(Mid(txta, sl + 1, 2)) 'ッの次2文字のアルファベット1文字&変数 If Not dic2.Exists(Mid(txt, sl + daku + 2, 1)) And dic2.Exists(Mid(txta, sl + 1, 1)) Then daku = daku + 1 '基準の値が半角濁点の場合 If dic2.Exists(Mid(txt, sl + daku, 1)) Then daku = daku - 1 sl = sl + 2 Else txtx = txtx & Left(dic(Mid(txta, sl + 1, 1)), 1) & dic(Mid(txta, sl + 1, 1)) 'ッの次1文字のアルファベット1文字&変数 If (Mid(txt, sl + daku, 3) Like "?[゙]" Or Mid(txt, sl + daku, 3) Like "?[゚]") And dic2.Exists(Mid(txta, sl + 1, 1)) Then daku = daku + 1 If dic2.Exists(Mid(txta, sl + 1, 1)) And Not dic2.Exists(Mid(txt, sl + daku + 1, 1)) Then daku = daku + 1 sl = sl + 1 End If ElseIf dic.Exists(Mid(txta, sl, 1)) Then txtx = txtx & dic(Mid(txta, sl, 1)) If (Mid(txt, sl + daku, 2) Like "?[゙]" Or Mid(txt, sl + daku, 2) Like "?[゚]") And dic2.Exists(Mid(txta, sl, 1)) And Not dic2.Exists(Mid(txt, sl, 1)) Then ' dic2に 存在する場合 daku = daku + 1 End If Else txtx = txtx & Mid(txt, sl + daku, 1) End If Next kana = txtx '戻し値 Set dic = Nothing Set dic2 = Nothing End Function
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.