人に聞けない痔の悩み、これでスッキリ >>

お世話になります。

仕事でアクセスファイルのリンクテーブル一覧を作成しなければならず、下記のsqlを用いて作業を進めています。


  SELECT Name, Database
  FROM MSysObjects
  WHERE Type=6
  ORDER BY Name;


ところがこの時不思議な現象が起きます。
というのも、splで表示させたリンクテーブルの方が、リンクテーブルマネージャーで表示させたリンクテーブルよりひとつ二つ多かったりするのです。

これはどういった原因で起こり得る現象でしょうか。

削除済みのリンクを拾っているのでしょうか。
もしくは、VBAでこっそりリンクしているテーブルがあるのでしょうか。

何卒アドバイスのほどよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

Access2007は持ち合わせていませんが2010では



オブジェクト(ナビゲーションウィンドウのテーブル名)上で右クリック
「このグループに表示しない」を選択すれば隠しオブジェクトになります。
表示したい場合は、
ナビゲーションオプションで隠し『オブジェクトの表示』にチェックを入れ
グレー表示されているオブジェクト上で右クリック、「このグループに表示」です。
隠しオブジェクトになっている場合はリンクテーブルマネージャには表示されませんね。

この回答への補足

お世話になっております。
ご指摘の通り、隠しオブジェクトとシステムオブジェクトを表示させたところ、差分のリンクテーブルが現れました。

ありがとうございます。

最後に一点確認させていただきたいのですが、隠しオブジェクトはユーザが意図的に隠しオブジェクトに設定したとわかるのですが、システムオブジェクトとなっているリンクテーブルはどういう理由でシステムオブジェクトとなるものなんでしょうか?やはりVBA関係というところでしょうか?

補足日時:2013/07/11 12:20
    • good
    • 1
この回答へのお礼

お世話になっております。
どういう要因でリンクテーブルがシステムオブジェクトになるのか知りたいところですが、十分有益なご回答を頂いたため、明日中に誰からも追加コメントありませんでしたら、こちらでベストアンサーさせていただきます。

お礼日時:2013/07/11 23:23

#2のTabledefのConnect(接続文字列)にヒントが隠されているかもしれませんが、


当方では、
リンクテーブルでかつシステムオブジェクトであったケースは覚えがないので分からないです。
VBA云々は関係ないだろうとは思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/07/12 09:17

とりあえず全部表示してみてください。


Access 2007/2010 で「隠しオブジェクト」「システムオブジェクト」を表示したい
http://pasofaq.jp/office/access/access2007hidden …

あるいは、イミディエイトウィンドウで
?currentdb.tabledefs("問題のテーブル名").connect
と入力して、Enter キー で何か返ってくればリンクテーブルです。

この回答への補足

ありがとうございます。明日朝一番で会社に着いたら試してみます。

なお、一点確認させていただきたいのですが、リンクテーブルがすべてリンクテーブルマネージャー上に表示されると考えては早計という認識でよいのでしょうか。

補足日時:2013/07/11 01:05
    • good
    • 0

内部で一時ファイル作ってるのかも。



ご自身で把握できてるテーブル名一覧と差を取れば良いのでは?

この回答への補足

なるほど一時ファイルですか。
その場合もリンクファイルとして検索されるのでしょうか?

把握できてるテーブル名一覧と差を取ることで、どのテーブルが差分なのかは把握できているのですが、それらのテーブルがどこでどういう風に使われているのか分からない状況です。(結果として、SQL表示か、リンクテーブルマネージャーのいずれが正か分からない状況です。)

ちなみにご存知なら教えていただきたいのですが、「外部データの取り込み」のインターフェイスからリンク設定せずに、VBA内でこっそりリンク処理されている場合は、リンクテーブルマネージャには該当テーブルが表示されないのでしょうか。

何卒よろしくお願いいたします。

補足日時:2013/07/10 23:14
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessでテーブル名やクエリ名一覧の抜き出し

Accessでテーブルやクエリを沢山(100個以上?)使っております。

