Microsoft Access 掲示板

中身が同じWith文が複数あるので、1つにまとめたい

6 コメント
views
4 フォロー

お世話になります。
Hatenaさんの製作されたAutoFontSize関数でフォントサイズを縮小した後、テキストボックスの中央に文字が配置されるようにテキストボックスの右余白を設定するコードを記述しています参考。ちなみにこちらのコードもHatenaさんに回答していただいたものです。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

Dim txtW As Long 'テキスト幅
Dim txtboxW As Long 'テキストボックス幅
Dim checkCharacter As String

checkCharacter = "一" 'テキスト幅調査用の例字

'中略

With 住所1

        Me.FontName = .FontName
        Me.FontSize = .FontSize
        txtboxW = .Width
        txtW = Me.TextWidth(checkCharacter)
        .RightMargin = (txtboxW - txtW) / 2

    End With

'後略

End Sub

このWithの中身が全く同じで、設定するテキストボックス名だけが住所2、社名1など違うものが10個ほどあり、このコードの中身をSub setRightMarginにまとめて随時呼び出しを行いたいのですが、上手くいきません。教えていただけないでしょうか?そもそも、Sub にまとめるという考えが間違っておりますでしょうか?
Subにまとめるという発想はこちらから得ました。(なんとこれもHatenaさんが回答されていたのですね。)

DTKC
作成: 2023/09/15 (金) 13:05:46
最終更新: 2023/09/15 (金) 15:57:53
通報 ...
1

AutoFontSize関数自体にテキストの中央配置の機能があるのでそれを使えばどうでしょう。

AutoFontSize関数を垂直文字配置の指定ができるよう改良 - hatena chips

使用例

    AutoFontSize Me.テキストボックス名, 12, Center

第3引数に Centerを指定すると中央配置になります。
縦書きのテキストボックスでも大丈夫です。

2

関数自体の機能で実現できたのですね、縦書きテキストボックスだったので使えないかと思い、記述から削除しておりました。

後学の為に、質問文通りの内容を実現するとすれば、どのような記述になりますでしょうか??
Subにまとめる方法で記述を試してみたのですが、色々とエラーが出てしまいます。

3
hatena 2023/09/19 (火) 10:49:29 修正

 下記のような感じです。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

    AutoFontSize Me.住所1, 20, Center

End Sub

第2引数は初期フォントサイズです。このフォントサイズで収まらないときに収まるようにフォントサイズを縮小します。

第3引数は下記のように指定します。

定数縦書「いいえ」の場合縦書「はい」の場合
Top上揃えに配置されます。右寄せで配置されます。
Center中央揃えに配置されます。左右中央に配置されます。
Bottom下揃えに配置されます。左寄せで配置されます。
4

ありがとうございます、そちらはできました!
仮にWith文の中身をSubで記述する場合、どのように書けばよいか知りたいです。

5

こちらお答え頂きたいです、自身のコードではどう変えても構文エラーがでてしまいます!

6

このWithの中身が全く同じで、設定するテキストボックス名だけが住所2、社名1など違うものが10個ほどあり、このコードの中身をSub setRightMarginにまとめて随時呼び出しを行いたいのですが、上手くいきません。教えていただけないでしょうか?

引数で渡せばいいでしょう。

Sub setRightMargin(ctl As Control)
    Const checkCharacter = "一" 'テキスト幅調査用の例字
    Dim txtW As Long 'テキスト幅
    Dim txtboxW As Long 'テキストボックス幅
    With ctl
        Me.FontName = .FontName
        Me.FontSize = .FontSize
        txtboxW = .Width
        txtW = Me.TextWidth(checkCharacter)
        .RightMargin = (txtboxW - txtW) / 2
    End With
End Sub

使い方として、例えば、
住所1、住所2・・・住所10
社名1、社名2・・・社名10
というテキストボックスがあったとして、
下記のような感じです。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

'中略

    Dim i As Long
    For i = 1 to 10
        Call setRightMargin(Me.Controls("住所" & i))
        Call setRightMargin(Me.Controls("会社" & i))
    Next

'後略

End Sub