- ベストアンサー
Excel VBAで英字と数字の間のハイフンのクリア方法について
- ExcelのVBAコードを使用して、英字と数字の間のハイフンをクリアする方法について教えてください。
- 現在、B4:CH4の範囲で半角英数字の小文字を入力すると自動で大文字に変換され、ハイフンを入力すると文字がクリアされるVBAコードがあります。ただし、現在のコードでは英字と数字の間のハイフンもクリアされてしまいます。数字と数字の間のハイフンの場合はクリアしないようにするためには、どのようなコードを追加すれば良いでしょうか?
- 例えば、「GRE-879」の場合はハイフンをクリア対象とし、「GRE868-76」の場合はハイフンをクリアしないようにしたいです。このような条件を満たすVBAコードの作成方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
そんなに難しく考えずに、 半角ハイフン("-" コードは45)かどうかだけ見て、 両隣が「数字以外」だったら消す という具合で書いてあげれば良いかと思いますが・・ まぁ、この程度ならエラー処理は「Resume Next」で充分かと。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myAsc1 As Integer, myAsc2 As Integer, myAsc3 As Integer Dim myStr As String If Intersect(Target, Range("B4:CH4")) Is Nothing Then Exit Sub If Len(Target.Value) = 0 Then Exit Sub On Error Resume Next Application.EnableEvents = False Target = StrConv(Target, vbUpperCase + vbNarrow) myStr = Target.Value For i = Len(myStr) To 1 Step -1 myAsc1 = Asc(Mid(myStr, i, 1)) If myAsc1 = 45 Then myAsc2 = Asc(Mid(myStr, i - 1, 1)) myAsc3 = Asc(Mid(myStr, i + 1, 1)) If Not (myAsc2 >= 48 And myAsc2 <= 57 And _ myAsc3 >= 48 And myAsc3 <= 57) Then Target.Value = Left(Target.Value, i - 1) & _ Right(Target.Value, Len(Target.Value) - i) End If End If Next On Error GoTo 0 Application.EnableEvents = True End Sub とりあえず、行(列)削除と同じ要領で、文字列を後ろから見ていきます。 で、半角ハイフンが複数あると嫌なので、全桁について反復。 同じ理由からReplaceがうまくないので、LeftとRightで回りくどく。 ・・・といった感じです。 ほんとは先頭・末尾がハイフンだったらも考えようとしたんですが、 同様の考え方でいけるので(面倒だったので)割愛です。 う~ん、あまりスマートではないな(汗)
お礼
この度は質問に答えていただきありがとうございます。 無事に解決出来ました。