Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

vba カタカナのみ全角にするには?

ひらがな・英字・数字・記号が組み合わさったランダムな文字を カタカナのみ全角にしたいです。 Sub test() Dim moji As String moji = "あああ123AAAアアア<>()" MsgBox StrConv(moji, vbWide) End Sub これだと全て全角になってしまいます。 moji に格納される文字列は規則はなくランダムです。 この状態でカタカナのみ全角にする方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.8

#5、7、cjです。 私のが一番ダメっていうか、 ただ混乱させてしまったようで すみません m(__)m そのまま放置するのも無責任な気がするので、 一応No.5の関数は直したものを上げますが、 RefExpを使ったものの方がいいと思っています。 申し訳ないです。 Sub Re8037230j()   Dim moji As String   moji = StrConv("あああア123イAAAアイウ", vbNarrow) Debug.Print moji Debug.Print Kana2Wide(moji)   moji = StrConv("ハ マ オ(4)パパa(32)マンマk(29)オジ(37)オジジ(62)", vbNarrow) Debug.Print moji Debug.Print Kana2Wide(moji) End Sub Function Kana2Wide(ByVal sSrc As String) As String   Dim sBuf As String   Dim nLen As Long   Dim nSt As Long   Dim i As Long   Dim flg As Boolean   nLen = Len(sSrc)   nSt = 1   flg = Asc(sSrc) > 165 And Asc(sSrc) < 224   For i = 1 To nLen + 1     If (Mid$(sSrc, i, 1) Like "[" & Chr$(166) & "-" & Chr$(223) & "]" Xor flg) Or i > nLen Then       If flg Then         sBuf = sBuf & StrConv(Mid$(sSrc, nSt, i - nSt), vbWide)       Else         sBuf = sBuf & Mid$(sSrc, nSt, i - nSt)       End If       flg = Not flg       nSt = i     End If   Next i   Kana2Wide = sBuf End Function

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (7)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.7

#6さん、こんにちは。 わざわざスミマセン。 ありがとうございます。  バ_パ の問題は、正義表現での処理ではなくて、 専ら、【一文字ずつ置換する場合】のこと、を言っています。 例外処理をする手間を考えたら、 一文字ずつ置換する方が却って難しそう、という話でした。 私が#5で提示したコードにある2種類のサンプル文字列について、  ア_アイ  の イ という例で、イが全角になるかどうかを問題にして、 Replace()関数の第5引数(Count)を1に指定することで 1ヶ所ずつ置換していく方がロスもなく確度があがるかな、 と思ったのですけれど(寧ろ速くなるでしょうし)。 如何思われますでしょう。  マ_マンマ  の ン とか  オ_オジ  の ジ とか(左側にオがない場合の)  オジ_オジジ  の右端の ジ とか。 この問題と濁・半濁の問題を合わせると  ハ_バ  の バ は 全角の ハ と 半角濁点 になっちゃいませんか? TextCompare は仰る通りまったく関係ないです。 説明が下手だったみたいでスミマセン。 手軽に書けて扱い易く情報も多いという点で、 また、他の手段で実現するのが比較的難しいという点で RegExpを奨めるのは有力だと私も考えていますので。 一応、第5引数の提案、についての補足として、以上です。 お邪魔しました。

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.6

#5様の「半角カタカナの濁点付き、半濁点付き文字について」 これに関しては、一括にして、変換(StrConv)を掛けると、きちんと全角にまとまります。 これは、日本語版独特の仕様なのかもしれません。 ただし、これは、Excelに関してだけで、Accessでも、同様の質問があったはずですが、確か、違う反応がしたような記憶があります。 入力文字数は、半角の「パパ」は、文字数 4文字が、最後のMsgBoxでは、2文字の全角に変わっています。つまり、正規表現で半角文字のチャンク(塊)を取り出して変換を掛けるという所がミソです。 MsgBox moji & " " & Len(moji) >正規表現を使ったサンプルは、Replace()関数の第5引数を1に指定するものなのではないかと、、 それは、第6引数のコンペアモードのことをおっしゃっているかとは思いますが、それを、TextCompare モードだということだと思います。それは、変換対象に対して、全角・半角モードを等価値にするという意味ですから、例えば、全角・半角の空白を対象する時に使うもので、今回の場合は、特に必要ないと判断しました。 もし不具合があれば、こちらも検討はします。Chiebukuro側のものは、無意味な部分がありますから、どこかのコードを真似しただけでしょうが、今回の質問は、あちこちで比較的何度も出てきて、私自身も書いたことがあります。当然、今回のような1文字ずつの変換の問題についても、検証した覚えがありますので、あえて、何もコメントも加える必要もない思って#3に掲示しました。

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