そこで、テーブル名やクエリ名の管理をしたいので、テーブル名(クエリ名)の一覧を抜き出したいのですが、どうすればいいのでしょうか?
または、そういうことは無理なのでしょうか??(;O;)

1個づつコピーペーストでテールブル名をエクセルに貼り付けて行こうかな?と思ったのですが、さすがに数が多すぎるので困っております。

できるだけ簡単な方法がいいのですが、もしなければVBAでもいいです。

おわかりの方がいらっしゃいましたら、よろしくお願いします。

Aベストアンサー

・クエリを新規作成
・以下SQLを貼り付け
SELECT MSysObjects.Type, MSysObjects.Name, MSysObjects.Flags
FROM MSysObjects
ORDER BY MSysObjects.Type, MSysObjects.Name;
・デザインビューで表示
あとは、TypeとFlagsの条件を変えてあげれば一覧できます。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qテーブルリンク リンク元を知りたい

テーブルリンクをしているmdbファイル使っていますが
テーブルを右クリックして「リンクテーブルマネージャー」をクリックすると
フルにインストールしてないからか「この機能は現在インストールされていません。」となります。

オフィスを再インストールする以外でリンクがどのファイルに紐付いてるかわかる方法はありますか?
テーブルのプロパティを見てもリンク元が判りませんでした。
VBAでコマンドを打てばわかりますか?

アクセス2003です。

Aベストアンサー

リンクテーブルをデザインビューで開きます。
何やら注意分っぽいのが出ますが気にしなくて構いません。『はい』を選択
開いたらそのデザインビューで右クリックしてプロパティを出すと
その中の『説明』で分かります。

また、VBEのイミディエイトウィンドウで
?currentdb.TableDefs("リンクテーブル名").connect
とかでも確認できます。

多分ね。何らかのセキュリティの設定がしてあるとダメかも?

QAccessのリンクテーブルマネージャーをフルパスで見る方法を教えて下さい。

Accessのアドインにあるリンクテーブルマネージャーの中のリンクテーブル場所が長くて、枠から隠れてしまいます。どこにあるのかフルパスで見れるようにしたいのですすが、なにかいい方法はありませんか?よろしくお願いします。

Aベストアンサー

ツールの解析にあるデータベース構造の解析を使用します。
リンクテーブルにチェックを入れOKボタンをクリックするとプレビューが表示されます。
その右上にDATABASE=の後にフルパスが出ています。

QACCESSのテーブル名をリストにしたい

ACCESSのデータをADOで操作したいのですけれども,
ACCESSのテーブル名をリストにする方法がわかりません。
教えてください。お願いします。

Aベストアンサー

どもども 田吾作8です。←1増えた

前回うそをいいました。
カタログのTable内には、クエリーも含みます。
以下のコードを一度実行してください。

'【機能】:テーブル・クエリーをイミディエイトウィンドウへ出力
'【パラメータ】 DBファイルのフルパス
Sub DebugTables(inDbFileName As String)
Dim strConnect As String
Dim wkCnn As ADODB.Connection
Dim wkCat As ADOX.Catalog
Dim wkTbl As Table

'接続の文字列
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & inDbFileName & ";"

'DBに接続
Set wkCnn = New ADODB.Connection
wkCnn.Open strConnect

'カタログにセット
Set wkCat = New ADOX.Catalog
wkCat.ActiveConnection = wkCnn

'テーブル・クエリーをイミディエイトウィンドウへ出力
For Each wkTbl In wkCat.Tables
Debug.Print wkTbl.Type & " : " & wkTbl.Name
Next wkTbl

PGMEND:
'それぞれ開放
Set wkTbl = Nothing
Set wkCat = Nothing
wkCnn.Close
Set wkCnn = Nothing
End Sub

出力をするとwkTbl.Type には、分類すると4タイプあることがわかると思います。
[View] はクエリーです。
[Table] はテーブルです。
他には [ACCESS TABLE]と[SYSTEM TABLE] が存在します。
これらは、アクセスで開いても普段は出てきませんよね。
しかし、設定すると見えるようになります。
1.DBをアクセスで開く
2.メニューバーの[ツール][オプション]を選択
3.[表示]タブのシステムオブジェクトのチェックをONする
これで見えるようになります。
もしアクセスのアドインを作成したりするようなのであれば、これらを使うかも知れませんが、普通ならば無視しててもいい、システム関係のテーブルです。


