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

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

A 回答 (3件)

400ファイル出力時に


エクセルを自動起動していますか?
(しないことをおすすめします)
していないのにダメな場合は
まとめたものを1ファイルとして
出力したものを使うのが良いのでは
ないでしょうか。

ファイル出力というのは
そうです、EXCELです。

一つひとつを画面で開くと
重いのではないでしょうか。
開いてますか、基になる各ブックを。
(画面上に表示されないような処理
をおすすめします)
もし面倒でなければ少し詳しく
処理、画面の流れを説明してください。

この回答への補足

本当にていねい説明していただいてありがとうございます。
長くなりそうですが、もう1回最初から説明します。
Excelの画面は起動していません。
Acessテーブルとして社員マスタがあります。それと部署マスタ。
(社員マスタの内容は、番号、氏名、所属、役職、職種、身分・・)
社員1人1ブックでEXCELデータを作成しますが、その際にテンプレートとなるブックを、役職・職種で判断し選択しています。(これは別関数)
更に作成したブックは部署ごとにフォルダを自動作成してそこに保存しています。(これも別関数)
PGとしては本当に単純な構造ですが

・SQL文で社員マスタから対象社員をセレクト(レコードセット作成)
・Excelオブジェクト作成(Set exce = = CreateObject("Excel.application"))
・レコードセットの社員コードでループ
   社員マスタの役職・職種から対象テンプレートを選択
   そのブックを開く
   値をセットする
   保存先のフォルダ名取得
   別名で保存
   そのブックをクローズ(false)
そのシートオブジェクトを開放
   ブックオブジェクト変数開放
・ループ抜け
   Excel終了(オブジェクト.Quit)
Excelのオブジェクト変数開放
処理終了

以上です。今までいただいたアドバイスをもとに、じっくりもう一度やってみようと思います
   

補足日時:2002/02/12 09:47
    • good
    • 0

2.セットすべきデータをファイル出力についてですが


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

この回答への補足

>個別に400ファイル出力しても

この部分でコケてしまってます。(メモリ不足)
・・というよファイル出力というのはEXCELに、と考えていいんでしょうか?


いわゆる社員マスタの内容を1人1ブックで出力していますが
社員の役職や職務内容に応じてPGで基となるブックを切り替えたり
しています。

補足日時:2002/02/10 15:10
    • good
    • 0

根本的な解決になっていませんが


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

この回答への補足

>2.セットすべきデータをファイル出力
>(一時保管用。エクセル自動起動はしない)

の意味がわからないのですが。とりあえず一覧形式でシートに吐き出して
あとはすべてExcel/VBAで処理するということなのでしょうか?

補足日時:2002/02/09 18:14
    • good
    • 0

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

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

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

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

Qフォルダ内のexcelファイルを順に開いてマクロ有効ブックに別名保存して閉じるマクロを作りたい

マクロは難しい・・・

https://oshiete.goo.ne.jp/qa/2598781.html
上記URLでフォルダ内の全ファイルを開くマクロがありましたので参考にしていたのですが別名で保存の段階で詰まってしまいました。貴重な休日がああ~~
現在仕事の引き継ぎでマクロ非対応のファイルをマクロ有効にしようとしているのですが多いと1フォルダに100個、全部で400以上あるため自動でできたらなあと考えています
やりたい作業は、

1.同じフォルダにあるファイルを開く
2.別名で保存でマクロ有効ブックとして保存(名前は開いたファイルのまま)
3.閉じる
4.次のファイルを開く
5.1~4をフォルダ内のファイル全てに適用するまで繰り返す

