プロが教える店舗&オフィスのセキュリティ対策術

ひらがな・英字・数字・記号が組み合わさったランダムな文字を
カタカナのみ全角にしたいです。

Sub test()
Dim moji As String
moji = "あああ123AAAアアア<>()"

MsgBox StrConv(moji, vbWide)
End Sub


これだと全て全角になってしまいます。
moji に格納される文字列は規則はなくランダムです。
この状態でカタカナのみ全角にする方法はありますか?

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

#6さん、こんにちは。


わざわざスミマセン。
ありがとうございます。

 バ_パ
の問題は、正義表現での処理ではなくて、
専ら、【一文字ずつ置換する場合】のこと、を言っています。
例外処理をする手間を考えたら、
一文字ずつ置換する方が却って難しそう、という話でした。

私が#5で提示したコードにある2種類のサンプル文字列について、
 ア_アイ  の イ
という例で、イが全角になるかどうかを問題にして、
Replace()関数の第5引数(Count)を1に指定することで
1ヶ所ずつ置換していく方がロスもなく確度があがるかな、
と思ったのですけれど(寧ろ速くなるでしょうし)。
如何思われますでしょう。

 マ_マンマ  の ン
とか
 オ_オジ  の ジ
とか(左側にオがない場合の)
 オジ_オジジ  の右端の ジ
とか。
この問題と濁・半濁の問題を合わせると
 ハ_バ  の バ は 全角の ハ と 半角濁点
になっちゃいませんか?

TextCompare は仰る通りまったく関係ないです。
説明が下手だったみたいでスミマセン。

手軽に書けて扱い易く情報も多いという点で、
また、他の手段で実現するのが比較的難しいという点で
RegExpを奨めるのは有力だと私も考えていますので。

一応、第5引数の提案、についての補足として、以上です。
お邪魔しました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

#5様の「半角カタカナの濁点付き、半濁点付き文字について」



これに関しては、一括にして、変換(StrConv)を掛けると、きちんと全角にまとまります。
これは、日本語版独特の仕様なのかもしれません。

ただし、これは、Excelに関してだけで、Accessでも、同様の質問があったはずですが、確か、違う反応がしたような記憶があります。

入力文字数は、半角の「パパ」は、文字数 4文字が、最後のMsgBoxでは、2文字の全角に変わっています。つまり、正規表現で半角文字のチャンク(塊)を取り出して変換を掛けるという所がミソです。

MsgBox moji & " " & Len(moji)

>正規表現を使ったサンプルは、Replace()関数の第5引数を1に指定するものなのではないかと、、

それは、第6引数のコンペアモードのことをおっしゃっているかとは思いますが、それを、TextCompare モードだということだと思います。それは、変換対象に対して、全角・半角モードを等価値にするという意味ですから、例えば、全角・半角の空白を対象する時に使うもので、今回の場合は、特に必要ないと判断しました。

もし不具合があれば、こちらも検討はします。Chiebukuro側のものは、無意味な部分がありますから、どこかのコードを真似しただけでしょうが、今回の質問は、あちこちで比較的何度も出てきて、私自身も書いたことがあります。当然、今回のような1文字ずつの変換の問題についても、検証した覚えがありますので、あえて、何もコメントも加える必要もない思って#3に掲示しました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

こんにちは。


素通りしようかと思ってたけれど、気になることがあったので。

#最初に。
#このサイトでは半角カナは全角で表示されてしまいます。
#以下投稿文中のカナはすべて半角のカナです。読み替えてください。

私が気になったのは、まず、
 バ パ
とか、、、
半角カナでは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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

シート上で見る限りなのですが、


「ア」は、codeが177
「ン」は、codeが221で
この間は全て、途切れることなく「半角カタカナ」です。
ですので

これらに対してのみ
何らかのやり方で、リプレースすれば良い
のだと思いますよ。

参考までに
お役に立てていたならば幸いです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

'//


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のオブジェクトは終わっています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

FUNCTIONの作り方、、、



半角カタカナだけを全角に変換できますか?
http://detail.chiebukuro.yahoo.co.jp/qa/question …
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

こんばんは!


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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/16 19:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!