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