というものです
URL先のコードに別名で保存のコードを入れればいいんじゃん!やったぜひとりでできるもん!と思い追加したいマクロを記憶しながらコードを見て作ってみたのですが同じ名前で保存されたり end sub が必要などとエラーが出て上手くいきませんでした(´;ω;`)

Aベストアンサー

失礼しました。パスの指定が不完全でした。これでどうでしょう。

Sub sample()
Dim Fs, Fl, Fn, wb
Set Fs = CreateObject("Scripting.FileSystemObject").GetFolder(ThisWorkbook.Path).Files
For Each Fl In Fs
Fn = ThisWorkbook.Path & "\" & Fl.Name
If Right(Fn, 5) = ".xlsx" Then
Set wb = Workbooks.Open(Fn)
Fn = Left(Fn, Len(Fn) - 5) & ".xlsm"
Application.DisplayAlerts = False
wb.SaveAs Filename:=Fn, FileFormat:=xlOpenXMLWorkbookMacroEnabled
wb.Close
Application.DisplayAlerts = True
End If
Next
End Sub

失礼しました。パスの指定が不完全でした。これでどうでしょう。

Sub sample()
Dim Fs, Fl, Fn, wb
Set Fs = CreateObject("Scripting.FileSystemObject").GetFolder(ThisWorkbook.Path).Files
For Each Fl In Fs
Fn = ThisWorkbook.Path & "\" & Fl.Name
If Right(Fn, 5) = ".xlsx" Then
Set wb = Workbooks.Open(Fn)
Fn = Left(Fn, Len(Fn) - 5) & ".xlsm"
Application.DisplayAlerts = False
wb.SaveAs Filename:=Fn, FileForma...続きを読む

QACCESS97からEXCELへのEXPORT

テーブルより、通貨型で書式は固定、小数点以下桁数1に設定しています
ACCESS上での表示は小数点以下1桁で表示されますが
EXCELにEXPORTすると小数点以下2桁表示になってしまいます
ACCESS側の設定で、EXPORT後小数点以下1桁で表示出来るようには出来ないでしょうか?
宜しくお願いします。

Aベストアンサー

「format」を使い、データの書式を設定すれば1桁になると思うのですが、いかがでしょうか。

Qリストボックスで選択したexcelブックのデータをマクロのあるexcelブックにコピーしたい

リストボックスを作り、そこに開いてるexcelブックを表示させて選択できるようにしてあるのですが、リストを選択してボタンを押したら、選択したブックのsheet1のA1~B80をマクロのあるブックの"処理用"sheetのA列B列にコピーなるようにしたいのですが上手くいきません

マクロ.xlsmの
リストはActiveコントロールのリストボックスを作り
Private Sub ListBox1_GotFocus()
    Dim wbook As Integer
    ListBox1.Clear
    For wbook = 1 To Workbooks.Count
        ListBox1.AddItem Workbooks(wbook).Name
    Next wbook
End Sub
としてます。

で、別にボタンを作り

Sub ボタン_Click()
Dim target As Variant
Worksheets("マクロ").Select
target = Worksheets("処理用").ListBox1.Text

Workbooks(target).Activate
Sheets(1).Select
Sheets(1).Range(Cells(1, 1), Cells(80,2)).Copy
ThisWorkbook.Worksheets("処理用").(Cells(1, 1), Cells(80,2)).PasteSpecial
(以下略)

と続くのですが、実際に作動させると
Workbooks(target).Activateで「型が一致しません」となりエラーとなってしまいます。

"処理用"シートのD1に直接ファイル名を書いて、
target = Cells(4, 1)
Workbooks(target & ".xlsx").Activate
とやってた時はうまくいったのですが…

いろいろ調べてますが直せず困ってます…

リストボックスを作り、そこに開いてるexcelブックを表示させて選択できるようにしてあるのですが、リストを選択してボタンを押したら、選択したブックのsheet1のA1~B80をマクロのあるブックの"処理用"sheetのA列B列にコピーなるようにしたいのですが上手くいきません

マクロ.xlsmの
リストはActiveコントロールのリストボックスを作り
Private Sub ListBox1_GotFocus()
    Dim wbook As Integer
    ListBox1.Clear
    For wbook = 1 To Workbooks.Count
        ListBox1.AddIte...続きを読む

Aベストアンサー

やっぱりtargetの型はstringにすべきですね。
そうすれば、target = Worksheets("処理用").ListBox1.Textの時点で落ちるはずなので問題の切り分けが出来ます。対処も見つかると思います。

Q個々のセルに入力した数字の合計を別のセルに一桁ずつ表示する方法

こんばんは。いつも大変お世話になります。
なかなか良い関数の使い方が思いつかず、また皆様のお知恵を貸していただければと思い、質問させて頂きます。

E1に「3」、F1に「5」、G1に「7」 今日の売上値とする
H1に「9」、I1に「7」、J1に「5」 昨日の売上値とする
※ G1,J1は百の位 F1,I1は千の位 E1,H1は万の位です
この合計値をA1(万の位)、B1(千の位)、C1(百の位)にそれぞれ出したいのです。
この場合だとA1に「13」、B1に「3」、C1に「2」となります。

上記のような事をしたいのですが、可能でしょうか?
申し訳ありませんが、何とぞよろしくお願いします。

Aベストアンサー

こんばんは

何通りか記載します

1案 一旦文字列にしてから計算

A1 =INT(((E1&F1&G1)+(H1&I1&J1))/100)
B1 =INT(MOD(((E1&F1&G1)+(H1&I1&J1)),100)/10)
C1 =MOD(((E1&F1&G1)+(H1&I1&J1)),10)

実際は入力エラーチェックの式を付加する必要があります。

2案 こちらは数値に忠実な処理

A1 =INT((SUM(E1,H1)*100+SUM(F1,I1)*10+SUM(G1,J1))/100)
B1 =INT(MOD(SUM(E1,H1)*100+SUM(F1,I1)*10+SUM(G1,J1),100)/10)
C1 =MOD(SUM(E1,H1)*100+SUM(F1,I1)*10+SUM(G1,J1),10)

3案 配列数式

A1 =INT(SUMPRODUCT(E1:J1*{1,0.1,0.01,1,0.1,0.01}))
B1 =INT(MOD(SUMPRODUCT(E1:J1*{0,1,0.1,0,1,0.1}),10))
C1 =MOD(SUMPRODUCT(E1:J1*{0,0,1,0,0,1}),10)

こんばんは

何通りか記載します

1案 一旦文字列にしてから計算

A1 =INT(((E1&F1&G1)+(H1&I1&J1))/100)
B1 =INT(MOD(((E1&F1&G1)+(H1&I1&J1)),100)/10)
C1 =MOD(((E1&F1&G1)+(H1&I1&J1)),10)

実際は入力エラーチェックの式を付加する必要があります。

2案 こちらは数値に忠実な処理

A1 =INT((SUM(E1,H1)*100+SUM(F1,I1)*10+SUM(G1,J1))/100)
B1 =INT(MOD(SUM(E1,H1)*100+SUM(F1,I1)*10+SUM(G1,J1),100)/10)
C1 =MOD(SUM(E1,H1)*100+SUM(F1,I1)*10+SUM(G1,J1),10)

...続きを読む

Qエクセルで作成した、某列のデータをaccessに張り付けれますか? accessの方は一件ずつ手打ち

エクセルで作成した、某列のデータをaccessに張り付けれますか?
accessの方は一件ずつ手打ちするフォームになってるのですが、エクセルみたいなセル画面にして一気に張り付けるとか、、、
もしくはエクセルで作ったものをCSVにして保存し、それを読みにいくとか、、?

考え方を教えてください!

Aベストアンサー

フォームに直接は無理なので、元になってるテーブルをエクセルにコピペ→エクセル上で該当列を書き換え→テーブルに全置換でコピペ、がやり方としては簡単かな、と。
但しテーブルのKeyとかを理解してないと失敗する可能性もありますのでテストデータで試してみるのをオススメ


このカテゴリの人気Q&Aランキング

おすすめ情報