はじめまして、Excel VBAにて困っていますので教えてください。
・以下の構造でExcelを起動しております。
1.VB6で作成したアプリケーションよりExcelで使用するためのデータ抽出を
 行います。
2.抽出終了後、上記アプリケーションよりExcelを起動し、VBAマクロ
 機能を使用し、自動印刷(複数帳票あり)を行います。(上記アプリケーションは待機状態)
3.印刷終了後、上記アプリケーションに戻ります。

・自動マクロ機能なので、処理終了後に上記3.に戻るのですが、リソース不足に
より(印刷時にリソースが消費されます)ハングアップ状態になる時があります。
 そこで、リソース不足を解消したいと思っているのですが、ExcelVBAでリソース
不足を解消する方法がありましたら、教えていただきたいのですが。

・私としては、印刷の時に、次の印刷時に前回の印刷が終了するまでマクロを待機
させたいと思っております。

 よろしくお願いします。

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

A 回答 (6件)

たぶん、印刷スプール中にリソースを消費していると思う。


PrintOut後に印刷スプール終了を待つのはどうでしょう?
と言いつつも、Wordだと簡単だけどExcelの場合は簡単は方法は思い浮かばない。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=103563
    • good
    • 0
この回答へのお礼

todo36さん。ありがとうございました。
参考URLのサンプルを参考に実行したら、リソース不足がかなり解消されました。
出力先がレーザープリンターの為、実感がわきませんでしたが、自宅に持ち帰り、インクジェットプリンタに出力すると、リソース不足が解消されているのがわかり
ました。

お礼日時:2001/11/14 23:17

>確かにブックのOPEN・CLOSEを数回行っています。


ブックのオープンクローズはOKです。
NGなのはエクセル本体の起動、終了を複数回行った場合です。

それと、画面の描画もメモリを消費しますので、コードをちょっとだけ変更させてみました。
これでもダメですか?


Public Sub XLSM0050_PRINT_SEC()
  Dim W_FILE As String
  Dim PV_X As Variant
  On Error GoTo ERROR_TRAP

  Application.StatusBar = True
  Application.StatusBar = "EXCEL添付文書出力中"

  Application.ScreenUpdating = False
  Open PB_TXTPATH & "INPM0250.TXT" For Input As #1

    While Not EOF(1)
      W_FILE = ""
      Input #1, W_FILE
      If W_FILE <> "" Then
        Workbooks.Open Filename:="" & W_FILE & ""
        ActiveWindow.SelectedSheets.PrintOut Copies:=1
        ActiveWindow.Close
      End If
    Wend

  Close #1

  Application.ScreenUpdating = True

PGMEND:
  Exit Sub

ERROR_TRAP:
  Application.ScreenUpdating = True
  PV_X = ABEND_SEC("1", "XLSM0010", "XLSM0050_PRINT_SEC", "")
  GoTo PGMEND
End Sub

この回答への補足

TAGOSAKU7さん。ありがとうございます。
少しだけ改善されましたが、根本的には解決には至りませんでした。
どうも印刷スプール時にリソースを消費しているみたいなので、こちらの方で
解決策があれば教えてください。

補足日時:2001/11/14 16:09
    • good
    • 0

マシンスペックは問題ないかと思います。


恐らくあなたの書いているコードに問題があるとしか言えません。

メモリのバグは発見しにくいものなのであなたのコードをよく眺めてごらん
というしか出来ません。
頑張ってください。

この回答への補足

zerosixさん。ありがとうございます。
どうも印刷スプール時にリソースを消費しているみたいなので、こちらの方で
解決策があれば教えてください。

補足日時:2001/11/14 16:12
    • good
    • 0

あとー


一つ質問なのですが、これはzerosixさんの発言の延長ですが、Excelを何度も起動してませんか?

OK処理
エクセル起動
ブック1オープン
ブック1クローズ
ブック2オープン
ブック2クローズ
ブック3オープン
ブック3クローズ
エクセル終了(ここで開放)

NG処理
エクセル起動
ブック1オープン
ブック1クローズ
エクセル終了
エクセル起動
ブック2オープン
ブック2クローズ
エクセル終了
エクセル起動
ブック3オープン
ブック3クローズ
エクセル終了(ここで開放)

