• ベストアンサー

AccessからExcelへ

Accessの任意のテーブルのデータを配列変数に代入しておいて、Excelの既にあるファイルの任意のセルを指定して転記して表を作成する・・・という事をしたいのですが。 Excelに出力するというマクロがあることも知っていますが、それをすると内容が書き換わってしまうだけでデータの追加が出来ませんし、Excelに出力した後列幅やら表示形式やらのレイアウトも同時にVBAで変更したいのですがうまくできません。 私DAOはある程度わかります。(古いバージョンを使用しているのでADOは使ったことがありません。)Loopや配列変数のプロシージャも一応理解できます。 こんな風にしたら出来ます、ないしはこの書籍に載ってます。という回答お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

以前仕事で作ったコードを単純にしたものです。こんな感じでアクセスからエクセルオブジェクトを操作できます。 Win98+オフィス2000で動作確認してますが、いくつか条件があります。エクセルシートのA列2行目以降に必ず何か値(数値など)が必要、A列には途中でNullのデータ(空白)が無いこと(A列にはNull許可されていないフィールドの値が既にある程度入っているという想定です)。 ご覧になればお解りかと思いますが、アクセスよりむしろエクセルのVBAの知識が必要です。エクセルはマクロを記録すればコードを吐き出してくれますから、それを参考にされると良いでしょう。 =================================================== Private Sub コマンド0_Click() Dim DB As DAO.Database Dim RS As DAO.Recordset Dim appExcel As Object Dim Worksheets As Object Set DB = CurrentDb Set RS = CurrentDb.OpenRecordset("テーブル名") 'エクセルオブジェクト生成 Set appExcel = GetObject("エクセルファイルのフルパス") Set Worksheet = appExcel.Worksheets("ワークシート名") '作業中はエクセルシートを非表示 appExcel.Parent.Windows(appExcel.Name).Visible = False With Worksheet '表の最下行を検出してデータ追加のスタート行を決める i = .Range("A1").End(4).Row + 1 RS.MoveFirst 'データ追加ループ Do Until RS.EOF = True .Cells(i, 1) = RS.Fields("フィールド1") .Cells(i, 2) = RS.Fields("フィールド2") RS.MoveNext i = i + 1 Loop '列幅調整 .Cells.Columns.AutoFit '書式 .Range("A:A").NumberFormatLocal = "#,##0_ " End With appExcel.Parent.Windows(appExcel.Name).Visible = True 'エクセルブックを閉じる appExcel.Close True ' オブジェクトの参照を解放 Set Worksheets = Nothing Set appExcel = Nothing MsgBox ("エクセルへの出力が終了しました") End Sub

souta_n
質問者

お礼

かなり具体的なコーディング例を提示していただき有難うございます。 さっそくExcelのサンプルデータファイルとAccessフォームとボタンを作成しClickイベントに、このコーディングを貼りつけて実験してみました。 Set Worksheet = appExcel.Worksheets("ワークシート名") のところで「変数が定義されていません。」というメッセージでコンパイルエラーが発生します。もし、何かお気づきの点があれば教えてください。 私の方もここまでのコーディング例を出してもらっているので、自分なりに調べてみようと思います。やはりExcel-VBAを勉強しとかないとオブジェクトの使い方とか判らないですね。 といっても、本屋で調べてみるのですが、ここらへんのExcel-VBAの参考文献になかなか当たらなくて・・・皆さんどうやって勉強しているのでしょうか?

その他の回答 (3)

回答No.4

#3です。すみません。変数名が2箇所ちがってますね。 Set Worksheet = appExcel.Worksheets("ワークシート名") With Worksheet 上の2箇所の Worksheet を Worksheets に訂正してください。 それで動くと思います。

souta_n
質問者

お礼

