Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3395 / 13645 ツリー ←次へ | 前へ→

【62507】エクセルVBAで全角英数字は半角に、半角カタカナは全角カタカナに あやか 09/7/27(月) 15:22 質問[未読]
【62513】Re:エクセルVBAで全角英数字は半角に、... つるりん 09/7/27(月) 20:35 回答[未読]
【62516】Re:エクセルVBAで全角英数字は半角に、... arajin 09/7/28(火) 10:24 回答[未読]
【62526】Re:エクセルVBAで全角英数字は半角に、... kanabun 09/7/28(火) 21:03 発言[未読]

【62507】エクセルVBAで全角英数字は半角に、半...
質問  あやか  - 09/7/27(月) 15:22 -

引用なし
パスワード
    あやかといいます。
宜しくお願い致します。

エクセルのCell内に文字が入力された際
以下の様な変換を行いたいと思いますが、

「abcカタカナ」 ⇒ 「ABCカタカナ」

英数字は半角英数字に、半角カタカナが入力された際は
全角カタカナに。

strconv等やってみましたが、なかなかうまくいきません。

宜しくお願いします。

【62513】Re:エクセルVBAで全角英数字は半角に...
回答  つるりん  - 09/7/27(月) 20:35 -

引用なし
パスワード
   Option Explicit
Sub mojimojikun()
Dim myAry1, myAry2
Dim lstr As String
Dim myRng As Range
Dim n As Long, i As Long, j As Long

myAry1 = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", _
      "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", _
      "0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
myAry2 = Array("ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", _
        "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", _
        "マ", "ミ", "ム", "メ", "モ", "ラ", "リ", "ル", "レ", "ロ", "ヤ", "ユ", "ヨ", "ヲ", "ン")
For Each myRng In Selection
  n = Len(myRng)
  For i = 1 To n
    For j = 0 To UBound(myAry1)
      lstr = Right(Left(myRng, i), 1)
      If lstr = myAry1(j) Then
        myRng.Offset(, 1) = myRng.Offset(, 1) & StrConv(lstr, vbUpperCase)
      ElseIf lstr = myAry2(j) Then
        myRng.Offset(, 1) = myRng.Offset(, 1) & StrConv(lstr, vbWide)
      End If
    Next
  Next
Next

End Sub

【62516】Re:エクセルVBAで全角英数字は半角に...
回答  arajin  - 09/7/28(火) 10:24 -

引用なし
パスワード
   以下の手順でどうでしょうか?
1.変換対象の文字全体をまず、全角大文字に変換する。
  (文面からは大文字にしたいとは書かれていないようですが、例示がそのようなので)
2.1で変換後の文字列を頭から1文字づつ確認し、英字もしくは数字の場合は、
  その文字のみ逆に半角変換する。(Midステートメントの利用)

Function hoge(ByVal s As Variant) As Variant
Dim i As Long, j As Long
Dim dmy As String
If TypeOf s Is Range Then s = s.Value
If IsArray(s) Then
  For i = LBound(s, 1) To UBound(s, 1)
    For j = LBound(s, 2) To UBound(s, 2)
      s(i, j) = hoge(s(i, j))
    Next
  Next
Else
'  s = StrConv(s, vbWide)
  s = StrConv(s, vbWide Or vbUpperCase)
  For i = 1 To Len(s)
    dmy = StrConv(Mid$(s, i, 1), vbNarrow)
    Select Case Asc(dmy)
'    Case 33 To 122
    Case 48 To 57, 65 To 90, 97 To 122  '文字コードで判断(数字と英文字のみ)
      Mid(s, i, 1) = dmy
    End Select
  Next
End If
hoge = s
End Function

(注意)
ユーザー関数で用意してみた。
英字か数字かの確認は、半角変換後の文字コードで判断した。
気になったのは、例えば、「aBcD12.35」→「ABCD12.35」と"."は全角のままですが、
それでいいのでしょうか?
もし、記号の一部も半角対象なら、判断する文字コードをカスタマイズして下さい。

以下の使用例は、選択範囲の右の範囲に結果を出すものです。
Sub Sample()
Dim r As Range
For Each r In Selection.Areas
  r.Offset(, r.Columns.Count).Value = hoge(r)
Next
End Sub

【62526】Re:エクセルVBAで全角英数字は半角に...
発言  kanabun  - 09/7/28(火) 21:03 -

引用なし
パスワード
   ▼あやか さん:
おじゃまします

>エクセルのCell内に文字が入力された際
>以下の様な変換を行いたいと思いますが、
>
>「abcカタカナ」 ⇒ 「ABCカタカナ」
>
>英数字は半角英数字に、半角カタカナが入力された際は
>全角カタカナに。

チェックするシートのシートモジュール(のChangeイベント)に
こんな風に書いておいて、
セルに入力があったとき、
(1)全角英数部分は半角の大文字に、
(2)半角カタカナは 全角カタカナに
変換させることもできそうです。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim c As Range
 Dim ss As String, m
 With CreateObject("VBScript.RegExp")
  .Pattern = "[\uFF65-\uFF9F]+"
  .Global = True
  
  For Each c In Target
    If Len(c.Value) Then
     ss = Format$(Application.Asc(c), ">") '英数部→半角大文字に
     If .Test(ss) Then     '半角カタカナ部分→全角カタカナに
       For Each m In .Execute(ss)
         ss = VBA.Replace(ss, m, StrConv(m, vbWide))
       Next
     End If
     Application.EnableEvents = False
     c.Value = ss
     Application.EnableEvents = True
    End If
  Next
 End With
End Sub

3395 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free