テスト用S-JIS文字列(改行付き)の作成
2024/08/02
----------------------
ーーーーーーーーーーーーーーーーー
【 MS Learningより引用 】VBA
Chr(charcode)
ChrB(charcode)
ChrW(charcode)

Chr(10) は改行文字を返します。
文字コードの通常の範囲は 0から255。
注意:
ChrB関数は、Stringに含まれるバイトデータの場合に使用。
ChrBは、常に1バイトを返す。
ChrW関数は、Unicode文字を含むStringを返す。

Dim MyChar
    MyChar = Chr(65) ' Returns A.
    MyChar = Chr(97) ' Returns a.
    MyChar = Chr(62) ' Returns >.
    MyChar = Chr(37) ' Returns %.

ーーーーーーーーーーーーーーーーー
テスト用S-JIS文字列の最後に「改行」を付ける試行錯誤。

とりあえず、EXCEL 2019の VBA でやってみた。
-----------------------

Begin

Dim Str As String
Dim Str2 As String
Dim Str3 As String ' 改行コード付き

Str = "ab123"
' Unicode文字列  10バイト
    MsgBox Str & "バイト数" & LenB(Str)

    Str2 = StrConv(Str, vbFromUnicode)
' S-JIS文字列にした  長さ 8バイト
    MsgBox Str2 & "バイト数" & LenB(Str2)
' 8バイト  [長さ 8バイト]


--ここからしばらく悪戦苦闘が、、、--------------
'
    Str3 = Str2 & vbCrLf
' 行末に改行コードを加えたはずだが。

' S-JIS文字列  
    MsgBox "+ vbCrLf バイト数" & LenB(Str3)
' 12バイト (4バイトも増えた)
'
    Str3 = Str2 & &H0D & &H0A
    MsgBox "+ &H0D & &H0A バイト数" & LenB(Str3)
' 16バイト (8バイトも増えた)

 
' 試しに、Str3を 改行 だけにしてみる。
    Str3 = &H0D & &H0A
    MsgBox "&H0D & &H0A バイト数" & LenB(Str3)
'  8バイト


    Str3 = vbCrLf
    MsgBox "vbCrLf バイト数" & LenB(Str3)
'  4バイト
1バイトずつ読み取ってみる、以下同様
' 1バイト目
    MsgBox MidB(Str3, 1, 1) ' ""
    MsgBox AscB( MidB(Str3, 1, 1) ) ' "13" は〇。
' 2バイト目
    MsgBox MidB(Str3, 2, 1) ' ""
    MsgBox AscB( MidB(Str3, 2, 1) ) ' "0" は〇。
' 3バイト目
    MsgBox MidB(Str3, 3, 1) ' 3"
    MsgBox AscB( MidB(Str3, 3, 1) ) ' "10" は〇。
' 4バイト目
    MsgBox MidB(Str3, 4, 1) ' ""
    MsgBox AscB( MidB(Str3, 4, 1) ) ' "0" は〇。
' Unicode文字列 で &H0D &H0A


' 試しに、&H0D、 だけにしてみる。
    Str3 = &H0D
    MsgBox "&H0D バイト数" & LenB(Str3)
'  4バイト

1バイトずつ読み取ってみる、以下同様
' 1バイト目
    MsgBox MidB(Str3, 1, 1) ' "1"
    MsgBox AscB( MidB(Str3, 1, 1) ) ' "49" は〇。
' 2バイト目
    MsgBox MidB(Str3, 2, 1) ' ""
    MsgBox AscB( MidB(Str3, 2, 1) ) ' "0" は〇。
' 3バイト目
    MsgBox MidB(Str3, 3, 1) ' 3"
    MsgBox AscB( MidB(Str3, 3, 1) ) ' "51" は〇。
' 4バイト目
    MsgBox MidB(Str3, 4, 1) ' ""
    MsgBox AscB( MidB(Str3, 4, 1) ) ' "0" は〇。
' Unicode文字列 で "1"  "3"


    Str3 =StrConv( &H0D, vbFromUnicode)
' S-JIS文字列にしたつもり  
    MsgBox "&H0D SJIS バイト数" & LenB(Str3)