知ってると思いますが、あくまで余談で・・・
ADOは大変便利です・・・がっ!、注意点が一つ。
ADOで作成したクエリーはアクセスからは見ることが出来ません。

ADOはあまり使ったことがないようにお見受けしたので、参考までに・・・

でわでわ

どもども 田吾作8です。←1増えた

前回うそをいいました。
カタログのTable内には、クエリーも含みます。
以下のコードを一度実行してください。

'【機能】:テーブル・クエリーをイミディエイトウィンドウへ出力
'【パラメータ】 DBファイルのフルパス
Sub DebugTables(inDbFileName As String)
Dim strConnect As String
Dim wkCnn As ADODB.Connection
Dim wkCat As ADOX.Catalog
Dim wkTbl As Table

'接続の文字列
strConnect = "Provider...続きを読む

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QAccessのリンク先を相対パスにしたい

Access2010をつぎのような環境で開発しています。

c:\開発\データ.accdb  テーブル定義と実データ格納
c:\開発\アプリ.accdb  データ.accdbのテーブル定義へのリンクとフォームなど

これを本番のネットワーク環境 “\\network\本番” に設置した場合、
「c:\開発\データ.accdbは無い」旨のエラーになってしまいます。
また、本番環境のパス名はインストール先によって異なります。

Access2010のリンクマネージャでは絶対パスでのリンクしか定義できないようですが、
カレントパスに変更するには、アプリ.accdb を起動時に毎回、動的に変更するしかないのでしょうか?

お教えいただきたくお願いいたします。

Aベストアンサー

データ.accdb と アプリ.accdb が同じフォルダ内にあって
アプリ.accdb のリンク先を
その同じフォルダ内のデータ.accdbに設定するのなら、
VBAになりますが、アプリ.accdb に(例は標準モジュールです)

Sub reLink()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim lnkPath As String
Dim i As Integer

lnkPath = CurrentProject.path
Set db = CurrentDb
For Each tdf In db.TableDefs
If Len(tdf.Connect) <> 0 Then
tdf.Connect = ";DATABASE=" & lnkPath & "\データ.accdb"
tdf.RefreshLink
End If
Next
db.TableDefs.Refresh
End Sub

というのを一回実行すればリンク先が変更されます。

ただ、アプリ.accdb も共有フォルダ内に置いて、みんなが使うのは、
アプリ.accdb が壊れる可能性が高まる。
アプリ.accdb のデータもネットワークを流れるのでパフォーマンスが良くない。
という点でお勧めできません。
アプリ.accdb は各ユーザーに配布して使ってもらった方が吉。
データ.accdb のバックアップも抜かりなく。

データ.accdb と アプリ.accdb が同じフォルダ内にあって
アプリ.accdb のリンク先を
その同じフォルダ内のデータ.accdbに設定するのなら、
VBAになりますが、アプリ.accdb に(例は標準モジュールです)

Sub reLink()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim lnkPath As String
Dim i As Integer

lnkPath = CurrentProject.path
Set db = CurrentDb
For Each tdf In db.TableDefs
If Len(tdf.Connect) <> 0 Then
tdf.Connect = ";DATABASE=" & lnkPath & "\データ.accdb"
tdf...続きを読む

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QAccessの画面更新を一時的に停止する方法。

こんにちは。
Accessの画面更新を一時的に停止する方法を捜しています。
ExcelのScreenUpdatingと同様な機能です。

VBAでの更新処理時に画面がチラチラと動くのを防止したいと思っています。
(Ver:Access2000)
ご存知の方宜しくお願い致します。

Aベストアンサー

Application.Echo False '画面の描画を止める

・・・処理を実行する・・・

Application.Echo True '画面の描画を行う


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

人気Q&Aランキング