たとえば、ファイルのパス名など長い文字列で、それほど重要ではなく参考程度に表示したいのに、場所をとって困る、というようなことがあります。それに、ユーザーフォームに表示するのに、どれほどの幅のラベルを用意しておけばよいか悩むし、収まりきらないと大切な最後の部分が切れてしまったり、というようなこともあります。
そんなとき、こうすればよいのではないか、と考えてつくってみました。文字列全体の中間部分をはしょって、前後を "…" などでつなぐ、つまり省略形を表示するのです。その省略形の長さが、表示するラベルの幅に収まるようにしてやれば、問題ないのでは?
これは、エクスプローラーなどでもよく見かける表示方法ですね。
どうやったかというと
● まず、「見えないラベル」を適当に用意します。どうせ見えないので、どこにあっても可。
● 次に、「表示するラベル」を用意します。
● 元の文字列を「見えないラベル」に入れます。
● 「見えないラべル」の幅が「表示するラベル」の幅より大きければ、元の文字列の前半の末尾と後半の先頭を切り取り、"…" でつなぎます。
● つないだ文字列を再び「見えないラベル」に入れます。ここで、「見えないラベル」は 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