category name  »  page title date

長い文字列を省略する

たとえば、ファイルのパス名など長い文字列で、それほど重要ではなく参考程度に表示したいのに、場所をとって困る、というようなことがあります。それに、ユーザーフォームに表示するのに、どれほどの幅のラベルを用意しておけばよいか悩むし、収まりきらないと大切な最後の部分が切れてしまったり、というようなこともあります。
そんなとき、こうすればよいのではないか、と考えてつくってみました。文字列全体の中間部分をはしょって、前後を "…" などでつなぐ、つまり省略形を表示するのです。その省略形の長さが、表示するラベルの幅に収まるようにしてやれば、問題ないのでは?
これは、エクスプローラーなどでもよく見かける表示方法ですね。

どうやったかというと

● まず、「見えないラベル」を適当に用意します。どうせ見えないので、どこにあっても可。
● 次に、「表示するラベル」を用意します。
● 元の文字列を「見えないラベル」に入れます。
● 「見えないラべル」の幅が「表示するラベル」の幅より大きければ、元の文字列の前半の末尾と後半の先頭を切り取り、"…" でつなぎます。
● つないだ文字列を再び「見えないラベル」に入れます。ここで、「見えないラベル」は AutoSize = True となっていて、文字列の長さによって幅が決まります。
● これを繰り返して、「見えないラベル」の幅が「表示するラベル」の幅に収まればその時の文字列を「表示するラベル」に表示して終わり。

文字の幅を計算したりしていると、大変なことになりますが、こういう風にやれば、難しいことを考えなくても、すんなりきっちり収まります。
ここでは、ユーザーフォームに表示することを前提に、以上のような方法をとりましたが、ワークシートのセルに表示する場合も、似たような手法で省略形を取得できそうです(まだ試してはいません)。

標準モジュール         AbstractCaption()

'----- 「見えないラベル」の名前と省略記号
Private Const tempLabelName = "tempLabel"
Private Const symbol = "..."
'----- text の省略形を「表示するラベル」 targetLabel に表示
Public Sub AbstractCaption(targetLabel, text)
Dim preCaption, postCaption
Dim centerPosition, maxWidth
Dim tempLabel
      maxWidth = targetLabel.width
      '先頭・末尾の文字列に分割
      centerPosition = Len(text) / 2
      preCaption = left(text, centerPosition)
      postCaption = Mid(text, centerPosition + 1)
      'tempLabel を準備
      Set tempLabel = AbstractForm.Controls(tempLabelName)
      arrangeTempLabel tempLabel, targetLabel
      With tempLabel
            .Caption = text
             '文字列を所定の長さ以下まで text に短縮
            Do While .width > maxWidth
                  preCaption = left(preCaption, Len(preCaption) - 1)
                  postCaption = Mid(postCaption, 2)
                  text = preCaption & symbol & postCaption
                  .Caption = text
            Loop
      End With
      'できあがった text を targetLabel に表示
      targetLabel.Caption = text
End Sub
'----- tempLabel の書式を targetLabel にあわせる
Private Sub arrangeTempLabel(tempLabel, targetLabel)
      With tempLabel
            .Visible = False
            .AutoSize = True
            .WordWrap = False
            .width = targetLabel.width * 2
            .Font.Size = targetLabel.Font.Size
            .Font.Name = targetLabel.Font.Name
            .Font.Bold = targetLabel.Font.Bold
            .Font.Italic = targetLabel.Font.Italic
      End With
End Sub

上の AbstractCaption() が targetLabel に text の省略形を表示するサブルーチンです。試しに、以下の ShowAbstractCaption() で呼び出してみました。

標準モジュール         ShowAbstractCaption()

Public Sub ShowAbstractCaption()
      With AbstractForm
            .Show vbModeless
            AbstractCaption .Controls("abstractNameLabel"), _
                  "0123456789abcdefghijklmnopqrstuvwxyz"
      End With
End Sub

用意したユーザーフォームと省略結果


上図は、用意したユーザーフォームです。「見えないラベル」として "tempLabel" を、「表示するラベル」として "abstractNameLabel" を置いてあります。
これで、ShowAbstractCaptionDemo() を実行すると、一瞬で下図のように表示されます。