読者です 読者をやめる 読者になる 読者になる

「ハナクソ」の正体が分かった……?

ハナクソの正体が分かった???

「ハナクソ」とは

「ハナクソ」というのは、

akashi-keirin.hatenablog.com

Wordの表からExcelのセルに値を転記したときに、テキストの末尾にくっついてくるナゾの物体のこと。

私の職場の環境(Office2010)では、まるでハナクソが末尾にひっついているように見えたことから、私が勝手に「ハナクソ」呼ばわりしていたのだった。

「ハナクソ」の正体を突き止める方法

近々またWordの表からExcelワークシートへの転記が必要になりそうなので、「ハナクソ」対策をどうしようか考えていた。

このときは、Replace関数を使用して「ハナクソ」を除去したのだった。

また、その後、このときは、Left関数を使って右端の「ハナクソ」だけを削る、という方法で「ハナクソ」を除去したのだった。

しかし、いづれにしても、

「ハナクソ」の正体を突き止めることから目を背けた消極的な対応

には違いなく、非常に心が痛むのであった。

そんなとき、ひらめいたのですよ。あばれはっちゃくばりに!

Chr関数使えばよくね?

なーんて。

もうね、おチャクラ全開ですわよ。

で、やってみた。

リスト1-1
Public Sub testWordTable03()
  Dim wdDoc As WordDocument
  Set wdDoc = New WordDocument    '……(1)'
  Dim str As String
  If wdDoc.isReady = True Then
    str = wdDoc.wordTable(1).Cell(2, 2).Range.Text    '……(2)'
    Call searchBooger(Right(str, 1))    '……(3)'
  End If
  Set wdDoc = Nothing
End Sub
リスト1-2
Private Sub searchBooger(ByVal booger As String)
  Dim i As Integer
  For i = 0 To 255    '……(4)'
    If Chr(i) = booger Then    '……(5)'
      Debug.Print "ハナクソの文字コードは、" & i & " 番ですがな。"    '……(6)'
      Exit Sub
    End If
  Next
  Debug.Print "ハナクソには文字コードがなかったようだ。(´・ω・`) ショボーン"
End Sub

まず(1)の

Set wdDoc = New WordDocument

は、自作のWordDocumentクラスのインスタンスを生成しているだけ。簡単に説明しておくと、インスタンス化するときにアクティブなWord.ApplicationオブジェクトとWord.Documentオブジェクトを取得して、Document上のTableオブジェクトを配列に格納してしまう働きを持ったクラスです。

だから、(2)の

str = wdDoc.wordTable(1).Cell(2, 2).Range.Text

こんな書き方で、

1つ目の表の2行2列目セルのテキスト

が取得できるのだと思ってください。

ちなみに、こうやって取得したテキスト(変数strの中身)の右端には、あの忌まわしい(w)「ハナクソ」がひっついております。

んで、(3)の

Call searchBooger(Right(str, 1))

では、自作メソッドsearchBoogerに引数として「ハナクソ」を渡している。

ちなみに、「Booger」というのは、アメリカ英語で「ハナクソ」のことらしい。案外こういう身近な言葉って英語で言えないよな。

さて、SearchBoogerメソッドの処理だが、まず(1)の

For i = 0 To 255

でForループのカウンタを0~255にしているのは、Chr関数の引数が0~255だから。

(5)の

If Chr(i) = booger Then

では、文字コードで指定した文字が引数としてこのメソッドに渡されたbooger(正体は「ハナクソ」)と一致しているかどうかを判定。一致していたら、(6)の

Debug.Print "ハナクソの文字コードは、" & i & " 番ですがな。"


文字コード番号をイミディエイト・ウインドウに表示しよう、というわけ。

実行結果

f:id:akashi_keirin:20170504201404j:plain

おおっ! つ、ついに「ハナクソ」の正体が白日のもとに……(感涙)。

んで、Chr(7)って何なの……???

コチラのページによると、

f:id:akashi_keirin:20170504201412j:plain

こういうことのようなんだが、

で、「警告音を鳴らす」って何なの???
何でこんなもんがWordの表のセル内の文字列にくっついてんの???


と、ナゾがさらに深まっただけなのであった。。。

おわりに

Chr(7)とは何なのか、「BEL」とは何なのか、そして、なぜWordの表のセル内文字列にそんなもんがひっついているのか、誰か知っている人があったら教えてください。

@akashi_keirin on Twitter