こんにちは!メールすると大体文字化けしているtknriaです!
文字化けの原因となっているのは「環境依存文字」「機種依存文字」で、
・(株)が一文字になったもの
・半角カタカナ
・キロ、kmなどの単位が一文字になったもの
などがあります。
メールが普及し始めた頃は、バイト数によって通信費も変わっていたので、こういった文字が重宝されました。
しかし、パケット定額が常識となった今では、ただ文字化けの原因でしかありません。
そこで、メールを作ったときに環境依存文字を使っていないかをチェックするマクロを実装しちゃいましょう!
■ 環境依存文字をチェック!
Outlookは、半角カタカナを自動で全角に変換してくれるので、半角カタカナはチェックする必要はありません。
今回は、それ以外の文字をチェックする機能を、VBAで実装します。
'----- 以下、ソース -----
Public Sub CheckNotJIS()
Dim checkMail As MailItem
Dim strBody As String
Dim char As String
Dim code_char As Integer
Dim i As Integer
Dim strNotJIS As String
Dim strUnicode As String
If TypeName(ActiveWindow) = "Inspector" Then
Set checkMail = ActiveInspector.CurrentItem
Else
Set checkMail = ActiveExplorer.Selection(1)
End If
strBody = checkMail.Body
For i = 1 To Len(strBody)
char = Mid(strBody, i, 1)
code_char = Asc(char)
If code_char < 0 Then
If code_char < &H8140 Or (code_char >= &H8740 And code_char < &H889F) Or code_char >= &HEB40 Then
strNotJIS = strNotJIS & char
ElseIf code_char >= &HA1 Then
strNotJIS = strNotJIS & char
ElseIf code_char = &H3F And char <> "?" Then
strUnicode = strUnicode & char
Else
End If
Else
End If
Next i
If strNotJIS = "" And strUnicode = "" Then
Else
MsgBox ("以下の文字が含まれています。" & vbCrLf & _
" 機種依存文字:" & strNotJIS & vbCrLf & _
" Unicode文字:" & strUnicode)
End If
End Sub
'----- 以上、ソース -----
Public Sub CheckNotJIS()
Dim checkMail As MailItem
Dim strBody As String
Dim char As String
Dim code_char As Integer
Dim i As Integer
Dim strNotJIS As String
Dim strUnicode As String
If TypeName(ActiveWindow) = "Inspector" Then
Set checkMail = ActiveInspector.CurrentItem
Else
Set checkMail = ActiveExplorer.Selection(1)
End If
strBody = checkMail.Body
For i = 1 To Len(strBody)
char = Mid(strBody, i, 1)
code_char = Asc(char)
If code_char < 0 Then
If code_char < &H8140 Or (code_char >= &H8740 And code_char < &H889F) Or code_char >= &HEB40 Then
strNotJIS = strNotJIS & char
ElseIf code_char >= &HA1 Then
strNotJIS = strNotJIS & char
ElseIf code_char = &H3F And char <> "?" Then
strUnicode = strUnicode & char
Else
End If
Else
End If
Next i
If strNotJIS = "" And strUnicode = "" Then
Else
MsgBox ("以下の文字が含まれています。" & vbCrLf & _
" 機種依存文字:" & strNotJIS & vbCrLf & _
" Unicode文字:" & strUnicode)
End If
End Sub
'----- 以上、ソース -----
これをボタンに割り当てれば、送信前にチェックすることができます。
さらに、送信時に自動でチェックして、環境依存文字が含まれていれば送信を取り止めるようにするには、以下のように変更します。
'----- 以下、ソース -----
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
' 機種依存文字をチェック
Call CheckNotJIS(Item, Cancel)
End Sub
Public Sub CheckNotJIS(ByVal objItem As Object, boolCancel As Boolean)
Dim strBody As String
Dim char As String
Dim code_char As Integer
Dim i As Integer
Dim strNotJIS As String
Dim strUnicode As String
strBody = objItem.Body
For i = 1 To Len(strBody)
char = Mid(strBody, i, 1)
code_char = Asc(char)
If code_char < 0 Then
If code_char < &H8140 Or (code_char >= &H8740 And code_char < &H889F) Or code_char >= &HEB40 Then
strNotJIS = strNotJIS & char
ElseIf code_char >= &HA1 Then
strNotJIS = strNotJIS & char
ElseIf code_char = &H3F And char <> "?" Then
strUnicode = strUnicode & char
Else
End If
Else
End If
Next i
If strNotJIS = "" And strUnicode = "" Then
Else
MsgBox ("以下の文字が含まれるため送信を中止します。" & vbCrLf & _
" 機種依存文字:" & strNotJIS & vbCrLf & _
" Unicode文字:" & strUnicode)
boolCancel = True
End If
End Sub
'----- 以上、ソース -----
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
' 機種依存文字をチェック
Call CheckNotJIS(Item, Cancel)
End Sub
Public Sub CheckNotJIS(ByVal objItem As Object, boolCancel As Boolean)
Dim strBody As String
Dim char As String
Dim code_char As Integer
Dim i As Integer
Dim strNotJIS As String
Dim strUnicode As String
strBody = objItem.Body
For i = 1 To Len(strBody)
char = Mid(strBody, i, 1)
code_char = Asc(char)
If code_char < 0 Then
If code_char < &H8140 Or (code_char >= &H8740 And code_char < &H889F) Or code_char >= &HEB40 Then
strNotJIS = strNotJIS & char
ElseIf code_char >= &HA1 Then
strNotJIS = strNotJIS & char
ElseIf code_char = &H3F And char <> "?" Then
strUnicode = strUnicode & char
Else
End If
Else
End If
Next i
If strNotJIS = "" And strUnicode = "" Then
Else
MsgBox ("以下の文字が含まれるため送信を中止します。" & vbCrLf & _
" 機種依存文字:" & strNotJIS & vbCrLf & _
" Unicode文字:" & strUnicode)
boolCancel = True
End If
End Sub
'----- 以上、ソース -----
これでもう文字化けに悩まされて眠れない日々とはサヨナラですね!
■ 億劫なあとがき
署名に、環境依存文字verの「(株)」を使っている人には、修正を促したほうが良いです。
また、フリーのメーリングリストを多用する場合は、特に導入しておいたほうが良いですね。