'  2バイト それでも2バイトある!
1バイトずつ読み取ってみる、以下同様
' 1バイト目
    MsgBox MidB(Str3, 1, 1) ' "1"
    MsgBox AscB( MidB(Str3, 1, 1) ) ' "49" は〇。
' 2バイト目
    MsgBox MidB(Str3, 2, 1) ' 3""
    MsgBox AscB( MidB(Str3, 2, 1) ) ' "51" は〇。


' 試しに、&H0A、 だけにしてみる。
    Str3 = &H0A
    MsgBox "&H0A  バイト数 " & LenB(Str3)
'  4(バイト)

 vbCrLf、 &H0A、&H0Aを加えたのが間違いらしい。
それとUNICODE文字として扱われてしまうらしい。

-----------------------------------
以下、1バイトの「文字」にすることを考える。
-----------------------------------
Chr()で変換してみる

    Str3 = Chr(&H36)
    MsgBox Str3 & "  バイト数=" & LenB(Str3)
' 6   2(バイト)
    MsgBox MidB(Str3, 1, 1) ' "6"
    MsgBox AscB( MidB(Str3, 1, 1) ) ' "54" は〇。
    MsgBox MidB(Str3, 1, 2) ' "6"
    MsgBox AscB( MidB(Str3, 1, 2) ) ' "54" は〇。
UNICODEで入っている。

    MsgBox MidB(Str3, 2, 1) ' ""
    MsgBox AscB( MidB(Str3, 2, 1) ) ' "0" 。

-----------------------------------
    Str3 = Chr(10)
    MsgBox Str3 & "  バイト数=" & LenB(Str3)
' ""   2(バイト)

    MsgBox MidB(Str3, 1, 1) ' ""
    MsgBox AscB(MidB(Str3, 1, 1))   ' "10" は〇。

    MsgBox MidB(Str3, 1, 2) ' ""
    MsgBox AscB(MidB(Str3, 1, 2))   ' "10" は〇。

'2バイト目は?
    MsgBox "2バイト目は?"
    MsgBox MidB(Str3, 2, 1) ' ""
    MsgBox AscB(MidB(Str3, 2, 1))   ' "0" は〇。

-----------------------------
 Chr では2バイトになってしまう!
-----------------------------

-------以下 ChrB を使う----------------------

    Str3 = ChrB(10)
    MsgBox Str3 & "  バイト数=" & LenB(Str3)
' Str3(と次のバイト数) が表示おかしいけれど、、

    MsgBox "  バイト数=" & LenB(Str3)' 1 バイト

    MsgBox MidB(Str3, 1, 1) ' ""
    MsgBox AscB(MidB(Str3, 1, 1))   ' "10" は〇。

明かりが見えてきた!

---------------------------
    Str3 = ChrB(13)
    MsgBox Str3  ' & "  バイト数=" & LenB(Str3)

    MsgBox "  バイト数=" & LenB(Str3)' 1 バイト

    MsgBox MidB(Str3, 1, 1) ' ""
    MsgBox AscB(MidB(Str3, 1, 1))   ' "13" は〇。

---------------------------
    Str3 = ChrB(&H0D) 同じ結果。
    MsgBox Str3  ' & "  バイト数=" & LenB(Str3)

    MsgBox "  バイト数=" & LenB(Str3)' 1 バイト

    MsgBox MidB(Str3, 1, 1) ' ""
    MsgBox AscB(MidB(Str3, 1, 1))   ' "13" は〇。

-------------------------
    Str3 = ChrB(65)
    MsgBox Str3  ' & "  バイト数=" & LenB(Str3)

    MsgBox "  バイト数=" & LenB(Str3) ' 1 バイト

    MsgBox MidB(Str3, 1, 1) ' "A"
    MsgBox AscB(MidB(Str3, 1, 1))   ' 65 は〇。

-------------------------
〇〇〇これでやっと改行コードになった。めでたしめでたし。

    Str3 = ChrB(&HD) & ChrB(&HA)
    MsgBox Str3 & "  バイト数=" & LenB(Str3)