こんにちは。 素通りしようかと思ってたけれど、気になることがあったので。 #最初に。 #このサイトでは半角カナは全角で表示されてしまいます。 #以下投稿文中のカナはすべて半角のカナです。読み替えてください。 私が気になったのは、まず、  バ パ とか、、、 半角カナでは2文字ですから、一文字ずつ置換するのは(文字化けして)難しそう。 それと、 正規表現を使ったサンプルは、Replace()関数の第5引数を1に指定するものなのではないかと、、、。  ア_アイ とか  ハ_バ とか、、、 一旦置換したカナを含む一連のカナがうまく置換できなかったりしますね。 私も書いてみました。 難しすぎず簡単すぎずなるべく軽く、という意図で書いた関数です。 やばそうな文字列サンプルを考えて地道な方法を選んだのですけれど、 漏れがないかとか少し不安になる空気ですね。 検証はお任せします。 Sub Re8037230j()   Dim sSrc As String   sSrc = "あああア123イAAAアイウ" ' カナはすべて半角の意味 Debug.Print sSrc Debug.Print Kana2Wide(sSrc)   sSrc = "ハ マ オ(4)パパa(32)マンマk(29)オジ(37)オジジ(62)" ' カナはすべて半角の意味 Debug.Print sSrc Debug.Print Kana2Wide(sSrc) End Sub ' ' Re8037230 ' ' 文字列を引数に、半角カナだけを全角に置換 Function Kana2Wide(ByVal sSrc As String) As String   Dim sBuf As String   Dim nLen As Long   Dim nPos As Long   Dim nSt As Long   Dim i As Long   Dim flg As Boolean   nLen = Len(sSrc)   sBuf = Space$(nLen + 1)   nPos = 1   nSt = 1   flg = Asc(sSrc) > 165 And Asc(sSrc) < 224   For i = 1 To nLen + 1     If (Mid$(sSrc, i, 1) Like "[" & Chr$(166) & "-" & Chr$(223) & "]" Xor flg) Or i > nLen Then       If flg Then         Mid(sBuf, nPos) = StrConv(Mid$(sSrc, nSt, i - nSt), vbWide)       Else         Mid(sBuf, nPos) = Mid$(sSrc, nSt, i - nSt)       End If       flg = Not flg       nSt = i       nPos = InStr(nPos + 1&, sBuf, " ")     End If   Next i   Kana2Wide = Left$(sBuf, nPos - 1) End Function

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.4

シート上で見る限りなのですが、 「ア」は、codeが177 「ン」は、codeが221で この間は全て、途切れることなく「半角カタカナ」です。 ですので これらに対してのみ 何らかのやり方で、リプレースすれば良い のだと思いますよ。 参考までに お役に立てていたならば幸いです。

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.3

'// Sub Test1()  Dim moji As String  Dim Re As Object  Dim Matches As Object  Dim Match As Object  Dim Temp As String  moji = "あああイイイ123AAAアアア<>()"  Temp = moji  With CreateObject("VBScript.RegExp")   .Pattern = "[\uFF66-\uFF9F]+"   .Global = True   Set Matches = .Execute(Temp)   For Each Match In Matches    Temp = Replace(Temp, Match, StrConv(Match, vbWide))   Next Match  End With  moji = Temp  MsgBox moji End Sub なお、With ~ End With で、Reのオブジェクトは終わっています。

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.2

FUNCTIONの作り方、、、 半角カタカナだけを全角に変換できますか? http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1018299425

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 1文字ずつの置換になりますが・・・ Sub Sample1() Dim k As Long, str As String, moji As String moji = "あああ123AAAアアア<>()" For k = 1 To Len(moji) str = Mid(moji, k, 1) If str Like "[ア-ン]" Then '←画面上では全角になると思いますが、半角のカタカナに! moji = Replace(moji, str, StrConv(str, vbWide)) End If Next k MsgBox moji End Sub こんな感じではどうでしょうか? 他に良い方法があればごめんなさいね。m(_ _)m

yijeaxlwpn
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A