再度のアドバイスありがとうございます。2箇所訂正して、あとDIM i as Intger だけ追加したら見事に動きました。バッチリです。 これを応用して作業をすすめていきます。本当に有難うございました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>その部分がどんなコードを書いたらいいのかわかりません。 >DAOといってもAccess内の任意のテーブルのデータを参照するとか、 >書き換えるとか、追加するとか位しかやったことがなくて別のアプリケーションを起動して、 >書き込んで、そのアプリケーションを保存して、クローズして・・・ >というところが経験が無いのです。多分DIMでアプリを定義して、何かをSETしてとか。。。> >そんな感じのコードなんでしょうが・・・本屋でさがしてもそういう文献が見つからないのです。 DAOにそんな豊富な機能はありません。mdb内のテーブル操作等の操作ができるだけです。DataAccessObjectですし。 Excelに対して何かを行うのであれば、Excelのマクロがわからないと何にもできませんよ。 Excelのマクロを”知りません”、”わかりません”といわれても、マクロを使わなければできないことをしたいのですから。 >マクロ(VBA)自体は、MDBにあっても、Excelブック内にあってもかまいませ >ん。DAOが使えるのであれば、どちらからでもデータは取得できるんですし。 その通りだと思います。仮にAccessのフォームに、「EXCELデータに追加」というボタンがあって、そこをクリックしたら既存EXCELファイルにレコードが追加される(しかも必要フィールドや並びが変わる)、処理が終わるとAccessフォームに戻るという動きなら、Accesss側でVBAを組んだほうが良いのだろうと思ったのですが・・・ Accessのフォームが立ち上がっている状態からであれば、それでいいのでは? 最初の質問文からはそこまではわからなかったもので。 となると、AccessのVBAでDAOを使ってデータをデータを取得し、その結果をAccessからExcelをオートメーションで操作することになりますね。 具体的にはこんな感じになります。 Dim xlsApp As Object 'ExcelのAppliationのオブジェクトを取得 Set xlsApp = CreateObject("Excel.Application") あとは、取得したxlsAppのメソッドやプロパティを使って操作していきます。 Excelのメソッドやプロパティについては、Excelのヘルプを見てください。

souta_n
質問者

お礼

再度のアドバイスありがとうございます。この回答で何とか糸口がつかめそうです。Excelマクロが不得意であることは事実ですが、同じVBAですから何とかなると思います。ボケた質問をしていますが、真摯な対応をして頂き感謝しています。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>Accessの任意のテーブルのデータを配列変数に代入しておいて、Excelの既にあるファイルの任意のセルを指定して転記して表を作成する・・・という事をしたいのですが。 まず、配列変数に入れたい意味は何でしょう? DAOで取得した値をそのままExcelシートのセルに入れてはいけないんですか? つまり、Excelのマクロ(VBA)で、テーブルから取得してきた内容を任意のセルに入れればいいだけです。 マクロ(VBA)自体は、MDBにあっても、Excelブック内にあってもかまいません。DAOが使えるのであれば、どちらからでもデータは取得できるんですし。 また、AccessのVBAでExcelを制御することも可能ですので、こちらからExcelブックのレイアウト変更なども可能です。

souta_n
質問者

補足

>まず、配列変数に入れたい意味は何でしょう? AccessVBAはよく使いますが、ExcelのVBAにあまり経験がありません。配列変数というのは、多分シート・行・列番号を操作するのにはRangeで代入するときの指定に、2次元配列か3次元配列でやるのがいいのだろうなぁという憶測です。 >DAOで取得した値をそのままExcelシートのセルに入れてはいけないんですか? その部分がどんなコードを書いたらいいのかわかりません。DAOといってもAccess内の任意のテーブルのデータを参照するとか、書き換えるとか、追加するとか位しかやったことがなくて別のアプリケーションを起動して、書き込んで、そのアプリケーションを保存して、クローズして・・・というところが経験が無いのです。多分DIMでアプリを定義して、何かをSETしてとか。。。そんな感じのコードなんでしょうが・・・本屋でさがしてもそういう文献が見つからないのです。 >マクロ(VBA)自体は、MDBにあっても、Excelブック内にあってもかまいませ >ん。DAOが使えるのであれば、どちらからでもデータは取得できるんですし。 その通りだと思います。仮にAccessのフォームに、「EXCELデータに追加」というボタンがあって、そこをクリックしたら既存EXCELファイルにレコードが追加される(しかも必要フィールドや並びが変わる)、処理が終わるとAccessフォームに戻るという動きなら、Accesss側でVBAを組んだほうが良いのだろうと思ったのですが・・・

