VBA Excel で機種依存文字処理のヒント

vba excel Excel VBA

Excel表のセルで機種依存文字をクリックで置換して変更したい場面が出てきた。検索して調べると、いくつか参考になる記述があった。

1.機種依存文字を文字コードで出力する方法

 決まった文字はコードが分かればAscW関数で出力できる
  参考:https://nkmrdai.com/vba-environment-dependent-characters/

2.強引な方法

置換の処理をしたいので変数に代入したいが機種依存文字は全部同じコードになってしまうので向かない。Byte配列に代入して
  参考:https://excel-ubara.com/excelvba4/EXCEL_VBA_409.html
コードで扱い、(”チェック前”などの名前を付けると扱えた。)
さらにコードを文字に変換してしてカンマまで繋げ一つの文字列にして、それを比較して、機種依存文字があるか判定し、置換処理できた。ただし、全ての機種依存文字でチェックしたわけでないのでご注意を。

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    '
    Dim tgt() As Byte
    Dim c1() As Byte, c2() As Byte, c3() As Byte
    
    If IsEmpty(Target.Cells) Then Exit Sub
    If VarType(Target.Cells.Value) <> vbString Then Exit Sub
    
    tgt = Target.Cells
    c1 = Range("チェック前")
    c2 = Range("チェック後")
    c3 = Range("チェック完了")
    
    If inStringB(tgt, c1) > 0 Then
        'チェック前
        Target.Cells = Replace(Target.Cells, Range("チェック前"), Range("チェック後"))

    ElseIf inStringB(tgt, c2) > 0 Then
        'チェック後
        Target.Cells = Replace(Target.Cells, Range("チェック後"), Range("チェック完了"))

    ElseIf inStringB(tgt, c3) > 0 Then
        'チェック完了
        Target.Cells = Replace(Target.Cells, Range("チェック完了"), Range("チェック前"))

    Else
        'MsgBox "チェック文字 ナシ"
    End If
    
End Sub

Function inStringB(st, c)
    Dim i, st2, c2
    
    st2 = CStr(st(0))
    For i = 1 To UBound(st)
        st2 = st2 + "," + CStr(st(i))
    Next i
    
    c2 = CStr(c(0))
    For i = 1 To UBound(c)
        c2 = c2 + "," + CStr(c(i))
    Next i
    
    inStringB = InStr(st2, c2)
    
End Function

“チェック前”などはセルに”チェック前”という名前を付けています。

セルに”チェック前”、”チェック後”、”チェック完了”の文字を入れています。(□、☑、■など)

時間ができたら、あとで説明を加えるかもしれないです。

工事中です!

コメント

タイトルとURLをコピーしました