Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4691 / 13646 ツリー ←次へ | 前へ→

【55133】エクセルからAccessのアクションクエリを実行する方法 phoo 08/4/16(水) 15:22 質問[未読]
【55136】Re:エクセルからAccessのアクションクエリ... VBWASURETA 08/4/16(水) 16:31 回答[未読]
【55138】Re:エクセルからAccessのアクションクエリ... VBWASURETA 08/4/16(水) 16:35 発言[未読]
【55154】Re:エクセルからAccessのアクションクエリ... phoo 08/4/17(木) 12:32 質問[未読]
【55162】Re:エクセルからAccessのアクションクエリ... VBWASURETA 08/4/17(木) 15:16 発言[未読]
【55150】Re:エクセルからAccessのアクションクエリ... ichinose 08/4/16(水) 21:40 発言[未読]
【55153】Re:エクセルからAccessのアクションクエリ... phoo 08/4/17(木) 12:29 質問[未読]
【55155】Re:エクセルからAccessのアクションクエリ... ハチ 08/4/17(木) 13:50 発言[未読]
【55163】Re:エクセルからAccessのアクションクエリ... neptune 08/4/17(木) 15:35 発言[未読]
【55166】Re:エクセルからAccessのアクションクエリ... ichinose 08/4/17(木) 20:48 発言[未読]
【55167】Re:エクセルからAccessのアクションクエリ... VBWASURETA 08/4/18(金) 9:26 質問[未読]
【55160】Re:エクセルからAccessのアクションクエリ... Yuki 08/4/17(木) 15:08 発言[未読]
【55168】Re:エクセルからAccessのアクションクエリ... phoo 08/4/18(金) 15:49 お礼[未読]

【55133】エクセルからAccessのアクションクエリを...
質問  phoo  - 08/4/16(水) 15:22 -

引用なし
パスワード
   お世話になっております。
当方、VBA初心者です。

エクセルでAccessのアクションクエリを実行する方法を探しているのですが、どうしても見つからず・・・できないことはないと思うのですが、どなたかご教授いただけないでしょうか?
実行させたいのは「テーブル作成クエリ」です。

また、既存テーブルのレコードをすべて一括で削除する方法も教えていただければ。
漠然とした質問ですみません。

よろしくお願いします。

【55136】Re:エクセルからAccessのアクションクエ...
回答  VBWASURETA  - 08/4/16(水) 16:31 -

引用なし
パスワード
   ▼phoo さん:
こんにちは。

未確認ですが、多分VBからMDB操作と同じと思いますよ?
但し、DAOの参照設定が必要です。

//homepage2.nifty.com/inform/vbdb/dao_basic.htm

後、上記のHPにMDBのクエリーを使わなくても実行できる方法など
ありますので一度参考にしてください。

【55138】Re:エクセルからAccessのアクションクエ...
発言  VBWASURETA  - 08/4/16(水) 16:35 -

引用なし
パスワード
   ▼phoo さん:
追記です。

説明が漏れてました。
テーブル作成クエリですが、Accessと同じようにはできません。
最初にテーブル自体を削除する処理が必要になります。
これはVBで検証済みなので確かです。

【55150】Re:エクセルからAccessのアクションクエ...
発言  ichinose  - 08/4/16(水) 21:40 -

引用なし
パスワード
   ▼phoo さん:
こんばんは。SQLでテーブル作成なんて滅多にやらないんですが・・・。

一例です。

以下に示すコードを含むブックと同じフォルダ内に予めSample.mdb というmdbファイルを作成して置いてください(テーブルが一つもない状態で結構です)。


新規ブックの標準モジュールに

'============================================================
Sub main()
  Dim sql_str As String
  Dim retcode As Long
  If open_ado(ThisWorkbook.Path & "\sample.mdb") = 0 Then
    sql_str = "drop table testTable"
    Call exec_sql(sql_str)
    sql_str = _
       "CREATE TABLE testTable (ID integer CONSTRAINT tkey PRIMARY KEY ,氏名 varchar(20),住所 varchar(30));"
    retcode = exec_sql(sql_str)
    If retcode = 0 Then
     MsgBox "正常終了"
    Else
     MsgBox Error(retcode)
     End If
     
    Call close_ado
    End If
     
End Sub

別の標準モジュールに
ado関連のプロシジャー

'=====================================================================
Option Explicit
Public cn As Object
Function open_ado(fullname As String) As Long
  On Error Resume Next
  Dim link_opt As String
  link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
       "Data Source=" & fullname
  Set cn = CreateObject("ADODB.Connection")
  cn.Open link_opt
  open_ado = Err.Number
  On Error GoTo 0
