• ベストアンサー

AccessからExcelブック作成でメモリ不足

Access97から社員マスタを基に、一人1ブックずつExcelデータをバッチで作成しています。一人ずつの処理なら問題なくできますが、400名を一度に実行すると、Excelの「メモリ不足」でハングアップしてしまいます。 Accessのフォーム上で区分を入力し、それをもとに個々にどのブックを開くか判断してOPENします。内容をセットして別名で保存しています。 一人ずつの各ループの中でExcelの起動・終了をしているのがまずいのでしょうか?

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

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

400ファイル出力時に エクセルを自動起動していますか? (しないことをおすすめします) していないのにダメな場合は まとめたものを1ファイルとして 出力したものを使うのが良いのでは ないでしょうか。 ファイル出力というのは そうです、EXCELです。 一つひとつを画面で開くと 重いのではないでしょうか。 開いてますか、基になる各ブックを。 (画面上に表示されないような処理 をおすすめします) もし面倒でなければ少し詳しく 処理、画面の流れを説明してください。

maho0515
質問者

補足

本当にていねい説明していただいてありがとうございます。 長くなりそうですが、もう1回最初から説明します。 Excelの画面は起動していません。 Acessテーブルとして社員マスタがあります。それと部署マスタ。 (社員マスタの内容は、番号、氏名、所属、役職、職種、身分・・) 社員1人1ブックでEXCELデータを作成しますが、その際にテンプレートとなるブックを、役職・職種で判断し選択しています。(これは別関数) 更に作成したブックは部署ごとにフォルダを自動作成してそこに保存しています。(これも別関数) PGとしては本当に単純な構造ですが ・SQL文で社員マスタから対象社員をセレクト(レコードセット作成) ・Excelオブジェクト作成(Set exce = = CreateObject("Excel.application")) ・レコードセットの社員コードでループ    社員マスタの役職・職種から対象テンプレートを選択    そのブックを開く    値をセットする    保存先のフォルダ名取得    別名で保存    そのブックをクローズ(false) そのシートオブジェクトを開放    ブックオブジェクト変数開放 ・ループ抜け    Excel終了(オブジェクト.Quit) Excelのオブジェクト変数開放 処理終了 以上です。今までいただいたアドバイスをもとに、じっくりもう一度やってみようと思います    

その他の回答 (2)

回答No.2

2.セットすべきデータをファイル出力についてですが 処理の内容が分からないので推測ですが 個別に400ファイル出力しても 400人分を1ファイルとして出力しても 可能だと思います。 個別ブックと個々のデータをつなぐ 情報があれば。 あとはExcel/VBAで処理するということです。 画面の見た目では アクセスを動かして 自動でエクセルが処理して アクセスに戻ってくるイメージ なのでご希望に近いものではないかと思います。

maho0515
質問者

補足

>個別に400ファイル出力しても この部分でコケてしまってます。(メモリ不足) ・・というよファイル出力というのはEXCELに、と考えていいんでしょうか? いわゆる社員マスタの内容を1人1ブックで出力していますが 社員の役職や職務内容に応じてPGで基となるブックを切り替えたり しています。

回答No.1

根本的な解決になっていませんが エクセルの起動をせず、ファイルの出力だけ まとめて行ってしまってから エクセルで処理をするというのではだめでしょうか。 個々のブック用のデータをそれぞれ一括で作成してしまい、 あらためてエクセルで処理する。 処理のイメージ 1.アクセスのフォームで区分を入力 2.セットすべきデータをファイル出力 (一時保管用。エクセル自動起動はしない) 3.400人終了したらマクロを持った エクセルファイルを起動 (アクセスから=エクセル自動起動する) 4.エクセルファイルはファイルを 開いた時に自動開始するマクロを持っている。 2で出力したファイルと個々のブックを 照合しながら内容をセット、別名保存を 400ファイル、自動で繰り返して 終了したら、エクセルを自動終了 5.アクセスに戻る。 というのはどうですか。 不明、不足は質問ください。 他には、エクセルが複数起動しようとしているかもしれません。 この場合はWindowsのAPIでエクセルの終了を確認してから 次の処理に移る(次の人の処理に移る)制御をしないと いけないのかもしれません。APIは詳しくありませんが。

maho0515
質問者

補足

>2.セットすべきデータをファイル出力 >(一時保管用。エクセル自動起動はしない) の意味がわからないのですが。とりあえず一覧形式でシートに吐き出して あとはすべてExcel/VBAで処理するということなのでしょうか?

