Wordの表の中の文字列

f:id:akashi_keirin:20210207182233j:plain

Wordの表の中の文字列

けったいな現象が起こったので報告。

表の中の文字列

Wordドキュメント上に、次のような表を作成する。

f:id:akashi_keirin:20210207181729j:plain

で、次のコードで表の左上端セルの文字列を取り出してみる。

リスト1 標準モジュール
Private Sub test()
  Dim tbl As Table
  Set tbl = ActiveDocument.Tables(1)
  Dim rng As Range
  Set rng = tbl.Cell(1, 1).Range  '……(1)'
  Debug.Print rng.Text            '……(2)'
  Debug.Print Len(rng.Text)
End Sub

(1)の

Set rng = tbl.Cell(1, 1).Range

で、表の中の左上端セルを指し示すRangeオブジェクトを変数rngに突っ込み、(2)からの2行

Debug.Print rng.Text
Debug.Print Len(rng.Text)

でそのRangeオブジェクトが持っている文字列を出力するとともに、その文字列の文字数を出力する。

コイツを実行してやると、

f:id:akashi_keirin:20210207181732j:plain

となる。

セルの中の文字列は「アホ」と改段落マークなので、文字数は3と思いきや、4である。

イミディエイトの結果を見ても、「アホ」の他に、改段落と何かわけのわからんものが付着しているのが何となく分かる。

ケツに付着している文字は何か

このケツに付着している文字が何なのかを調べる。

今度は、次のコードでやってみる。

スト2 標準モジュール
Private Sub test08()
  Dim tbl As Table
  Set tbl = ActiveDocument.Tables(1)
  Dim rng As Range
  Set rng = tbl.Cell(1, 1).Range
  Debug.Print rng.Text
  Debug.Print Len(rng.Text)
  Debug.Print Asc(Right(rng.Text, 1))  '……(3)'
End Sub

先のリスト1に(3)の

Debug.Print Asc(Right(rng.Text, 1))

を付け加えただけ。

rng.Textの一番ケツの文字の文字コード番号を出力する。

こいつを実行すると、

f:id:akashi_keirin:20210207181736j:plain

こうなる。

ケツにひっついているのは、文字コード7」のやつ、つまり、Chr(7)なのである。

Chr(7)とは?

コチラのサイトによると、Chr(7)とは、

f:id:akashi_keirin:20210207181739j:plain

BELというやつである。

なんじゃそら。〔

とにかく、Wordの表のセル内の文字列のケツには、「ベル文字」というやつがひっついているらしい。

ベル文字を除去するとどうなるか

では、この「ベル文字」とやらを除去するとどうなるのか。

次のコードで実験。

リスト3 標準モジュール
Private Sub test08()
  Dim tbl As Table
  Set tbl = ActiveDocument.Tables(1)
  Dim rng As Range
  Set rng = tbl.Cell(1, 1).Range
  rng.Text = Replace(rng.Text, Chr(7), "")  '……(4)'
End Sub

(4)の

rng.Text = Replace(rng.Text, Chr(7), "")

で、Replace関数を用いて「ベル文字」を除去した文字列をrng.Textにセットしてやるのだ。

ふふふ。「ベル文字」とやら、消え失せい!!!!!!!!

f:id:akashi_keirin:20210207181743j:plain

な…なんだってー!!

わけわからん……。

セル内の文字列はどうなっとるのか

次のコードで調べてみた。

リスト4 標準モジュール
Private Sub test09()
  Dim tbl As Table
  Set tbl = ActiveDocument.Tables(1)
  Dim rng As Range
  Set rng = tbl.Cell(1, 1).Range
  Dim tmp As String
  tmp = rng.Text
  Dim i As Long
  For i = 1 To Len(tmp)
    Debug.Print Asc(Mid(tmp, i, 1))
  Next
End Sub

セル内の文字列を1文字づつ切り出して、Asc関数でコード番号を出力してみる。

f:id:akashi_keirin:20210207181745j:plain

なんと、Chr(7)ポアしたはずなのに、復活しているどころか「Chr(13) & Chr(7)」に置き換わってしまっておるではないか……。

おわりに

謎は深まるばかりである……。