End Function
'===========================================================
Sub close_ado()
  On Error Resume Next
  cn.Close
  Set cn = Nothing
  On Error GoTo 0
End Sub
'==========================================================
Function exec_sql(sql_str) As Long
  On Error Resume Next
  cn.Execute sql_str
  exec_sql = Err.Number
  On Error GoTo 0
End Function


として、mainを実行してください。

フィールド名  データ型         主キー
ID       整数型          主キー
氏名      テキスト型 20文字制限
住所      テキスト型 30文字制限


というテーブルが作成されます。


又、

>また、既存テーブルのレコードをすべて一括で削除する方法も教えていただければ。

は、

Delete * from testTable

というSQLでいけると思います。

上記は、ADOで行っていますが、DAOでも大丈夫ですよ!!

試してみてください

【55153】Re:エクセルからAccessのアクションクエ...
質問  phoo  - 08/4/17(木) 12:29 -

引用なし
パスワード
   ichinoseさん

ご丁寧に教えていただきましてありがとうございます。
ただ、私がしたいことは新しいテーブルを作成するのではなく
テーブル作成クエリを実行して既存テーブルの複製を作りたいのです。
つまり、既存テーブルのバックアップをとりたいのです。
言葉足らずで申し訳ございませんでした。


クエリを使用せずに複製をつくることが可能であれば、その方法でも
構わないのですが、、いろいろ調べてみても探し出すことができません。
引き続きご教授いただけませんでしょうか。

【55154】Re:エクセルからAccessのアクションクエ...
質問  phoo  - 08/4/17(木) 12:32 -

引用なし
パスワード
   VBWASURETAさん

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

教えていただいたSiteで調べてみましたが、私がやりたい既存テーブルの複製をつくる
というものがなく・・・他でもいろいろ調べてみましたが見つけることができませんでした。

何か良い方法がございましたら教えていただけませんでしょうか?

よろしくお願いします。

【55155】Re:エクセルからAccessのアクションクエ...
発言  ハチ  - 08/4/17(木) 13:50 -

引用なし
パスワード
   ▼phoo さん:
>
>ご丁寧に教えていただきましてありがとうございます。
>ただ、私がしたいことは新しいテーブルを作成するのではなく
>テーブル作成クエリを実行して既存テーブルの複製を作りたいのです。
>つまり、既存テーブルのバックアップをとりたいのです。
>言葉足らずで申し訳ございませんでした。

つまり、ストアドプロシジャを実行したい ということですか?
自分はAccessのことは良くわかりませんが、
アクションクエリがストアドプロシジャだとして・・・

例:Access上のアクションクエリの名前が"testTable_Copy"の場合
ichinoseさんのコードでいけば、

sql_str = "EXECUTE testTable_Copy;"

これで動きそうな気がします。間違ってたらスイマセン。

【55160】Re:エクセルからAccessのアクションクエ...
発言  Yuki  - 08/4/17(木) 15:08 -

引用なし
パスワード
   ▼phoo さん:

>実行させたいのは「テーブル作成クエリ」です。
>
>また、既存テーブルのレコードをすべて一括で削除する方法も教えていただければ。

こんな感じです。
DAO の参照設定をして下さいね。

Sub TABLE_CREATE()
  Dim apAcc  As Access.Application
  Dim db   As DAO.Database
  Dim qdf   As DAO.QueryDef
  Dim strSQL As String
  Dim strNM  As String
  
  strNM = "D:\hoge.mdb"
  
  Set apAcc = CreateObject("Access.Application")
  apAcc.OpenCurrentDatabase strNM

  Set db = apAcc.CurrentDb
  
    ' テーブル作成クエリ *********************
  On Error Resume Next                ' 作成されるテーブルがある場合
  strSQL = "DROP TABLE 作成するテーブル名"  ' 作成されるテーブルを削除
  db.Execute strSQL
  On Error GoTo 0
  
  Set qdf = db.QueryDefs("テーブル作成クエリ") ' テーブル作成クエリ実行
  qdf.Execute
  qdf.Close

  ' テーブル内容クリア **********************
  strSQL = "DELETE FROM クリアするテーブル名"
  db.Execute strSQL
  db.Close
  
  apAcc.Quit
  Set qdf = Nothing
  Set db = Nothing
  Set apAcc = Nothing
End Sub

【55162】Re:エクセルからAccessのアクションクエ...
発言  VBWASURETA  - 08/4/17(木) 15:16 -

引用なし
パスワード
   ▼phoo さん:
こんにちは。

