次の方法で共有

以前のAccessで動作していた命令が動作しない

Anonymous
2018-04-27T02:33:10+00:00

Set CHK_TABLE = CurrentDb.TableDefs(作成先テーブル名)  でテーブルの情報をセットして

CHK_TABLE.Fields.Count                 でテーブルのフィールド名数を取得しようとしていたのですが、フィールド名数

                            が取得できない

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2018-04-27T04:28:21+00:00

> Set CHK_TABLE = CurrentDb.TableDefs(作成先テーブル名)を実行後(Errは0です)、

> イミディエイトウインドウで、? CHK_TABLE.Fields.Count と入力すると

> "実行時エラー'3421';  オブジェクトが正しくないか、現在設定されていません。"

> のエラーが発生します

Dim DB As DAO.Database

Dim CHK_TABLE As DAO.TableDef

Dim strTableName As String

strTableName = "作成先テーブル名"

Set DB = CurrentDb

Set CHK_TABLE = DB.TableDefs(strTableName)

Debug.Print "[" & strTableName & "]のフィールドの数は" & CHK_TABLE.Fields.Count & "個です。"

Set CHK_TABLE = Nothing

Set DB = Nothing


以上のように、カレントデータベースへの参照を変数に渡して、

その変数からテーブル定義を参照するようにされた方がよいでしょう。

この回答は役に立ちましたか?

2 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2018-04-27T06:47:44+00:00

> 以前のAccessでは参照設定でMicrosoft DAO 3.6 Object Libraryか

> 何かを選択していたように思いますが、それとは関係ないのでしょうか。

CurrentDb メソッドによって返されるカレントデータベースへの参照は、

変数に参照渡しするなどして保持しておかないと、メソッドを呼び出した

ステップが完了した時点で自動的に解放されます。

状況としては、以下のコードを実行しているのと同じようなものです。


Dim DB As DAO.Database

Dim CHK_TABLE As DAO.TableDef

Dim strTableName As String

strTableName = "作成先テーブル名"

Set DB = CurrentDb

Set CHK_TABLE = DB.TableDefs(strTableName)

Set DB = Nothing

Debug.Print "[" & strTableName & "]のフィールドの数は" & CHK_TABLE.Fields.Count & "個です。"


つまり CHK_TABLE の親である Database オブジェクトへの参照が

失われると、CHK_TABLE に渡されていた TableDef オブジェクトへの

参照も失われてしまうというわけです。

(有効なコーディング例 1 )


Dim strTableName As String

strTableName = "作成先テーブル名"

Debug.Print "[" & strTableName & "]のフィールドの数は" & _

            CurrentDb.TableDefs(strTableName).Fields.Count & "個です。"


( 1 つのステップの中でカレントデータベースの参照、テーブル定義の参照、

 FieldsコレクションのCount プロパティの値の取得を行なっている)

(有効なコーディング例 2 )


Dim strTableName As String

strTableName = "作成先テーブル名"

With CurrentDb

    Debug.Print "[" & strTableName & "]のフィールドの数は" & _

               .TableDefs(strTableName).Fields.Count & "個です。"

End With


( With ... End With ステートメントによってカレントデータベース

 への参照を保持。End With を抜けるまでは有効)

この回答は役に立ちましたか?

1 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

3 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2018-04-27T04:53:58+00:00

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

    指定の方法で正しくテーブル数が取得できました。

    以前のAccessでは参照設定でMicrosoft DAO 3.6 Object Libraryか何かを選択していたように思いますが、それとは関係ないのでしょうか。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2018-04-27T03:55:52+00:00

    Set CHK_TABLE = CurrentDb.TableDefs(作成先テーブル名)を実行後(Errは0です)、イミディエイトウインドウで、? CHK_TABLE.Fields.Count

    と入力すると"実行時エラー'3421';  オブジェクトが正しくないか、現在設定されていません。"  のエラーが発生します

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2018-04-27T02:41:44+00:00

    どのステートメントを実行しようとしたら、どのような現象が発生したのか

    (どのような実行時エラーが返されたのか)を具体的に明記されることを

    お奨めします。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません