dポイントプレゼントキャンペーン実施中!

テーブルを、たとえそれが存在しなくてもメッセージが出ないで、削除したい。
Access2007を使っています。仮にテーブルAとします。テーブルAが存在している場合は、drop tableなどで簡単に消せます。が、存在しない場合は、エラーまたはメッセージが出てしまいます。やりたいことは、テーブルAが存在してもしなくても、メッセージが出ないようにして、テーブルAが存在しない状態にしたいのですが。SQLビューで(または簡単に)実現する方法はあるのでしょうか?
初心者のため、些細なことでつまづいています。

A 回答 (5件)

#2です。



少し説明しますと、ボタンクリック時に
関数funcTableExistsでシステムに登録されている
テーブルがあるかを確認し、あればTrueを無ければ
Falseを返します。つまり、
If funcTableExists("テーブル名") Then
はテーブルがあれば、
DoCmd.OpenQuery ("削除クエリ名")
を実行、すなわち 削除クエリ名 を実行する、
ということです。少々難しい
かもしれませんが、このようにして
Accessからのメッセージを回避します。

なお、
DoCmd.SetWarnings False
はアクションクエリの実行に伴うAccessからの
確認メッセージを回避し、
DoCmd.SetWarnings True
は確認メッセージの出力を元に戻しています。
    • good
    • 1

#1、#2、#3 です。


説明が足りないような気がするので少し捕捉
しておきます。
Drop Tableを実行した場合、対象となるテーブルが
無い場合、SQLの中でテーブルが無い場合に対応は
できません。したがって、Drop Tableを実行する
場合に、テーブルが無いときにエラー表示が
されないようにするにはプログラムからDrop Tableを
実行するようにしてテーブルが無ければ実行しない、
あれば実行するというプログラムを組む必要が
あるために、#2のようなプログラムを提示しました。
簡単、というわけにはいかないのですが、どちらか
というと、このような場合の常套手段のような方法です。

以上です。
    • good
    • 1
この回答へのお礼

piroin654さん、なんども有り難うございました。とくに、ANO.3の丁寧なご回答に感謝致します。
VBAもよく知らない初心者であることを実感しました。
SQLクエリでは無理ということも了解しました。
現実には、私の質問内容のような要請は多いと思うのですが、Accessには当初からその機能がないということに、むしろAccessの設計自体に何か本質的な弱点があるのではないかとも思いました。まあ、MSに対する逆恨みかもしれませんが…

お礼日時:2010/11/13 14:26

Access2007は持ち合わせておりませんので見当違いかも知れませんが


安直な方法は
Sub AAA()
On Error Goto ErrHndl
ここで処理
Exit Sub
ErrHndl:
End Sub
等のように逃げてしまえば良いのでは?

あるいは
DCount("*","MSysObjects","name='テーブルA' and type=1")
でゼロでなかったら・・・
Access2007だとセキュリティの面でで叱られるかも
そもそもシステムテーブルにMSysObjects が無かったりして (^^ゞ

もしくはテーブル名を取得しての処理かと。
以下はADOでテーブルが存在するかの関数です。
tblExist("テーブルA") で存在しなければ、False が返ります。
適宜加工してみてください。
Function tblExist(tblName As String) As Boolean
Dim adoCn As ADODB.Connection
Dim adoRs As ADODB.Recordset

Set adoCn = CurrentProject.Connection

Set adoRs = adoCn.OpenSchema(adSchemaTables, Array(Empty, Empty, tblName, "TABLE"))

If adoRs.EOF And adoRs.BOF Then
tblExist = False
Else
tblExist = True
End If
adoRs.Close: Set adoRs = Nothing
adoCn.Close: Set adoCn = Nothing
End Function
    • good
    • 0

大いなる勘違いでした。


テーブルが無い場合でしたね。
以下のようにしないとメッセージは出ます。

フォームにボタンを一つ張り付け以下のコードを
フォームのコード表に張り付けて保存してください。
コマンド0_Click()のテーブル名と削除クエリ名は
使用しているテーブル名とクエリ名を入れてください。
コマンド0のボタン名は作ったボタンの名前に合わせて
ください。

なお、DAOを使用しているので、コード表のツール→参照設定
から、Microsoft DAO xx Objectlibrary にチェックを
いれてください。なお、xxは3.6のような数字です。
また、Microsoft ActiveX Objects xx Library にチェックが
入っていたらはずしてください。


Private Function funcTableExists(ByVal strTableName As String) As Boolean
Dim db As Database
Dim tdf As TableDef
Set db = CurrentDb

For Each tdf In db.TableDefs
If (tdf.Name = strTableName) Then
funcTableExist = True
Exit Function
End If
Next tdf
Set tdf = Nothing
db.Close
Set db = Nothing
End Function

Private Sub コマンド0_Click()
If funcTableExists("テーブル名") Then
DoCmd.SetWarnings False
DoCmd.OpenQuery ("削除クエリ名")
DoCmd.SetWarnings True
End If
End Sub
    • good
    • 0

以下の方法。



(1)Officeボタン→Accessのオプションのボタンをクリック
(2)Accessのオプションのダイアログ詳細設定をクリック
(3)編集の確認の項のアクションクエリのチェックをはずす。
(4)OKをクリック

あるいは、

Private Sub コマンド0_Click()
Docmd.SetWarnings False
DoCmd.OpenQuery "削除クエリ名"
Docmd.SetWarnings True
End Sub

のように、フォームのボタンクリックで
行なう方法。
    • good
    • 0

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

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


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