あのばっくあっぷだけでしたら、1度実行するだけですよね?
であれば、テーブル作成クエリのままで出来ます。
但し、2回目以降はテーブルを消すロジックが必要ですという意味で書いてます。
実行するとわかりますが、すでにテーブルが存在しますと落ちますから。

書いたHPのやり方でクエリーの実行が可能ですから既存のテーブルを
元にテーブル作成クエリーを作れば良いだけです。

後、バックアップだけでしたら単純にmdbファイルをコピーするだけでは
ダメなのでしょうか?

【55163】Re:エクセルからAccessのアクションクエ...
発言  neptune  - 08/4/17(木) 15:35 -

引用なし
パスワード
   ▼phoo さん:
こんにちは
お邪魔します。

>テーブル作成クエリを実行して既存テーブルの複製を作りたいのです。
>つまり、既存テーブルのバックアップをとりたいのです。
なら、もう既に技術論は提示されていますのでパスしますが、
私も、VBWASURETA さんと同じく、
・mdb内のクエリをキックするか、
・mdbそっくりそのままコピー、
・csvファイルにして、吐き出しておく。
のどれかを選択します。

mdbが壊れる事があるのは周知ですからBackUPが大事です。
ほんとに壊れると泣きますよ。^ ^;;

【55166】Re:エクセルからAccessのアクションクエ...
発言  ichinose  - 08/4/17(木) 20:48 -

引用なし
パスワード
   こんばんは。

>
>ご丁寧に教えていただきましてありがとうございます。
>ただ、私がしたいことは新しいテーブルを作成するのではなく
>テーブル作成クエリを実行して既存テーブルの複製を作りたいのです。
>つまり、既存テーブルのバックアップをとりたいのです。
バックアップなら、MDBファイルの自体をコピーという意見が出ています。
そのとおりだと思いますが、phooさんの仕様を尊重してテーブルを複製するクエリです

前回の投稿のado関連のプロシジャーはそのまま使います。

前回と同様にこのブックと同じフォルダに空のsample.mdbは作成して置いてください。

mainを以下のように変更しました。

'===================================================
Sub main()
  Dim sql_str As String
  Dim retcode As Long
  If open_ado(ThisWorkbook.Path & "\sample.mdb") = 0 Then
    sql_str = "drop table testTable"
    Call exec_sql(sql_str)
    sql_str = "drop table copyTable"
    Call exec_sql(sql_str)
'    ↑一度、テーブルを削除   
   
    sql_str = _
       "CREATE TABLE testTable (ID integer PRIMARY KEY ,氏名 varchar(20),住所 varchar(30));"
    retcode = exec_sql(sql_str)
'   ↑testTableの作成 ID 氏名 住所 がフィールド名
    If retcode = 0 Then
     sql_str = " INSERT INTO testTable " _
            & "(ID,氏名,住所) VALUES " _
            & "(1, 'ichinose', '山梨県');"
     retcode = exec_sql(sql_str)
'     testTableに1レコードだけ作成 ID=1 氏名=ichinose 住所=山梨県
     If retcode = 0 Then
       sql_str = "select * into copyTable FROM testTable"
       retcode = exec_sql(sql_str)
'        testTableのコピーをcopyTableという名前で作成
       If retcode = 0 Then
        MsgBox "バックアップ終了"
       Else
        MsgBox Error(retcode)
        End If
     Else
       MsgBox Error(retcode)
       End If
    Else
     MsgBox Error(retcode)
     End If
     
    Call close_ado
    End If
End Sub

これで試してみてください。

【55167】Re:エクセルからAccessのアクションクエ...
質問  VBWASURETA  - 08/4/18(金) 9:26 -

引用なし
パスワード
   皆さんおはようございます。

ちょっと気になったので、質問します。
もしかしたらデータベースがMDBではないとかないですか?
例えばデータベースはSqlServer4.0とかOracle9.0で
MDB内にはリンクテーブルのみであるためにテーブルの
型を作る必要があるとかではないですか?
これでしたら新規テーブル作成クエリーを実行する
必要があるという意味がわかりますし。

ただ、これでしたら最初から書くようにしないと皆さん間違えた
回答をしますよ?

因みにこの内容で正解でしたら、mdbのクエリーや、
皆さんの書いている方法では失敗します。

なので、皆さんによくアナウンスしている事ですが
環境は書くようにして下さいということです。

【55168】Re:エクセルからAccessのアクションクエ...
お礼  phoo  - 08/4/18(金) 15:49 -

引用なし
パスワード
   みなさまのお陰でなんとかバックアップをとることができました。
ほんとーにありがとうございました。
勉強になりました。

また何かありましたら質問させていただきます。
その時はよろしくお願いします。

4691 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free