質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

15150閲覧

作成したはずのテーブルがナビゲーションウィンドウへ表示されない。

watarusugimoto

総合スコア47

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2018/02/03 09:02

編集2018/02/03 13:30

基本的なことですがVBAからテーブルを作成したいと考えています。

今自宅でAccess2016を使っています。
VBAを使ってAccessへテーブルを新規作成したいと思い、下のようなソースコードを書いてみました。
すると、作成はされているのですが、アプリケーションのナビゲーションウィンドウへテーブルが表示されません。

特にエラーは特に何も出ません。
作成されていないと思い、再度実行すると、今度はエラーが発生します。
既にテーブルは存在すると言われます。

イメージ説明

VBEの上書きボタンを押すと、ここでナビゲーションウィンドウにテーブルが表示されます。

ググったのですが、私が書いたコードと同じような内容ばかりでした。
保存がされないと表示がされないのかなとも思いましたが、保存をしないとアプリ側に表示されないというのもおかしいなと思いました。

以上より、
以下の2点教えて頂けますでしょうか。

  1. 何故この様な事が起きるのか?

 内部でどのような動きになっているのか良く理解できていません。
Office系のアプリケーションだからこの様なことがあるのでしょうか?
アプリケーションへの更新処理の部分がうまく行ってないのかなと感じているのですが、良くわかっていません。

  1. どういったコードの書き方が良いのか

 AccessではDAOオブジェクトかADOXでないとテーブル作成ができないとのことでした。
今回ADOXは使いたくないので、DAO一択かなと思っています。
そうすると、CreateTableDefsを使うしか方法はないのかなと思っています。
他にもこの様なモヤモヤが起こらないような書き方はあるのでしょうか?
もし有れば教えて下さい。

ソースコード

VBA

1Option Compare Database 2Option Explicit 3 4Sub createTable() 5 6 On Error GoTo Sub_Error 7 8 Dim dbs As DAO.Database 9 Dim table As DAO.TableDef 10 11 Set dbs = CurrentDb() 12 Set table = dbs.CreateTableDef("Sample1") 13 14 With table 15 .Fields.Append .CreateField("F1", dbInteger) 16 .Fields.Append .CreateField("F2", dbDate) 17 .Fields.Append .CreateField("F3", dbInteger) 18 dbs.TableDefs.Append table 19 dbs.TableDefs.refresh 20 21 End With 22 23Sub_Exit: 24 dbs.Close 25 Exit Sub 26 27Sub_Error: 28 MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & Err.Description, vbExclamation 29 GoTo Sub_Exit 30 31End Sub 32

その他

ADOやDAOを用いたAccessのお勧めの書籍などありましたら、教えて頂けるとありがたいです。

補足情報(FW/ツールのバージョンなど)

職場ではAccess2013、今後テスト時は2010を用意
自宅ではAccess2016を仕様しています。
現場ではAccess2010で実行しないといけません。

追記

F5キーをVBE側で押下した後、アプリケーション画面に戻りF5キーを押下すると、テーブルが表示されました。
そこで、Application.RefreshDatabaseWindowという一文を追加し、全体を下記の様にしたところ、表示されました。
画面の更新がされていなかっただけということでしょうか?

VBA

1Option Compare Database 2Option Explicit 3 4Sub createTable() 5 6 On Error GoTo Sub_Error 7 8 Dim dbs As DAO.Database 9 Dim table As DAO.TableDef 10 11 Set dbs = CurrentDb() 12 Set table = dbs.CreateTableDef("Sample5") 13 14 With table 15 .Fields.Append .CreateField("F1", dbInteger) 16 .Fields.Append .CreateField("F2", dbDate) 17 .Fields.Append .CreateField("F3", dbInteger) 18 19 End With 20 21 dbs.TableDefs.Append table 22 Application.RefreshDatabaseWindow 23 24Sub_Exit: 25 Set table = Nothing 26 dbs.Close 27  Set dbs = Nothing 28 Exit Sub 29 30Sub_Error: 31 MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & Err.Description, vbExclamation 32 GoTo Sub_Exit 33 34End Sub 35

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

F5キーをVBE側で押下した後、アプリケーション画面に戻りF5キーを押下すると、テーブルが表示されました。
そこで、Application.RefreshDatabaseWindowという一文を追加し、全体を下記の様にしたところ、表示されました。
画面の更新がされていなかっただけということでしょうか?

はい、そうだと思います。
DAOでの操作と、AccessアプリケーションのUIでの操作は、別系統ののものですので、DAOでの操作をAccessのUIに反映させるには、再読込、再描画等を実行して同期させる必用があります。

DAOでの操作はAccessがなくてもExcelやその他のアプリからでも可能ということからも、DAO と Accessアプリケーションは別物ということが分かりますね。