こんなことにはなってないですよね?

この回答への補足

TAGOSAKU7さん。ご指摘ありがとうございます。
確かにブックのOPEN・CLOSEを数回行っています。

コードは以下のようにしております。

Public Sub XLSM0050_PRINT_SEC()
Dim W_FILE As String
Dim PV_X As Variant
On Error GoTo ERROR_TRAP

Application.StatusBar = True
Application.StatusBar = "EXCEL添付文書出力中"

Open PB_TXTPATH & "INPM0250.TXT" For Input As #1

While Not EOF(1)
W_FILE = ""
Input #1, W_FILE
If W_FILE <> "" Then
Workbooks.Open FileName:="" & W_FILE & ""
ActiveWindow.SelectedSheets.PrintOut Copies:=1
ActiveWindow.Close
End If
Wend

Close #1
Exit Sub

ERROR_TRAP:
PV_X = ABEND_SEC("1", "XLSM0010", "XLSM0050_PRINT_SEC", "")
End Sub

試しに、印刷コード(ActiveWindow.SelectedSheets.PrintOut Copies:=1)
をコメントアウトして実行すると、リソース不足にはなりませんでした(残50%)

試しに、印刷コード(ActiveWindow.SelectedSheets.PrintOut Copies:=1)
をコメントアウトせずに実行すると、リソース不足にはなりませんでしたが、
リソース残が30%をきってしまいました。

補足日時:2001/11/14 12:57
    • good
    • 0

きちんと変数を使用してますか?


オブジェクトやコントロールからの参照を何度も行ってませんか?
例えば
if Form1.Text1.Text = "1" then
elseif Form1.Text1.Text = "2" then
end if
というような処理を行ってませんか?
オブジェクト参照の回数が多いほど、負荷がかかります。


それと セルへの値をセットを一つのセルごとに行うと付加がかかります。
範囲選択をして、まとめて値をセットするようにしましょう。


コードを見てみないと、主にどこで不可がかかっているかがわかりません。。。
    • good
    • 0

マシンスペックが書かれていませんので推測ですが、


プログラムでできることとしては、
オブジェクトをsetすると、きちんと開放してあげたりしている
のでしょうか?

set HogeObj = CreateObject("aaa")
set HogeObj = nothing

と言う感じで、オブジェクトの開放をエラー時でも行って
いるのでしょうか?

この回答への補足

マシンスペックを記述していませんでしたので、記述します。

OS :WINDOWS98
CPU:Pentium2 233MHZ
メモリ:64MB
機種:FMV6233D9

補足日時:2001/11/14 11:02
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qリソースファイルとは・・・

リソースについて、2つ疑問が沸きました。
もしよろしかったら、アドバイスよろしくお願い致します。

(1)最近まで、Visual C# .NETを使用しておりました。
さきほど、Visual C++ .NETをいろいろいじっていたのですが、C++にはリソースというフォルダがあって、C#にはないのか疑問になりました。