関連するQ&A

  • ACCESSとEXCELの連携に関して

    現在マスタの登録業務でEXCELを中心に行っているのですが、件数が10万件を超えておりACCESSに格納しています。 そこで、こちらであらかじめ指定したマスタ名称(キー項目)をEXCEL上に並べておき、ACCESSからその他のマスタ項目を名称の隣にずらりと持ってきたいのですが追加編集を行いたいのですがそんな事可能なのでしょうか?ご教授願いたく。 例>Access マスタ名称 金額 区分 AAAA 100円 原料 BBBB 500円 容器 CCCC 600円 原料 Excel(マスタ名称のみ予め記述しておく) マスタ名称 AAAA←ここに対して金額と区分をACCESSから引っ付けたい CCCC← ※EXCELをACCESSに一度インポートしてクエリ作成する等はしたくないのです。

  • 複数のブックの同じセルを参照したい、(Excel2000)

    Win98でExcel2000を使っています。 あるフォルダにまったく同じレイアウトのブックが、社員の人数分あります。 (Accessから社員のマスタを使ってはきだしたブックなので、数やファイル名は可変です。) これらのブックのある1つのセルを参照して合計値等を計算したいと思っています。 (イメージ的には、全ブックを串刺しにするような感じでしょうか?) やり方が思いつきません。 何かい方法ありますでしょうか?

  • Excel2013で複数のブックの表示を切換たい

    Excel2013で複数のブックを開いている時、フォームのボタンで表示するブックを切り替えたいのですが・・・。 Excel2013で複数のブック1~5を開いているときにVBA(ブック5.Activate)を使って、ブック5を前面に持ってきたいのですがうまく行きません。 詳細は、ブック1~5が既に開いている状態で、「ブック1の作業を終了しますか?」というフォームの「終了」ボタンを押すと新しいフォーム(ブック5で行う作業内容や手順の書かれたもの)を最前面に表示し、その背面にブック5を表示したいのですが、現状は、新しいフォームは最前面に表示されるのですが、ブック5は、ちゃんと新しいフォームの背面に表示されるときもあれば、ブック1~4のさらに背面に表示されたり、ブック1の背面に表示されたりとランダムな位置に表示されてしまいます。何か良い方法がございましたら教えて頂きますようお願い致します。

  • Access2010のリンクテーブルについて

    Access2010のリンクテーブルについて質問をさせてください。 現在、社内ではExcelシートで対応ログを残しています。 ログ入力や検索のことを考えれば、Accessへ移行するべきだと思うのですが、現在その予定はありません。また、ここで対応内容に応じて「区分」を付加していきたいと考え、以下のことを行いました。 1.ExcelシートをリンクテーブルとしてAccessに取り込み。  [対応テーブル]   ・対応NO   ・対応内容 2.今後加えていきたい区分のテーブルを作成  [区分マスタ]   ・区分NO   ・区分名 3.AccessでExcelシートは更新できないので、1と2をもとにしたテーブルを作成  [対応明細]   ・対応明細NO   ・対応NO(1と結合)   ・区分NO(2と結合)    3.のテーブルに対し、「対応NO」と「区分NO」を入力していければ、もともとのExcelファイルをいじることなく、区分を追加していけるものと考えたのですが、「このレコードセットは更新できません。」とのエラーとなってしまいます。 以前のAccessではExcelのリンクテーブルも更新できたと思うのですが、大人の事情でそれができなくなったことは認識しています。その回避策として、リンクテーブルに編集を加えるのではなく、更新用のテーブルを用意して入力していこうと思ったのですが、それもできません。 回避策がありましたらご教示いただけますでしょうか。 宜しくお願いいたします。

  • Excel2003がすぐにハングアップする

    WindowsXP SP2でExcel2003を使用していると、Excelがハングアップします。 起動して、セルに入力し、確定しただけで、ウィンドウが真っ白になります。 タスクマネージャーを見ると、「応答なし」になってます。 そのとき、ブックは1つしか起動していないのに、 アプリケーションとして3つもあがっています。 少し経つと戻るのですが、違うシートを見るだけでも、保存でもまたハングアップ状態になります。まったく仕事になりませんが、使わざるを得ないので困っています。 やってみた解決方法 ・IME2003の辞書の修復 ・「excel /unregserver」、「excel /regserver」での再設定 ・Microsoft UpdateやOffice Updateでのパッチ当て ・マルチCPUなので、「関係の設定」で1CPUに割り当ててみた ・ウィルスチェックのリアルタイムチェック停止 パソコンを立ち上げた直後でも、 新規作成のブックでもExcelがハングアップします。 どの解決方法でもExcel2003はすぐハングアップです。

  • EXCELブックの保存前の状態への回復

    EXCEL2002、SR-1を、2つのEXCELブックを共有で 使用しています。 EXCELが強制終了してしまい、EXCELを再度起動して 2つの修正されたブックを保存しようとしたところ 名前を間違えてしまい、別のEXCELブックのファイル名で 保存してしまいました。結局、同じ内容で別名のブックが できてしまいました。 違う名前で保存されてしまったEXCELブックを、元の内容 (保存前の状態)に復旧させることができるのでしょうか? もしそのような方法をご存知であれば、教えてください。 よろしくお願いします。

  • オートメーションで作成したExcel Book

    お世話になります。 Visual Studio 2008 C# を使い、オートメーションで作成した Excel Book が閉じられたことを リアルタイムで取得したいのです。 具体的には、フォームに複数のコントロールを配置した状態で、開いた Excel Book が閉じる瞬間をとらえてボタンの「Enabled」プロパティを制御できればいいのです。 簡単のために Excel Book はフォームの「Load」イベントで開き、新しい Book を追加します。 フォームにはボタン1個だけを配置します。 そして、Excel Book の右上の「×」ボタンで Book が閉じられる時、デリゲートを通じて BeforeBookClose イベントを用意すれば、Book が閉じられるタイミングを捕まえることはできます。 問題は、以下のコードでは、C#の出力ウィンドウに 「Delegate: BookClose イベントが呼ばれました」 「button1.Enabled = False」 と表示され、button1 の「Enabled」プロパティも確かに「true」になります。 しかし、次の行は実行されず、出力ウィンドウには 「'System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。」と表示されています。 つまり、それ以下のコードは実行されていません。 さらには、フォームにボタンやコンボなどを1個でも追加すると、もう、「button1.Enabled = true;」も実行されなくなります。これが追加するのがラベルだけなら大丈夫でした。 BeforeBookClose イベントの処理は Excel Book に対して行われ、もとのC#のコントロールに対しては意味をなしていない、とも思いましたが一概にそうでもなさそうで混乱しています。 プロセス間通信とかスレッド間通信とかが必要なのか、よくわかりません。 よろしくお願いします。 namespace test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Excel.AppEvents_WorkbookBeforeCloseEventHandler EventDel_BeforeBookClose; Excel.Application AppExcel = new Excel.Application(); private void Form1_Load(object sender, EventArgs e) { AppExcel.Visible = true; Excel.Workbook WB = AppExcel.Workbooks.Add(Type.Missing); EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(BeforeBookClose); AppExcel.WorkbookBeforeClose += EventDel_BeforeBookClose; button1.Enabled = false; } private void BeforeBookClose(Excel.Workbook Wb, ref bool Cancel) { System.Diagnostics.Debug.Print("Delegate: BookClose イベントが呼ばれました"); System.Diagnostics.Debug.Print("button1.Enabled = " + button1.Enabled.ToString()); button1.Enabled = true; System.Diagnostics.Debug.Print("button1.Enabled = " + button1.Enabled.ToString()); AppExcel.WorkbookBeforeClose -= EventDel_BeforeBookClose; } } }

  • ACCESSからexcelブックを開いて保存したい

    ACCESS初心者です。 仕事でどうしても必要に迫られて、受付管理のツールを作ることになりました。 1つの注文で、受付ID(オートナンバー)が付与されます。 メインフォームにタブオーダーをつけてサブフォームを複数配置しています。 そのサブフォームにボタンを置いて Access から既存のエクセルファイルをテンプレートとして開いて テンプレートに入力後、受付IDをファイル名にして、テンプレートとは別もので保存 保存後は、ボタンを押したときに受付IDと同じエクセルファイルが開く このようなことをやりたいと思っています。 ネットでいろいろ探しているのですが ファイルを開くのは見つかっても、保存したものを開くのが見つからず そもそもできるのかどうかもわかっておりません。 自分にスキルがなく、あれこれ凝ったものは作れないので、 保存は自動じゃなくて、自分で別名で保存にしてもかまわないのですし フォームに入力したものが、テンプレートに反映(出力?)されなくてもかまわないです。 参考になるサイト等ありましたら、ご教示いただけますか。 どうぞよろしくお願いいたします。 下記はやりたいことに近いかなと思って見つけたサイトです。 http://www.nurs.or.jp/~ppoy/access/access/acX013.html http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220895032 http://accessclub.jp/bbs/0227/beginers70136.html

  • Excel2007★ブックのバージョンを変換したい

    アクセスありがとうございます。 Excel97-2003ブックをExcel2007で開くと、ウィンドウ上部に[互換モード]と表示されていますが 最大行数の兼ね合いから、これを解除したいです。 名前を付けて保存→マクロ有効ブック.xlsmに保存しても、 この[互換モード]は消えないまま、最大行数も65536行のままです。 調べたところ、 "Officeボタンをクリックし、変換をクリックする"とありますが、 その"変換"自体見当たりません。 http://office.microsoft.com/ja-jp/excel-help/HA010077561.aspx#BMupgradingworkbooks ★当方、Excel2007 SP3、Win7Professionalを使用しております。 どうしたらいいでしょうか…。 よろしくご教授くださいませ。

  • Accessでわからない事があります

    Accessをつかってデータベースを作っています。 テーブルもいくつか作り、それぞれの入力フォームやレポートもつくりました。しかしもとのテーブルに追加したいフィールドがあるのですが、エラーメッセージ「定義されているフィールドが多すぎます」とでて、新しいフィールドを保存できません。ただ、別名で保存する事は出来ます。しかし別名で保存すると、クエリやレポートやらをもう一度作り直さないといけません。(少なくとも今の私のAccessに対する知識ではそれしか出来ないと思われます。)別名では保存できて、もとのテーブルで保存できないのは、なにか設定を変えればいいのでは?と思っているのですが、どなたか教えてください。結構な大作なので、もう一度テーブルの段階から作り直すのはやや気がめいってしまいます。どなたか助けてください。宜しくお願いします。

専門家に質問してみよう