追記

AccessアプリケーションのUIから、今回と同じテーブルを作成するなら下記のコードになります。
この場合、実行後すぐにナビゲーションウィンドウにテーブルが表示されます。

vba

1DoCmd.RunSQL "CREATE TABLE Sample1(F1 INT, F2 DATE, F3 INT);"

さらに追記

DoCmd系の命令はUI操作になります。ただ、直接テーブルを作成するコマンドはないので、DoCmd.RunSQL でUIからSQLを実行しています。
簡単に記述できるのは、SQLだからです。

DAO経由でSQLを実行することも可能です。下記になります(再描画が必用になります)。

CurrentDB.Execute "CREATE TABLE Sample1(F1 INT, F2 DATE, F3 INT);"
Application.RefreshDatabaseWindow

SQLの場合、テーブルデザインの変更は ALTER TABLE ステートメントCREATE INDEX ステートメント でできます。

Access SQL を使用してテーブルの設計を変更する

ただし、SQLでは規定されていない、Accessのテーブルに独自に拡張されたプロパティは設定することはできません。
例えば、書式プロパティなどは、SQLではできないので、DAO(or ADOX)のオブジェクトを使って設定する必用があります。
Set prp = fld.CreateProperty("Format", dbText, "ggge/mm/dd")というように。

結局、書式とか定形入力とかのプロパティを設定したい場合、DAO(ADOX)ですることになりますね。

投稿2018/02/04 01:11

編集2018/02/04 05:42
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watarusugimoto

2018/02/04 02:26 編集

ありがとうございます。 こんなに簡単に書けるんですね。。。大変助かりました。 UI側からの操作はとても短くて簡単に書けるので魅力的ですね。 下記の様にプロパティの設定をしてみたのですが、UIからの記述方法を用いてフィールドプロパティの設定というのは出来ますでしょうか? Option Compare Database Option Explicit Private Sub CreateTable() On Error GoTo Sub_Error Dim dbs As DAO.Database Dim tbl As DAO.TableDef Dim fld As DAO.Field Dim prp As DAO.Property Set dbs = CurrentDb() Set tbl = dbs.CreateTableDef(”Sample") With tbl Set fld = .CreateField("F1", dbInteger, 255) .Fields.Append fld dbs.TableDefs.Append tbl Set fld = .CreateField("F2", dbDate) .Fields.Append fld Set prp = fld.CreateProperty("Format", dbText, "ggge/mm/dd") fld.Properties.Append prp Set fld = .CreateField("F3", dbInteger, 255) .Fields.Append fld End With Application.RefreshDatabaseWindow Sub_Exit: Set tbl = Nothing dbs.Close: Set dbs = Nothing Exit Sub Sub_Error: Resume Next MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & Err.Description, vbExclamation DoCmd.DeleteObject acTable, "Sample" GoTo Sub_Exit End Sub
hatena19

2018/02/04 05:44

「さらに追記」に書きました。
watarusugimoto

2018/02/04 05:55

Accessをやり始めたばかりでどう使って行こうか混乱していたのですが、説明を聞いて組んで行く方針が見えました。 ・テーブル作成⇒SQL文を発行して作成してExecuteで実行 ・Access独自のプロパティ⇒DAO又はADOオブジェクトから修正 で行こうと思います。 DoCmd SetPropertyというのも使用出来るのかなと思ったのですが、フォームコントロールのプロパティしか修正できないようだったので、上記の方法でやろうと思います。 大変助かりましたありがとうございました。
hatena19

2018/02/04 06:04

ちょっと疑問に思ったのは、設計時ではなく、運用時にテーブルを動的に作成するという設計はあまりない、というか推奨できることではないです。また、設計時ならわさわざコードで作成しなくてもUIで手作業ですれば済む話です。 どのような時にテーブル作成をするのですか。
watarusugimoto

2018/02/04 08:37

現場にあるデータベースを新旧対称のテーブルを作成して上書きする作業がありまして、 変換するテーブルを作成する部分でどうせならVBAで自動作成しようかなと考えました。 手作業でも良いのかもしれないですね。
hatena19

2018/02/04 12:56 編集

私の場合、運用用ファイルと開発用ファイルに分けて、開発用でアップデイトした場合は、そのまま上書きコピーします。そのほうが安全だし確実です。 さらに、下記のようにVBSで自動でアップデイトできるようにしています。 https://hatenachips.blog.fc2.com/blog-entry-422.html ご参考までに。
watarusugimoto

2018/02/04 09:37

ありがとうございます。 VBSの知識がないので良くわからないのですが、今回テーブルの作成は事前にやって行って現地で貼り付けた方が良さそうですね。 バージョンアップの話も参考にさせて頂きます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問