- ベストアンサー
Excelで全角英数字を半角英数字に変換
こんばんは! お世話になります。 Excel sheetの列(F・G・J・K・N・O・R・S・V・W・Z・AA)、行(4~33)に アルファベットを入力するし、35行目以降に(例)A=1・B=2と"COUNTIF"関数使用でカウントされる様になっています。 そこで、その関数の式に半角英数字で入力した為、半角英数字で入力したものしかカウントされません。 入力時の注意で、半角英数字での統一入力でお願いしたものの、やはり中には全角英数字で入力する方もいて、一つ全角入力があると全て信用出来なくなり、折角自動でカウントされるようにしていても全部見直していては自動にした意味がありません。 その為、関数 or マクロでも結構です。 入力した範囲を選択して、半角英数字”A”の場合はそのままで全角英数字”A”の場合半角”A”に上書きされるようなことは出来ますか? 知っている中で、関数”ASC”も全角を半角に変換できますが、入力したセルと別のセルに返すので、そうではなく、入力してあるセルに上書きしたいのです。 ご存知の方がいらっしゃいましたら、宜しくお願いします。 お手数ですが初心者の為、具体的に教えて頂けたら幸いです。 ”のものは半角英数字
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No6回答者です。 やはり、今回の目的には合わなかったようですね。 WorksheetのChangeイベントを利用している方法が出ていますが、これは入力時にデータを置換する方法になります。 これから入力するデータは置換されますが、既に入力済みのデータは置換されません。 これも要望と微妙に異なるかもしれないので、念のため、既に入力済みのデータを置換する方法も紹介しておきます。 ・[Alt]+[F11]でVBAの画面を開く ・[挿入]→[標準モジュール]でモジュールを追加 ・下記を記述 Private Const 対象範囲 = "$F$4:$G$33,$J$4:$K$33,$N$4:$O$33,$R$4:$S$33,$V$4:$W$33,$Z$4:$AA$33" Public Sub 全角半角変換() Dim a As Long Dim i As Long Dim R As Range Dim T As Range Set T = Range(対象範囲) For a = 1 To T.Areas.Count Set R = T.Areas(a) For i = 1 To R.Count R(i) = StrConv(R(i), vbNarrow) Next Next End Sub Excelに戻り、[ツール]→[マクロ]→[マクロ] 「全角半角変換」を選択し、実行。 =========================================================== Husky2007さんの方法も試してみましたが、コピー等で複数のセルを同時に変更した場合を考慮しておらず、エラーになりました。 私なりに作り直した物を書いておきます。 ・[Alt]+[F11]でVBAの画面を開く ・プロジェクトエクスプローラで、対象のシートをダブルクリック この部分がわかり難いかもしれませんが、下記の参考にして下さい。 http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_01/sec08_01.html ・下記を記述 Private Const 対象範囲 = "$F$4:$G$33,$J$4:$K$33,$N$4:$O$33,$R$4:$S$33,$V$4:$W$33,$Z$4:$AA$33" Private Sub Worksheet_Change(ByVal Target As Range) Dim a As Long Dim i As Long Dim R As Range Dim T As Range Set T = Intersect(Target, Range(対象範囲)) If Not (T Is Nothing) Then Application.EnableEvents = False For a = 1 To T.Areas.Count Set R = T.Areas(a) For i = 1 To R.Count R(i) = StrConv(R(i), vbNarrow) Next Next Application.EnableEvents = True End If End Sub
その他の回答 (6)
- venzou
- ベストアンサー率71% (311/435)
ユーザ定義関数を作る方法 この方法は、全角を半角へ書き換えるわけではありません。 質問の要望とは異なるので、却下されるかも知れませんが、参考までに。 ユーザ定義関数でカウントすれば、条件は自由に設定できます。 (全角半角の区別、大文字小文字の区別など) マクロ等を実行する必要は無く、入力したら即、計算されますので、その点では、便利だと思います。 ----以下手順---- ・[Alt]+[F11]でVBAの画面を開く ・[挿入]→[標準モジュール]でモジュールを追加 ・下記を記述 '全角・半角の区別はしない、大文字・小文字は区別する Public Function MyCOUNTIF(範囲 As Range, 検索値 As Variant) Dim i As Long MyCOUNTIF = 0 For i = 1 To 範囲.Count If StrConv(範囲.Item(i), vbNarrow) = 検索値 Then MyCOUNTIF = MyCOUNTIF + 1 End If Next End Function ・Excelへ戻り、COUNTIFをMyCOUNTIFに書き換える。 ----以上手順---- 大文字・小文字を区別しない場合は、下記の一行を変更して下さい。 > If StrConv(範囲.Item(i), vbNarrow) = 検索値 Then If StrConv(範囲.Item(i), vbNarrow + vbLowerCase) = StrConv(検索値, vbLowerCase) Then
お礼
venzouさん、回答ありがとうございます。 今回の目的とは異なりますが、新たなやり方として次回採用してみたいと思います。
If InStr(1, 自動変換対象_行, 入力行, vbTextCompare) And InStr(1, 自動変換対象_列, 入力列, vbTextCompare) Then なにを = 自動変換対象_前1 & 自動変換対象_前2 なにに = 自動変換対象_後1 & 自動変換対象_後2 変数[なにを」と[なにに]に代入するタイミングですが For ループ直前がよかったです。 訂正しておきます。
なにを でしょうね! この辺りは、質問者の意思で・・・。
修正点1、UCASE で変数[入力値]に代入するのを中止する。 修正点2、全角大文字だけでなく小文字も変換対象に加える。 修正点3、For ループを 26 ではなく 52 にする。 以上で目的は達成する筈です。 なお、全角の123を半角の123という変換も行いたければ、それぞれ10個を加えます。 そして、ループを62にします。 Const 自動変換対象_行 = ",F,G,J,K,N,O,R,S,V,W,Z,AA," Const 自動変換対象_列 = ",4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33," Const 自動変換対象_前1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Const 自動変換対象_前2 = "abcdefghijklmnopqrstuvwxyz" Const 自動変換対象_後1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Const 自動変換対象_後2 = "abcdefghijklmnopqrstuvwxyz" Private Sub Worksheet_Change(ByVal Target As Range) Dim I As Integer Dim 入力行 As String Dim 入力列 As String Dim 入力値 As String Dim なにお As String Dim なにに As String 入力値 = Target.Value & "" If Len(入力値) Then 入力行 = "," & CutStr(Target.Address, "$", 2) & "," 入力列 = "," & CutStr(Target.Address, "$", 3) & "," なにお = 自動変換対象_前1 & 自動変換対象_前2 なにに = 自動変換対象_後1 & 自動変換対象_後2 If InStr(1, 自動変換対象_行, 入力行, vbTextCompare) And InStr(1, 自動変換対象_列, 入力列, vbTextCompare) Then For I = 1 To 52 If InStr(1, 入力値, Mid$(なにお, I, 1), vbTextCompare) > 0 Then 入力値 = Replace(入力値, Mid$(なにお, I, 1), Mid$(なにに, I, 1)) End If Next I End If Target.Value = 入力値 End If End Sub
お礼
Husky2007さん、度重なる親切な回答ありがとうございます。 教えて頂いた通りやってみます。 もし理解不足の為、再度お聞きする際にはお忙しいところすいませんが 宜しくお願い致します。
エクセルは現実には操作したこともない門外漢ですので外しているかもです。 自動変換したいシートのタグを右クリックして[コードの表示<V)]をクリック。 その後、以下のコードをコピペ。 それで、全角のアルファベットABCやabcが入力されると半角大文字に全て変換されます。 Const 自動変換対象_行 = ",F,G,J,K,N,O,R,S,V,W,Z,AA," Const 自動変換対象_列 = ",4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33," Const 自動変換対象_前 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Const 自動変換対象_後 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Private Sub Worksheet_Change(ByVal Target As Range) Dim I As Integer Dim 入力行 As String Dim 入力列 As String Dim 入力値 As String 入力値 = UCase(Target.Value & "") If Len(入力値) Then 入力行 = "," & CutStr(Target.Address, "$", 2) & "," 入力列 = "," & CutStr(Target.Address, "$", 3) & "," If InStr(1, 自動変換対象_行, 入力行, vbTextCompare) And InStr(1, 自動変換対象_列, 入力列, vbTextCompare) Then For I = 1 To 26 If InStr(1, 入力値, Mid$(自動変換対象_前, I, 1), vbTextCompare) > 0 Then 入力値 = Replace(入力値, Mid$(自動変換対象_前, I, 1), Mid$(自動変換対象_後, I, 1)) End If Next I End If Target.Value = 入力値 End If End Sub さて、このシートモジュールでは、CutStr関数を用いていますが、これだけは標準モジュールに登録する必要があります。 シートモジュールが表示されているVBエディタのメニュー[挿入]-[標準モジュール]をクリックしてコピペします。 後は、右上のXをクリックして閉じれば終わりです。 Public Function CutStr(ByVal Text As String, _ ByVal Separator As String, _ ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function
補足
Husky2007さん、回答ありがとうございます。 そこで、言葉が不足していてすいません。 >それで、全角のアルファベットABCやabcが入力されると半角大文字に全て変換されます。 入力種類には、半角の A B C や 半角の a b c もあります。 全角ABCや全角abcは半角に変換させたいのですが、半角 a b c はそのままで全角abcは半角a b cに変換されるというように大文字は大文字、小文字は小文字でただ、半角にするということです。 親切に教えて頂き感謝しております。 お手数お掛けしてすいませんが、上記条件でもう一度教えてもらえると助かります。 宜しくお願い致します。
- dodemoii
- ベストアンサー率59% (769/1282)
こんにちは ASCでダミーのシートで半角に変換し、コピーして 「形式を選択して貼りつけ」から値で重ね書きと言う のはダメなのですよね。では 次のアドインソフトを利用されてはいかがですか http://kiyopon.sakura.ne.jp/soft/henkan.htm (元に戻せないのでバックアップ等一応自己責任と言うことで..) では。
お礼
dodemoiiさん、回答ありがとうございます。 参考にしてみたいと思います!
お礼
venzouさん、親切に回答ありがとうございます。 私は会社で使用の為、まだ実行出来ていませんが、明後日早速行ってみようと思います。 もし、またお聞きする際にはお手数お掛けしますが宜しくお願い致します。