• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:数字と数字のー(ハイフン)は消去しないVBA)

Excel VBAで英字と数字の間のハイフンのクリア方法について

このQ&Aのポイント
  • ExcelのVBAコードを使用して、英字と数字の間のハイフンをクリアする方法について教えてください。
  • 現在、B4:CH4の範囲で半角英数字の小文字を入力すると自動で大文字に変換され、ハイフンを入力すると文字がクリアされるVBAコードがあります。ただし、現在のコードでは英字と数字の間のハイフンもクリアされてしまいます。数字と数字の間のハイフンの場合はクリアしないようにするためには、どのようなコードを追加すれば良いでしょうか?
  • 例えば、「GRE-879」の場合はハイフンをクリア対象とし、「GRE868-76」の場合はハイフンをクリアしないようにしたいです。このような条件を満たすVBAコードの作成方法を教えてください。

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

  • ベストアンサー
回答No.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で回りくどく。 ・・・といった感じです。 ほんとは先頭・末尾がハイフンだったらも考えようとしたんですが、 同様の考え方でいけるので(面倒だったので)割愛です。 う~ん、あまりスマートではないな(汗)

noname#247334
質問者

お礼

この度は質問に答えていただきありがとうございます。 無事に解決出来ました。