関連するQ&A

  • ADOでデータを送ってる最中はアクセスで検索やテー

    読み取り専用のエクセルファイルで エクセルのvbaでADOでエクセルデータをアクセスに転記してる時に アクセスでフィルタをかけてるとフリーズします。 ADOでデータを送ってる最中は アクセスで検索やテーブルへのアクセスはできないのでしょうか?

  • EXCEL VBA から ACCESS を操作したい

    EXCEL VBA から ACCESS(mdb)を操作したいのですが、 参考になるサイトがあれば教えて頂けないでしょうか? 一定時間毎にセルA1の値をInsertして蓄えていきたいのです。 あと、DAO と ADO どちらが良いかも教えて頂けないでしょうか? よろしくお願い致します。

  • ExcelにおけるDDEデータのイベントプロシージャについて

    DEEをつかって、Excelのセルにデータを出力しています。 そのセルのデータが変更された時に、自動でそのデータをコピーし別のシートにペーストしたいのですが、よろしければ助言をお願い致します。 イベントプロシージャの(worksheet_change)で試してみたのですが、任意でセルの値を変えないとプロシージャが動かず行き詰りました。 VBAも超初心者なのですが、よろしくお願い致します。

  • 現在Accessで開発をしています

    現在Accessで開発をしています ライブラリはADOを使用しております メインフォーム データ検索 帳票フォームに全データを出力 サブフォーム1  修正/削除  連結フォームにフィルタをかけて修正/削除を サブフォーム2  追加 非連結フォームで追加処理を データ件数が多いのと項目数が多いのでメインフォーム上では 修正/追加/削除はやらず サブフォーム(単票フォーム)を呼び出しそこでやる ことにしています 本当はサブフォーム1だけで修正/削除/追加をしたいのですが ADOだと非連結のフォームでは更新ができないとわかり 連結フォームで対応しました DAOでやろうかとも考えましたが、ADOとDAOの共存はメンテナンス等を踏まえ やめました。また、DAOは入りにくいのも理由です ちなみにSQLサーバーは将来使用しません あくまでAccess単体(MDB)のみの開発をすると想定して みなさんは、以下の3つどのパターンで開発をしていますか? 1、ADOのみ 2、DAOのみ 3、ADOとDAO両方 また、理由もお聞きしたいです よろしくお願いします

  • ADO使用か構造体等の使用か

    Excelでフォームを作って、そこからデータを吸い上げて保存用兼データ解析アプリケーションのデータ元となるようなCSVファイルへフォーム内容を書き込むというような、よくある操作を行うとします。 今までは、変数を宣言して配列を使ったり構造体を使ったりしていましたがデータベースを独学で学んでいるうちにVBAにもADOを使用したデータ操作が行える方法があることを最近知りました。 まだ、SQL的な書き方でものを作ったことが無いので実感が無いのですが上っ面だけ見ると細かく変数等を管理することが減るように思えるので今頼まれている内容にはADOを使用したものに挑戦してみようかと思っています。 経験者の方がいらっしゃいましたら、ADOを使用することの率直な利点と難点を聞かせてください。

  • Excel VBAにてMS SQL-Serverのmdfファイルとコネ

    Excel VBAにてMS SQL-Serverのmdfファイルとコネクションして取り込みたいと考えておりますが 通常のデータベースコネクションのようなADO,DAOにて接続可能なのでしょうか?  

  • ACCESSからEXCELを開いて印刷をかけたい

    お世話になっております。 環境 ACCESS2007、win7 ACCESS VBAを見よう見まねでコピーしながら作ってるぐらいの ど素人ですので、お手柔らかに願います。 会社パソにコードは入ってるんですが、家からの質問で コードを載せることが出来ないので それでも推察していただける方、ぜひ宜しくお願い致します。 テーブルにEXCELファイルのフルパスデータを溜めておいて、 それをVBAで一番最初のレコードから最後まで印刷をかけたいのです。 DO until fullpass.EOF ’fullpass ←EXCELファイルのフルパスデータ入れたテーブル fullpass![パス名] = insatu_file ’フルパス名を 変数に入れておきたい Workbooks.Open FileName:= insatu_file 省略(EXCELを操作するためのコード) fullpass.movenext loop て感じでネットで探したコードを切り貼りしながら作ったのですが、 フルパスを変数に入れるとこでエラーが出ます。 ”Update または CancelUpdate メソッドには、対応する AddNew または Edit メソッドが必要です。” 試しに、変数関係なしで直接フルパスを打ち込んでvba動かすと ちゃんとEXCEL開いて印刷しました。 すみません、ちんぷんかんぷんな説明なんですが わかる人いらっしゃったら助けてください<m(__)m>

  • MS-ACCESSで、レコードセットを取得したい。

    MS-ACCESS2000での質問です。 VBAのコードで、任意のテーブルから、レコードセットを取得して、ADO.Recordset変数に代入したいのですが、どのような記述をすれば、出来ますでしょうか? 最終的にはそのレコードセットの各レコードに操作をしたいのです。 よろしくお願いします。

  • エクセルのVBAでオブジェクトの配列変数は使えますか?

    VBですとオブジェクトの配列変数というか、コピーしたときに自動的に配列になってしまいますが、エクセルのVBAの場合でオブジェクトの配列変数は使えますか? なにをしたいかというと、ボタンが多すぎて一つ一つにプログラム定義は面倒、そこで配列にしてまわすことにしたいのですが、エクセルで可能でしょうか。 どなたかお願いします。

  • Accessの値をExcelに縦横入替出力させる

    現在、作業列を使って一旦AccessからデータをVBAでADOを使用して読み込み その後transpose関数で入れ替えているのですが 出力する前に縦横を入れ替えた状態にはできないのでしょうか?

専門家に質問してみよう