Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows XP全般 : Excel 2003)
VBAでユーザーフォームを追加する時のフォントの設定方法
投稿日時: 19/04/08 21:15:05
投稿者: 富山の初心者

おねがいします。
下記のコーディングを実行すると、ユーザーフォームを追加することができ、
Width/Height/Captionはエラーなく設定できますが、
フォントの指定方法がわかりません。
フォントの指定方法を教えてください。
 
以下コーディング

Dim vbcFrm As VBIDE.VBComponent
Sub AA444_FormCreator()
''''ユーザフォームを追加
    Set vbcFrm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
    With vbcFrm
        .Properties("Width") = 300
        .Properties("Height") = 200
        .Properties("Caption") = "TEST-FORM"
        .Properties("Font.Name") = "MS ゴシック" '←ここでエラー
        .Properties("Font.Size") = 20              '←ここもエラー
        .Properties("Font.Bold") = True            '←ここもエラー
        .Properties("Font.Italic") = True          '←ここもエラー
    End With
End Sub

回答
投稿日時: 19/04/08 22:04:27
投稿者: simple

        Set f = .Properties("Font")
        f.Value("Name") = "MS ゴシック"
        f.Value("size") = 20
        f.Value("Bold") = True
        f.Value("Italic") = True
ということなんでしょうか。

投稿日時: 19/04/08 23:53:03
投稿者: 富山の初心者

simple 様
夜間にも関わらず、回答いただき、
ありがとうございます。

        Set f = .Properties("Font")
        f.Value("Name") = "MS ゴシック"
        f.Value("size") = 20
        f.Value("Bold") = True
        f.Value("Italic") = True

で想定どおりの動作となりました。
 
ここで、この返答に関する再質問ですが、
再質問1.
「f」をdimで定義するとした場合、
Dim f  As Object

で正常に作動しましたが、型は「Object」でよろしいのでしょうか?
 
再質問2.
「f」を使用せずにコーディングするとした場合、
下記のコーディングはエラーとなりました、
どのようなコーディングになるのでしょうか?
        .Properties("Font").Value("Name") = "MS ゴシック"
        .Properties("Font").Value("size") = 24
        .Properties("Font").Value("Bold") = True
        .Properties("Font").Value("Italic") = True

 
再度の質問で申し訳ございませんが、よろしくおねがいします。

回答
投稿日時: 19/04/09 06:37:37
投稿者: simple

引用:
型は「Object」でよろしいのでしょうか?

私は Variantにしておきました。
VBIDE.Propertyなどとしてみましたがエラーになったので。
 
引用:
「f」を使用せずにコーディングするとした場合、
下記のコーディングはエラーとなりました、
.Properties("Font").Value("Name") = "MS ゴシック"

私も最初そう書いたのですが、エラーとなる理由は不明です。
製品側で想定している型かなにかの関係なんでしょうか。
.Properties("Font").Name = "MS ゴシック" は通りますが、
.Properties("Font").Size = 24 以下はエラーになります。
当方も何度か試行錯誤はしております。
 
なお、
Valueプロパティというのは妙なものですが、
ローカルウインドウでそういうものが表示されたので試しただけで
特に確たる根拠があるわけではありません。(ローカルウインドウだけです)
UserForm.FontのヘルプにもValueプロパティは書いてありませんね。
ただし、オブジェクトブラウザーでは、既定のプロパティとなっていました。
.Properties("Font").Size = 24 も通って欲しいんですがねえ。
ヘルプに記載はないけど動くならそれでいいかなどと思っています。
識者からの説明、回答をお待ち下さい。

投稿日時: 19/04/09 08:54:38
投稿者: 富山の初心者

simple 様 ありがとうございます。
 

引用:
私は Variantにしておきました。
VBIDE.Propertyなどとしてみましたがエラーになったので。
そうですか。
たしかに、typename(.Properties("Font").)だと、Propertyになるので、
Propertyかとおもい、ためしましたが、エラーになりますね。
わかりました。
 
引用:
.Properties("Font").Value("Name") = "MS ゴシック"
の部分は
「識者からの説明、回答をお待ち下さい。」
ということなので、
「解決済み」にせず、もうしばらく、待ってみます。
 

回答
投稿日時: 19/04/09 13:39:29
投稿者: チオチモリン

敷居が高いですが ↓ でOKみたいです。()
 
SDim vbcFrm As VBIDE.VBComponent
Sub AA444_FormCreator()
''''ユーザフォームを追加
    Set vbcFrm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
    With vbcFrm
        .Properties("Width").Value = 300
        .Properties("Height").Value = 200
        .Properties("Caption").Value = "TEST-FORM"
        With .Properties("Font")
            .Value("Name").Value = "MS ゴシック"
            .Value("Size").Value = 20
            .Value("Bold").Value = True
            .Value("Italic").Value = True
        End With
    End With
End Sub

回答
投稿日時: 19/04/09 17:33:55
投稿者: Suzu

Font は特殊なプロパティーみたいですね。。
 
他の Width から、Caption までは、Value に 内部処理 文字列型や、数値型の Variant型を取っているのに
 
Font の場合、Variant/Object/Properties になり、
Name や、Size が Item に含まれてしまうので Font.Value.Item("Name")
Font.Name ではなく、Font!Name なら参照できますね。
 
 
なんか他にも、プロパティーの種類によって、含まれるのが、
オブジェクト単体の物と、コレクションになってしまう物があったような・・
 
具体例が出てこないですけど。。^^;
 
 
 
あれ・・・
Object で宣言した場合、obj!Name では参照できるけど、
Property で宣言した場合、obj!Name では参照できない。
 
実行時エラー 438
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
 
になります。
 
ってことは。。
Property オブジェクトの 既定プロパティーは Valueではないって事か。。
 
すみません。。気づいた部分のみの 話です。

投稿日時: 19/04/11 22:15:31
投稿者: 富山の初心者

simple 様
チオチモリン 様
Suzu 様
ありがとうございました。
 
皆様の御解答をまとめてみました。
 
以下はNGのサンプルです。

1.  .Properties("Font.Name") = "MS ゴシック"

2.  With .Properties("Font")
        .Value("Name") = "MS ゴシック"
    End With
            
3.  .Properties("Font!Name") = "MS ゴシック"

以下はOKのサンプルです。
1.  Set objCCC = .Properties("Font")
    objCCC.Value("Name") = "MS ゴシック"
        
2. .Properties("Font").Value.Item("Name") = "MS ゴシック"

以上で解決とさせていただきます。