プロが教える店舗&オフィスのセキュリティ対策術

VBAです。アクセスです。

Sub test2()
Dim obj As AccessObject
Dim f As Form
For Each obj In CurrentProject.AllForms
Set f = obj.Name
Debug.Print f.Name
色々操作するコード
Next
End Sub

このコードがうまく行かない理由がわからないのです。

Set f = obj.Nameの.Nameで、
「型が一致しません。」のエラーになります。

しかし、Set f = objにすると、
実行時エラー13になります。

オブジェクト型の変数にsetでフォームの名前を入れて、
その後いろいろ操作させるにはどのようにすればよろしいでしょうか?

A 回答 (3件)

ちょっといじってみました。


Set f = obj.Nameでは、オブジェクトに文字列を代入しようとしていますね。
Set f = Forms(obj.Name)なら良いと思いましたが、フォームが開いていないとエラーになりますのでisloadedで判別する必要があります。(これが実行時エラーの原因かも)
であれば、test2()の方は開いているフォームしか対象にならない様なので同じ事かなとも思いました。
ただ、何をなさりたいか分かりませんが、先日別件で調べて知ったばかりですが、フォームのプロパティの操作はデザインモードで開かないと(非表示でも可)出来ない様ですのでご参考までに。

Sub test()
Dim obj As AccessObject
Dim f As Form

For Each obj In CurrentProject.AllForms
If obj.IsLoaded Then
'開いていないとエラーになる
Set f = Forms(obj.Name)
'色々操作するコード
End If
Next
End Sub

Sub test2()
Dim f As Access.Form

For Each f In Access.Forms
'色々操作するコード
Debug.Print f.Name
Next
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2013/01/14 10:27

>Dim f As Form


とした場合、f はオブジェクト型の変数ではありません。
オブジェクト型の変数として使用するのであれば

Dim obj As AccessObject
Dim f As Object

For Each obj In CurrentProject.AllForms
 Set f = obj
 Debug.Print f.Name
 色々操作するコード
Next

とします。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2013/01/14 10:27

Set命令は左辺がオブジェクト型の


場合にのみ使用します。
Nameプロパティは文字型であり、
オブジェクト型ではありません。
よって、Set f = obj.Nameは間違い
です。
>Set f = obj
f はForm、obj はAccessObjectです。
型が違うのでエラーになります。

型が特定できない場合は変数を
ObjectかVariant型で定義すれば
とりあえず、「型が一致しません。」は
避けられます。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2013/01/14 10:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A