' "?" 2 バイト
' ?表示は、内容を文字コードとして判別不能なのだろう。
    MsgBox "  バイト数=" & LenB(Str3) ' 2 バイト

    MsgBox MidB(Str3, 1, 1) ' ""
    MsgBox AscB(MidB(Str3, 1, 1))   ' 13 は〇。

'2バイト目は?
    MsgBox "2バイト目は?"
    MsgBox MidB(Str3, 2, 1) ' ""
    MsgBox AscB(MidB(Str3, 2, 1))   ' 10 は〇。

-------------------------
おまけに文字を入れてみた。
    Str3 = ChrB(65) & ChrB(52) '"A" "4"
    MsgBox Str3 & "  バイト数=" & LenB(Str3)
' "?" 2 バイト
' ?表示は、内容を文字コードとして判別不能なのだろう。

    MsgBox "  バイト数=" & LenB(Str3) ' 2 バイト

    MsgBox MidB(Str3, 1, 1) ' "A"
    MsgBox AscB(MidB(Str3, 1, 1))   ' 65 は〇。

'2バイト目は?
    MsgBox "2バイト目は?"
    MsgBox MidB(Str3, 2, 1) ' "4"
    MsgBox AscB(MidB(Str3, 2, 1))   ' 52 は〇。

-------------------------
これで本番。

    Str3 = Str2 & ChrB(&HD) & ChrB(&HA)
' 行末に改行コードを加えたつもり。
    MsgBox Str3 & "  バイト数=" & LenB(Str3)

    MsgBox MidB(Str3, 1, 1) ' "a"
    MsgBox MidB(Str3, 2, 1) ' "b"

'3文字目 「1」 第1と第2に分ける。
' 1バイト目
    MsgBox " 1バイト目"
    MsgBox MidB(Str3, 3, 1) ' " "?
    MsgBox AscB( MidB(Str3, 3, 1) ) ' 130
    MsgBox "&H" & Hex(AscB( MidB(Str3, 3, 1) ) ) ' &H82

' 2バイト目
    MsgBox MidB(Str3, 4, 1) ' " "P
    MsgBox AscB( MidB(Str3, 4, 1) ) ' 80
    MsgBox "&H" & Hex(AscB( MidB(Str3, 4, 1) ) ) ' &H50
'「1」のS-JISコードは 0x8250(Hex)、


'4文字目 「2」
' 1バイト目
    MsgBox " 1バイト目"
    MsgBox MidB(Str3, 5, 1) ' "?"
    MsgBox AscB( MidB(Str3, 5, 1) ) ' 130
    MsgBox "&H" & Hex(AscB( MidB(Str3, 5, 1) ) ) ' &H82

' 2バイト目
    MsgBox MidB(Str3, 6, 1) ' "Q"
    MsgBox AscB( MidB(Str3, 6, 1) ) ' 81
    MsgBox "&H" & Hex(AscB( MidB(Str3, 6, 1) ) ) ' &H51
'「2」のS-JISコードは 0x8251(Hex)、


'5文字目 「3」
' 1バイト目
    MsgBox " 1バイト目"
    MsgBox MidB(Str3, 7, 1) ' "?"
    MsgBox AscB( MidB(Str3, 7, 1) ) ' 130
    MsgBox "&H" & Hex(AscB( MidB(Str3, 7, 1) ) ) ' &H82
' 2バイト目
    MsgBox MidB(Str3, 8, 1) ' "R"
    MsgBox AscB( MidB(Str3, 8, 1) ) ' 82
    MsgBox "&H" & Hex(AscB( MidB(Str3, 8, 1) ) ) ' &H52
'「3」のS-JISコードは 0x8252(Hex)、

    MsgBox " 9バイト目は"
    MsgBox MidB(Str3, 9, 1) ' ""
    MsgBox AscB(MidB(Str3, 9, 1))   ' 13 は〇。

'2バイト目は?
    MsgBox "10バイト目は?"
    MsgBox MidB(Str3, 10, 1) ' ""
    MsgBox AscB(MidB(Str3, 10, 1))   ' 10 は〇。
行末にCrLFが付いたこと、確認できた。



----------------------------------

#テキストエディター
#エディター
冷やかしの「いいね」は断ります!