どうしてC++では、リソースとして明確に分けているのかどうしてもわかりません。(そういえば、C#では、多言語に対応できないのかな・・・!?)

(2)C#では、たとえば、メニューのキャプションを変更したりといったことは、コードと同じように編集できるのに、どうしてC++では、わざわざリソースエディタのメニューデザイナで編集させているのでしょうか?

あと、リソースエディタの中にダイアログと言う項目があるのも不思議でなりません。ダイアログもフォームなのにリソースなんでしょうか?(リソースファイルとして保存して何か意味あるのでしょうか?)

Aベストアンサー

リソースには、言語指定が可能で、例えばエラーメッセージの
ような文字列の定義に日本語と英語の両方を記述できます。
で、やったことはありませんが、起動OSにより対応する
リソースが使われます。
このような多言語アプリケーションをリソースを使わずに
作ろうとすると、例えばプログラムの中に複数の文字列を
記述することになりますが、この煩雑さから解放されます。
ダイアログにも項目名が使われますから、言語に依存して
います。
また、リソースを編集するツールを使えば、英語アプリを
日本語に変更することも可能です。
言語だけでなく、プログラム・コードに影響がなければ
他の要素(例えば、アイコン)も変えられます。
但し、著作権が絡むものは、他人には渡せない制限が付きます。

QEXCEL2007でリソース不足が発生します。

OSはWinXPです。EXCEL2007のマクロでデータを取込み、データをシートのセルに順次記入しています。当初は問題無く動作していますが、十数時間経過すると画面が異常になります。EXCELのシートが別の位置に2重に表示されたり、一部の表示が黒くなったり、そのまま操作していると「リソース不足」とか「メモリー不足」のメッセージが表示されたりします。
EXCELを一旦終了して再起動すると、また問題なく動作します。
過去、EXCEL97、2000等2003まででは全く問題無く動作した実績があります。
デスクトップヒープを6MB増やすとか、仮想メモリーを増やすとかもしましたが問題解決には至っていません。
どうかよろしくお願いします。

Aベストアンサー

物理的に搭載しているメモリが足りないのではないのでしょうか?

以前、WinXPProでメモリを256MBしか搭載していないPCでOS起動時に既に250MB程度使ってしまっている環境で
EXCELを酷使しているとちょくちょくメモリ不足的なメッセージが表示されました。
これは仮想メモリを増やしても解決しませんでしたので、タイミングを見計らってEXCELの再起動を行っていました。
ちなみにExcelのバージョンは2002だったと思います。

> 過去、EXCEL97、2000等2003まででは全く問題無く動作した実績があります。
過去及び現在の
・搭載メモリ
・仮想メモリ
・開始時メモリ使用量
・10時間経過後のメモリ使用量
・取り込むデータの量
・環境でのOSやメモリに関係する環境(常駐ソフト(ウィルス対策ソフト等)・共有VRAM等)
はそれぞれどうなっているでしょうか?
上記内容によってはExcel自体のバージョンうんぬんではないかもしれません。

仮に上記内容が同じという場合は、単純なマクロのバグも考えられます。
Excelのバージョンによってそのバグが顕著に現れない可能性もあります。
例えばマクロ内で不要になった変数はしっかり破棄する等の事を行えば、少しは良くなるかもしれません。

こちらで現象が見れないので曖昧な表現が多くなってしまいましたが、参考になれば幸いです。

物理的に搭載しているメモリが足りないのではないのでしょうか?

以前、WinXPProでメモリを256MBしか搭載していないPCでOS起動時に既に250MB程度使ってしまっている環境で
EXCELを酷使しているとちょくちょくメモリ不足的なメッセージが表示されました。
これは仮想メモリを増やしても解決しませんでしたので、タイミングを見計らってEXCELの再起動を行っていました。
ちなみにExcelのバージョンは2002だったと思います。

> 過去、EXCEL97、2000等2003まででは全く問題無く動作した実績があります。
過...続きを読む

Qリソースメモリの空きとは?

何かの話の途中で「リソースメモリの空きは何パーセントですか?」と質問されたのですが、私はパソコンについてはまったくの素人で質問されている意味がわからないのと、どこを調べればリソースメモリの空きがわかるのか、どなたか詳しい方教えて下さい。

Aベストアンサー

 パソコン用語で言う広義の「リソース」は、ハードウェアやソフトウェアのことを言いますが、狭義では「メモリの使用量」または「CPUの使用量」になります。

 メモリの使用量は、Windowsならタスクマネージャーのパフォーマンスから、その他のOSならシステムモニタの類から、両方の数値を得ることができます。

 わからないことがありましたら補足してください。

QVB6アプリケーションからExcel2003のマクロ起動

VB6にてシステム構築を行っております。

Excel2000ならばVB6の関数を使って
マクロを起動できるのですが、
Excel2003やExcelXPとかでも
同様の関数とロジックと設定で起動することは可能でしょうか?

ご教授宜しくお願いします。

Aベストアンサー

>Excel2003
Runなくなっちゃいましたね
RunAutoMacrosになりましたね。

Googleのキャッシュにあった情報を提供します。

Excel97  → 無条件に可能
Excel2000 → SPによっては、セキュリティ「低」が必要。
Excel2002 → 同上
Excel2003 → 無条件に不可能

だそうです。

Qシステムリソースとは?

デスクトップのパソコンを使っているんですが、フリーズした時に
「システムリソースが不足です」というメッセージがでました。
システムリソースってなんですか?
また不足している場合はどうしたらいいですか?

パソコンは富士通のFMV DESKPOWERです。

Aベストアンサー

>>「Adobe Acrobat4.0」「DragonSpeech Partner」
>>「Data Access Objects3.0」「Bookshelf Basic Version」などはアンインストールして平気なんですか?
あっ、えとですね。常駐ソフトというのはそういう、ハードディスクにインストールされているアプリケーションのことではないです。
常駐ソフトとは、パソコンを起動したときに自動的に読み込まれて、メモリに居座り続けるソフトのことで、どんな物が常駐しているか確認するには以下の方法があります。
・タスクトレイ(画面右下の、バーのへっこんでるとこ)に並んでるアイコンをチェック
・msconfig(スタート→ファイル名を指定して実行→msconfig)→スタートアップ で、リスト中のチェックされているソフト
で、この中のどれが要らなくて、どれは削ったらマズいかは素人判断ではむずかしいので、参考URLの回答を参考にしてください。

なお、インストールされているアプリケーションを削除してもシステムリソースには関係ありませんが、ハードディスクの空き容量が増える、という別のご利益があります。

Adobe Acrobat4.0 … 消さない方がいいかも(ないとPDFファイルが読めなくなります)
DragonSpeech Partner … 不明。何ですかこれ? 読み上げソフト?
Data Access Objects 3.0 … これも不明。
Bookshelf Basic Version … これも不明。
とりあえず立ち上げてみて、「あ、これ一生使わなそう」と思ったらアンインストールしちゃってもいいのでは?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=77666

>>「Adobe Acrobat4.0」「DragonSpeech Partner」
>>「Data Access Objects3.0」「Bookshelf Basic Version」などはアンインストールして平気なんですか?
あっ、えとですね。常駐ソフトというのはそういう、ハードディスクにインストールされているアプリケーションのことではないです。
常駐ソフトとは、パソコンを起動したときに自動的に読み込まれて、メモリに居座り続けるソフトのことで、どんな物が常駐しているか確認するには以下の方法があります。
・タスクトレイ(画面右下の、バーのへっこんで...続きを読む

QExcel2007のマクロ(excel4.0)のSELECT関数でマクロエラーが発生する

Excel VBAで開発されたソフトの改造を行ってますが、Excel2007で動作しないマクロがあり困ってます。

<開発環境>
・WindowsXP Pro SP3
・Celeron 540(1.8GHz)
・メモリ1GB
・Excel2007 SP1 (Microsoft Office2007)

改造元ソフトはOffice2000で開発されており、Excel2007で動作するとマクロエラーが発生する処理があります。
因みにまだソフト改造はしてなく、そのままExcel2007で動作させるだけでマクロエラーが発生します。

発生する箇所はマクロ(excel4.0)で定義されており、下記のコマンドです。

=SELECT(!選択エリア)

マクロエラーの内容は下記になります。

-------------------------------
マクロエラー
[dbg.xls]マクロ(excel4.0)BV28
-------------------------------

やりたい事はシートの特定の範囲を選択することです。
"選択エリア"は正しく定義されていることは確認してます。
(=シート名!$D$4:$CY$103 と定義してます)

Excel2000やExcel2003ではマクロエラーが発生せずに正常に選択されます。

Excel2007のマクロセキュリティ設定を「すべてのマクロを有効にする」にしてます。
開発者向けのマクロ設定を「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックしても改善しません。

ネットで調べましたが判らず、ここで質問させて頂きました。
判りにくい説明で申し訳ありませんが、よろしくお願いします。

Excel VBAで開発されたソフトの改造を行ってますが、Excel2007で動作しないマクロがあり困ってます。

<開発環境>
・WindowsXP Pro SP3
・Celeron 540(1.8GHz)
・メモリ1GB
・Excel2007 SP1 (Microsoft Office2007)

改造元ソフトはOffice2000で開発されており、Excel2007で動作するとマクロエラーが発生する処理があります。
因みにまだソフト改造はしてなく、そのままExcel2007で動作させるだけでマクロエラーが発生します。

発生する箇所はマクロ(excel4.0)で定義されており、下記のコマンドです。...続きを読む

Aベストアンサー

マクロシートが見つかったようでよかったですね。
あれを回答しながらたぶん次は4.0マクロについての質問があるだろうと予想していました。。。(^^;;;

4.0マクロについては使ったこともないので今回の回答は控えようと思ったのですが、もしかして、ということもありますので。

VBAでもアクティブにしてないシートのセルは選択できないのですが、その辺りはどうですか?
2007で実行するときに、”選択エリア”のあるシートをアクティブにしてから実行しましたか?

該当シートをアクティブにしてから実行、とか、
SELECTする前に強制的に該当シートをアクティブにするコード入れて実行、とか。

選択エリアがSheet1にあるとしたら

=ACTIVATE("Sheet1")
=SELECT(!選択エリア)

たぶん、否、きっと、トンマな回答でしょう。。。(^^;;;
 

Qリソースとは?

リソースと検索してください。
いわれたんですか
リソースってなんですか

Aベストアンサー

下記URLを参照して下さい。

http://kaden.yahoo.co.jp/dict/?type=detail&id=4727

Q抽出印刷マクロ

sheet1に一行目は項目欄で A1氏名、B1山、C1川、D1谷、E1空、・・・L1合計 があり、A列に各人の氏名があり各項目欄に金額があったりなかったりする表があります。
sheet2には封筒サイズを設定してこれを印刷します。
ここで、sheet2のA1に氏名を印刷します。sheet1の項目中に1つの金額しかない人の分はA1に氏名、A2に該当の項目名、B2に金額、A3に合計の文字、B3に合計金額、罫線をA1:B3に引き印刷。
金額が3項目にある人(山、谷、空)は、A1に氏名、A2に山、B2に金額、A3に谷、B3に金額、A4に空、B4に金額、A5に合計、B5に合計金額、罫線をA1:B5に引き印刷。このように順次印刷するマクロの記述方を教えてください。お願いします。

Aベストアンサー

> 質問の中で ここでsheet2のA1に氏名を印刷しますは、ここでsheet2のA2に氏名を印刷しますです。そのためA3から項目名が始まります。
> 教えていただきました手直しの分で項目名が表示されません。

質問に書いた配置に誤りがあったということですね?
ただ、Sheet2のA1に名前を表示しようがA2に表示しようが、そのすぐ下から項目名が表示されるはずです。
それが表示されないということは、Sheet1の方の配置説明も違っているのではないですか?
前回の回答ではhoshi7777さんが書いた通り、Sheet1の1行目が項目欄で A1が氏名~以下各項目としてコードを書きましたが、これも1行ずれてるんじゃないですか?
そうであれば、以下のマクロをお試しください。

Sub test02()
Dim s2 As Worksheet, x As Long, y As Long, i As Long, n As Integer, c As Range '変数宣言
Set s2 = Sheets("Sheet2") 'Sheet2をs2とする
With Sheets("Sheet1") 'Sheet1において
x = .Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行を取得しxに代入
y = s2.Cells(Rows.Count, "A").End(xlUp).Row 's2,A列最終行を取得しyに代入
For i = 3 To x '3~xまでをiに代入
With s2 's2において
.Range("A2:B" & y).ClearContents 'データクリア
.Range("A2:B" & y).Borders.LineStyle = xlNone '罫線クリア
End With
s2.Cells(2, "A").Value = .Cells(i, "A").Value '氏名転記
n = 2 'nに2を代入
For Each c In .Range(.Cells(i, "B"), .Cells(i, "L")) 'B~L列のi行各セル
If TypeName(c.Value) = "Double" Then '数値であれば
n = n + 1 'nに1を加算
s2.Cells(n, "A").Value = .Cells(2, c.Column).Value '項目名転記
s2.Cells(n, "B").Value = c.Value '数値転記
End If
Next c '次セルへ進み繰り返し
With s2 's2において
.Cells(n + 1, "A").Value = "合計" '文字入力
.Cells(n + 1, "B").Formula = "=SUM(" & .Range(.Cells(3, "B"), .Cells(n, "B")).Address & ")" '合計計算式入力
.Range(.Cells(2, "A"), .Cells(n + 1, "B")).Borders.LineStyle = xlContinuous '罫線作成
.PrintPreview '印刷プレビュー
End With
Next i '次行に進み繰り返し
End With
End Sub

> 質問の中で ここでsheet2のA1に氏名を印刷しますは、ここでsheet2のA2に氏名を印刷しますです。そのためA3から項目名が始まります。
> 教えていただきました手直しの分で項目名が表示されません。

質問に書いた配置に誤りがあったということですね?
ただ、Sheet2のA1に名前を表示しようがA2に表示しようが、そのすぐ下から項目名が表示されるはずです。
それが表示されないということは、Sheet1の方の配置説明も違っているのではないですか?
前回の回答ではhoshi7777さんが書いた通り、Sheet1の1行目...続きを読む

Qネットワークリソースとは?

PC-A(Win_XP) PC-B(Win_XP) PC-C(Win_Me)でLanを構成しております。 PC-BのOSを入れ替えてから、再度、ネットワークセットアップしても、他のPCを参照しようとすると、メッセージ【ネットワークリソースに使用するアクセス許可が無い】とのメッセージが出ます。 もちろん、PC-A PC-C間は正常です。 具体的な処理は補足で記述させていただきますが、ネットワークリソースにアクセス許可を与えるには? 言い忘れましたが、このLanは個々のPCからインターネットへ接続する構成で Host PC方式ではありません。

Aベストアンサー

PC-B の「インターネット接続ファイアウォール」をオフにしてください。
http://support.microsoft.com/default.aspx?scid=kb;ja;283673

QExcel VBA if文 マクロ強制終了するには?

現在 2つのbookがあります。
・データ data.xls
・集計 total.xls
★条件は以下
・この2つのbookには同じ名前の 『sheet名・数』が情報保持しています。
・sheet名は不特定の名前が付けられています。
★処理したいマクロ内容
・data.xls …の各sheet と total.xls 各sheet参照させて
マッチしたら処理。
マッチしなかったらマクロ強制終了。

Sub match()

Dim i As Integer

For i = 1 To Worksheets.Count

'任意のbookを指定します
Windows("data.xls").Activate
sheet_copy = ActiveSheet.Name
Sheets(sheet_copy).Select

'範囲を選択 コピーします
Range("C2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

On Error Resume Next '---前後にシートが無い場合のエラーを無視
ActiveSheet.Next.Select

'任意のbook と sheet を指定します
Windows("total.xls").Activate
sheet_paste = ActiveSheet.Name
Sheets(sheet_paste).Select
Range("D2").Select

If sheet_copy = sheet_paste Then
ActiveSheet.Paste
ActiveSheet.Next.Select
Else
MsgBox "sheet miss match error!"
'★マクロ強制終了
End If
Next i
End Sub

★部分に何と記述すればよろしいでしょうか?
アドバイスお願い致します。

現在 2つのbookがあります。
・データ data.xls
・集計 total.xls
★条件は以下
・この2つのbookには同じ名前の 『sheet名・数』が情報保持しています。
・sheet名は不特定の名前が付けられています。
★処理したいマクロ内容
・data.xls …の各sheet と total.xls 各sheet参照させて
マッチしたら処理。
マッチしなかったらマクロ強制終了。

Sub match()

Dim i As Integer

For i = 1 To Worksheets.Count

'任意のbookを指定します
Windows("data.xls").Activate
she...続きを読む

Aベストアンサー

matchプロシージャが他のプロシージャから呼び出されているのでなければ、"Exit Sub"が良いかと思います。
もし、他のプロシージャから呼び出されているのであれば、"Exit Sub"と書いても呼び出し元のプロシージャの動作は止められませんので、工夫が必要となります。


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

人気Q&Aランキング