アプリ版:「スタンプのみでお礼する」機能のリリースについて

自動で起動するブック(未保存)を、別のブックのVBAを利用して
保存するため以下のように設定しました。
---------------------------------------------
sub auto_open()
Dim sFilName As String
sFileName =d:\test\test.xls
Workbooks("Book1").Active
ActivWorkbook.SaveAs sFileName
ActiveWorkbook.Close
Application.Quit
End Sub
(急いで入力しましたので単純なミスはご容赦ください。)
-------------------------------------------
このプロシージャを手動にて使用したところ問題なく
動いたのですが、夜中の作業のためWindowsの機能である
タスクに登録したところ、先に起動している「Book1」のエクセルとは
別のエクセルが起動してしまい、
Workbooks("Book1").Active  の行で
でエラーとなってしまいます。
つまり「ウィンドウ(W)」でブックの切り替えができない状態です。
なんとかこの現象を回避できないでしょうか?
もしくは別の方法があればお願いします。
ちなみに、VBSでエクセルを起動してプロシージャを実行しようとも
しましたが、このときはプロシージャが動きませんでした。

よろしくお願いします。

A 回答 (10件)

こんばんは。

Wendy02です。

おそらく、ActivWorkbook.SaveAs sFileName
で、ActiveWorkbook が移動してしまうのは分りますが、
でも、コードとしては見えてきません。

最初に、
>先に起動している「Book1」の
という説明では、よく分らないのです。

Auto_Openのコードの置いてある場所が分りません。一体、どこなのでしょうか?

それに、Workbooks("Book1").Active というのは物理的ファイル名ではなく、論理的ファイル名ですから、こういうコードはありえないです。Workbooks.Add ではありませんか?

私は、良く理解していないままに書くのはまずいかもしれませんが、私の説明は、コード的には、以下のようになります。

Sub Auto_Open()
  Dim sFileName As String
  sFileName = "d:\test\test.xls"
  If Dir(sFileName) = "" Then
   With Workbooks.Add
     '作業をする
     .SaveAs Filename:=sFileName
     .Close
   End With
  End If
  Application.Quit
End Sub

後は、作業内容にもよりますね。
Auto_Open ではうまくない場合もありますから、それは、良く確かめてください。
    • good
    • 0

#1 のWendy02です。

読み直して、補足します。

>Auto_Openのコードの置いてある場所が分りません。一体、どこなのでしょうか?

標準モジュールの意味ではなくて、別にブックがあると思われるのですが、それが、はっきりとイメージとして見えてきません。

この回答への補足

どうも私の説明が悪いみたいですね。
>別にブックがあると思われるのですが、それが、はっきりとイメージとして見えてきません。

はい、別のブックです。
最初の質問で書いてあります。
>自動で起動するブック(未保存)を、別のブックのVBAを利用して
>保存するため以下のように設定しました。

#1の時にコードのご指摘がありましたが、手動では
正常に機能してくれています。
>このプロシージャを手動にて使用したところ問題なく
>動いたのですが、夜中の作業のためWindowsの機能である
>タスクに登録したところ、先に起動している「Book1」のエクセル
>とは別のエクセルが起動してしまい、Workbooks("Book1").Active
>の行ででエラーとなってしまいます。

つまり何が言いたいかと申しますと、別プロセスで動いている
エクセルのブックを制御できるかどうかです。

>先に起動している「Book1」のエクセルではわからないのです。
これがすでに動いているエクセルです。
(自動起動です。 このブック自身の操作はできません。)

この「Book1」を保存するために、後から作ったブックをエクセルの
タクススケジューラに登録して起動すると
(この後から立ち上げるブックに(VBA auto_open)を組んでいます。)別プロセスで起動してしまい「Book1」が保存できないのです。

手動では同じプロセスで起動してくれるので
(つまりブックの切り替えが出来る状態)
保存はうまくいきました。

いろいろ調べた結果、オートメーション(?)という機能のおかげで
別プロセスで動いているエクセルの制御はできないような
感じがしております。

なにかいい方法がありましたらご教授くださいませ。
m(_ _)m

補足日時:2006/02/11 09:22
    • good
    • 0

 タスクで実行するファイル名をexcel.exeにしているとエクセルが二重起動してしまいます。


 DOSやWin3.1ぐらいからパソコンを使っている人ですと『実行ファイル[スイッチ]ファイル名』というコマンドラインを思い出してしまう為に起こる落とし穴です。私も同様なことで悩んだ覚えがあります。

 実行するファイル名にAUTO_OPENマクロを入れているエクセルファイルを直接指定することでアプリケーションの二重起動は防止できます。

 私の環境はWindows2000+EXCEL97ですが、この方法で二重起動せずに開くことができています。

この回答への補足

タスクに登録する際は、作成したファイル名 日本語名+.xlsです。
特にスイッチを付加するようなことはしていないのですが・・・
もう少し詳しく教えて頂けますか?
よろしくお願いします。

補足日時:2006/02/11 18:16
    • good
    • 0

こんにちは。



>つまり何が言いたいかと申しますと、別プロセスで動いている
>エクセルのブックを制御できるかどうかです。

そのこと自体はできますが、ただ、今回は話が違うような気がします。

私が分らないのは、その全体を通しておっしゃっていませんから、個別の部分を取り出して、これはできるかどうか、と言われても、「できる」とは思うけれど、的確な答えが出来ないのです。

>>先に起動している「Book1」のエクセルではわからないのです。
>これがすでに動いているエクセルです。
>(自動起動です。 このブック自身の操作はできません。)

「自動で起動するブック(未保存)」って、もしかしたら、Excelを立ち上げる時にできる「Book1」ということですか?それは、「新規ブック」の、論理的ブック名のことですね。

それも、二重起動?しているのかな?

もし、そうなら、そのこと自体ほとんど意味がありません。自動で立ち上げるExcelのApplication の起動では意味がないからです。固有のブックを立ち上げなくては意味がありませんから。それに、内容的にみると、繰り返すコードなら、それとは別のエラーを起こす可能性が強いですが。

コードだけをみると、空のブックに名前を付けて、保存させようとしか見えないし、名前も固定式ですから、1回だけですね。

やむを得ないので、今までの3つのご質問をあわせて類推させていただきます。そうすると、何となく外形が見えてくるような気がします。

今までの話をまとめると、

起動するブックは、固有の1つのブックで、それをシートコピーして、ブックにして名前を付ける、ということで良いのではないかと思います。それで、ブック名があれば、新規にブックをつけていく、という方式です。立ち上げだけは、ブックをショートカットにしておいて、タイムスケージューラに入れて置き、

後は、時間で作業を行っていくのでしたら、以下のようなOnTime メソッドをお使いになればよいと思います。

Dim myTime As Date
Dim i As Long

MyTime = Now()

For i =1 To 5
'一時間ごと
  Application.OnTime myTime+ TimeValue(Cstr(i) &":00:00"), "my_Procedure"
Next i

'my_Procedure は、作業マクロ

なお、
>オートメーション(?)という機能のおかげで別プロセスで動いているエクセルの制御はできないような感じがしております。

現状では使っていませんね。オートメーション・オブジェクトは、Auto_Openでは動きません。Auto_Open とThisWorkbook は同じように考える人がいますが、それぞれの使いこなしがあります。

この回答への補足

そうですね。
全体を言ってませんのでわかりませんよね。
失礼致しました。

実は、業者が作成したマクロが夜に起動するようになっていまして、
そのマクロを実行した結果が、新規の未保存の状態である論理
ファイル名「Book1」となって画面に表示されています。
いつもはこのファイルに手動で日付を打ち込み保存しているのですが、
数が多いため、自動にしたかったのです。
新規のファイルのため、「Book1」自体にマクロを実行させるのは無理と考え、新たにファイル(ブック)を作成して保存させようと考えました。そのコードが最初に質問したときのものです。
手動で試したところ、エクセルが二重起動することもなく無事に
保存出来たのですが、タスクに登録して実行させようとすると
現在Book1で起動しているエクセルとは別のプロセスでエクセルが
起動してしまい、保存できなくなっていました。

お知恵をお貸しください。
よろしくお願いします。

補足日時:2006/02/11 18:18
    • good
    • 0

heimdal様


こんばんは。Wendy02です。

>実は、業者が作成したマクロが夜に起動するようになっていまして、
やっと意味が理解できました。

それと、確かに難しいです。挑戦する価値はありますが、いくつか、私も、Excelで実験してみないと、今は断定的なことは何も言えません。実際のブックなしでは、ちょっと厳しいかもしれません。今は、「確か、ああすれば出来たはずなんだけれど……」程度です。

いくつか確認させてください。
(VBA専門掲示板だと、手際よくコードを書く人がいますが、どうも、私は、こういう時、性格的に物事の準備が整わないと、先に進めないタチなので、済みません。こうやってやり取りしている間に、誰かが書いてくれるかもしれませんしね。(^^;)

>新規のファイルのため、「Book1」自体にマクロを実行させるのは無理と考え、新たにファイル(ブック)を作成して保存させようと考えました。

Book1 というよりも、それは、Book1が出来たときには、ActiveWorkbook の ActiveSheet だと思います。そして、ActiveSheetにデータが存在していますか?

その業者さんが作ったマクロは、ブック名をユーザーに保存させるために、自分では終了できないのですね。だから、二重起動になるわけですね。

それと、
>業者が作成したマクロが夜に起動するようになっていまして、
これを、タイムスケジュールに入れているということですね。そういう使い方をするようになっているわけではないような気がします。

(ここが大事です。)

例えば、他のブックから、
WorkBooks.Open "業者Book.xls"
で起動して、自動実行されますか? (これができれば、ひじょうに助かります)

その業者さんの作ったマクロのマクロ名はみることが出来ますか?

あれこれ言っても、一番手っ取り早いのは、その業者さんのブックのマクロを改造すればよいのですけれどもね。

この回答への補足

Wendy02様
>どうも、私は、こういう時、性格的に物事の準備が整わないと、先に進めないタチなので、済みません。
いえいえ、ここまで真剣に取り組んでくださってありがたい限りです。

>ActiveSheetにデータが存在していますか?
はい、業者が作成したマクロの結果がSheet1に存在します。

>その業者さんが作ったマクロは、ブック名をユーザーに保存させるために、自分では終了できないのですね。だから、二重起動になるわけですね。
そのとおりです。

>これを、タイムスケジュールに入れているということですね。
はい、そうです。
>そういう使い方をするようになっているわけではないような気がします。
すいません。ここのところがちょっと意味がわかりません。

>例えば、他のブックから、WorkBooks.Open "業者Book.xls"で起動して、自動実行されますか?
確認します。

>その業者さんの作ったマクロのマクロ名はみることが出来ますか?
確認します。確かマクロ自体を見ました。

>あれこれ言っても、一番手っ取り早いのは、その業者さんのブックのマクロを改造すればよいのですけれどもね。
そのとおりですね。ただ、VBA初心者の私には複雑すぎるものは
理解の範疇を超えていることと、保守契約などが絡むので
マクロ自身の改造は控えているところです。

歯切れが悪くて申し訳ありません。
業者に頼めばいい話なんですが、全国に展開しているシステムで、
わざわざ書類を作成して上申するような話でもないので・・・

よろしくお願いします。

補足日時:2006/02/12 11:25
    • good
    • 0

こんばんは。

Wendy02です。

>>例えば、他のブックから、WorkBooks.Open "業者Book.xls"で起動して、自動実行され>ますか?
>確認します。

もしも、これが出来たら、私は、前回書いた、OnTime メソッドで、他のブックから完全制御してしまうつもりでいます。つまり、タイムスケジューラを使うのをやめて、Excelで制御させます。(まだ、できるかどうか分りません。)

1つのブックは開けたままでよろしいですか?

>ただ、VBA初心者の私には複雑すぎるものは
>理解の範疇を超えていることと、保守契約などが絡むので
>マクロ自身の改造は控えているところです。

そうですね。もしも、デジタル証明があれば、マクロ側に、何かを書いた瞬間に、証明書が消えます。ただし、たぶん、業者さんが、特定の会社なりに供給したときは、デジタル証明はつけないのが一般的です。まあ、オリジナルを残しておけばよいのですが、その改造は個人で使うものに限りますから、それはやめておきましょう。(^^;

>>そういう使い方をするようになっているわけではないような気がします。
>すいません。ここのところがちょっと意味がわかりません。

つまり、業者.xls は、もともと、タイムスケジューラで使うようになっていないのではないか?、ということです。
    • good
    • 0

追伸:



heimdal様へ Wendy02です。

今、こちらで実験してみましたが、マクロ入りブックのThisWorkbook で自動的に新しいファイル(Book1)を作るプログラムを、30秒間隔で作らせて、うまくいきました。

ただし、タイムスケジューラーではなく、あくまでも、マクロのタイマーで行いました。
もし、その方式でよいのでしたら、次回に、公開します。つまり、ブックひとつは、一晩開けて置くことになります。(または、タイムスケジューラーで、業者さんでないほうの、ブックを一回だけ起動させて、タイマーを働かせます。)

それから、業者さんのブックの一回のプログラム処理の長さがどのぐらいの時間(この部分が自信がありません)、
夜は、何時から、何分とか何時間間隔とか、
ファイル名をどう処理したらよいかと、

細かい指示をしてください。

この回答への補足

Wendy02様、いつもありがとうございます。

前回のご質問から
>つまり、業者.xls は、もともと、タイムスケジューラで使うようになっていないのではないか?、ということです。
このマクロは、一日の統計を出力するもので、業者がタスクスケジューラ
に登録しているものです。

追伸から
>今、こちらで実験してみましたが、マクロ入りブックのThisWorkbook で自動的に新しいファイル(Book1)を作るプログラムを、30秒間隔で作らせて、うまくいきました。
すいません。ここの動作がいまいちわからないのですが・・・
(ThisWorkbookというのは、業者.xlsとは別物ですよね。)

追伸でのご質問事項は、確認してお返事させて頂きます。
m(_ _)m

補足日時:2006/02/13 06:23
    • good
    • 0

こんにちは。

Wendy02です。

>このマクロは、一日の統計を出力するもので、業者がタスクスケジューラ
>に登録しているものです。

あっ! あれは、タスク・スケジューラというのですね。(^^;私は、名前を忘れていました。それで、Windows アクセサリのタスク・スケジューラですよね。

その業者.xls は、POSみたいな集計ですか?深くは突っ込むつもりはありませんが。

それで、再度お書きしますが、業者.xls のブックは、自力では終了できない仕組みですか?常に、既定の時間に人間が作業しないと、何分か何時間後に、次のブックでエラーを起こすとか。(元々そういう質問でしたから愚問ですよね)

もし、そんなプログラムだったら、ひどすぎます。!

もしかして、タスク・スケジューラ自体は、外すのは禁じられていたりして……。それさえ、なければ、そんなに問題は複雑化しないと思います。出来なければ、おそらく、別のVBAのプログラムで、業者.xls の立ち上げたExcelを追いかけるような形で処理していくつもりです。それでも出来なかったら、また別の方法も考えます。

>ここの動作がいまいちわからないのですが・・・
それは、状況確認して、それで進められるようでしたら、解説します。

#7 の私の質問をお待ちしております。

>(ThisWorkbookというのは、業者.xlsとは別物ですよね。)
そうです。別のブックに取り付けました。ただ、最悪の状態でも可能なことをもう少し考えてみます。

ところで、最初にお聞きすべきでしたが、
>VBSでエクセルを起動してプロシージャを実行しようともしましたが、このときはプロシージャが動きませんでした

これって、どんなコードでしたか?
今、分る範囲は全て知っておきたいと思います。

この回答への補足

Wendy02様
いつもありがとうございます。

本日もう一度タスクスケジューラやマクロを見直していたんですが、
大きな勘違いをしていました。

タスクスケジューラに登録されていたのは別のマクロだったのです。
(同じような統計の名前だったので・・・すいません。)
いつも00:15 00:20 00:40 に統計が出力されていたのですが、
そのマクロは00:50分でした。

今となってはそのマクロがどうやって起動しているのかすら見当もつかず
しばらくパニクっていました。

ここで伺うようなことではないのかもしれませんが、タスクに登録している以外で、
マクロを実行するような方法が存在するのでしょうか?

ちなみに、エクセルが常に起動しているわけではありません。
プロセスも一応見てみたのですが、普段はEXCEL.EXEは動いていません。

一度ATコマンドというのを聞いたことがありますが、
それとは違いますよね。

>その業者.xls は、POSみたいな集計ですか?深くは突っ込むつもりはありませんが。
POSって販売時点管理のことでしょうか?
詳しくはお答えできませんが、「一日にどれぐらい処理したか」
というようなものです。

>それで、再度お書きしますが、業者.xls のブックは、自力では終了できない仕組みですか?常に、既定の時間に人間が作業しないと、何分か何時間後に、次のブックでエラーを起こすとか。
エラーまではわかりませんが、必ず人間の作業が必要です。
マクロ本体が動いた結果、新規のブック「Book1」(このフォーマットは用意されているようです。)のSheet1に結果が反映されています。

>ところで、最初にお聞きすべきでしたが、
>VBSでエクセルを起動してプロシージャを実行しようともしましたが、このときはプロシージャが動きませんでした
これって、どんなコードでしたか?
最初に質問したときのコードです。
VBAやマクロやプロシージャと呼び方を変えているために起きてしまったのでしょうか・・・
すいません。

よろしくお願いします。

補足日時:2006/02/13 20:57
    • good
    • 0

こんばんは。

Wendy02です。

話を聞いているうちに、簡単な方法が、ダメになっていきますね。起動の手順が見えないので、今までの案は全てボツにしました。あくまでも、ここは、お金を取るようなことは出来ませんので、無償の範囲の中で考えると、以下の方法に決定しました。(起動方法がわかれば、また違う案が出せます。)

※注意: 以下のマクロは、設定したことを絶対に忘れないでください。

設定時間内は、イベントが設定されている限りは、新規ファイルを作ると、自動的に名前を換えて、自分で保存して閉じてしまいます。元のブックは閉じません。あくまでも新しいブックに対して働きます。おそらく、業者さんでも、以下のようなマクロは作らないはずですから、マクロでバッティングすることはないと思います。

以下の方法は、アプリケーション・イベントと呼ばれるものです。

なるべく、Personal.xls に、以下、三ヶ所のモジュールに登録してください。そうでなければ、業者.xls に直接登録がよいです。

時間の設定は、本来は、iniファイルなどを用いたほうが安全ですが、これ以上のシステムを構築するのは、ご勘弁ください。

'-------------------------------------------
'Class 1
'-------------------------------------------
Public WithEvents App As Application
Private Sub App_NewWorkbook(ByVal Wb As Workbook)
  Dim FirstTime As Date
  Dim LastTime As Date
  Dim FName As String
  Dim i As Integer
  FirstTime = TimeValue("00:01:00") '開始時間
  LastTime = TimeValue("06:30:00") '終了時間
  If Not (Time() >= FirstTime And Time() < LastTime) Then Exit Sub
  FName = Format(Now(), "yymmddhhnn") 'ファイル名作成
  Do Until Dir(FName & ".xls") = ""
   If i = 0 Then
     i = 1
     Else
     i = i + 1
   End If
  Loop
  Filename = FName & i & ".xls"
  On Error Resume Next
  With Wb
   .SaveAs FName & ".xls"
   Sleep 2000 '待ち時間 2秒 '要調整
   .Close False
  Beep
  End With
End Sub

'-------------------------------------------
'標準モジュール
'-------------------------------------------
Dim myClass As New Class1
Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Sub myClassSetting()
 Set myClass.App = Application
End Sub

'-------------------------------------------
'ThisWorkbook
'-------------------------------------------
Sub ThisWorkbook_Open
 Call myClassSetting
End Sub

'-------------------------------------------
    • good
    • 0

heimdal様へ


こんにちは。Wendy02 です。
昨日のお返事自体は、そのままになってしまったので、書いておきます。

>一度ATコマンドというのを聞いたことがありますが、
>それとは違いますよね。

ATコマンドの設定は、タスク・スケジューラに出てきます。自分で管理すればよいので、私は、常駐していません。

>ここで伺うようなことではないのかもしれませんが、タスクに登録している以外で、
>マクロを実行するような方法が存在するのでしょうか?

マクロ自体に、そういう機能がありますが、自分で自分を起動することは出来ません。他に、設定する部分は、私には良く分りません。

昨日、書いたコードは、もしかしたら、Excel自体を、自動で閉じなくてはならないのかもしれませんね。今は、とりあえず、新規ファイルを作ると、ファイル名を付けて、それを保存するように出来ています。二重起動については、考えておりません。

それは、起動方法自体がはっきりしないと、メモリに残ってしまい、最後はハングすることがあるからです。

なお、VBS は、 VB Script と呼ぶ、Windowsの簡易型のプログラムのことです。

それから、日にちが空くようになりましたら、回答に対する補足 ではなく、『回答のお礼側』に、何行でもよいので書いてください。

その内容を、こちらは、直接、メールを受け取ることが出来ます。私は、アクセス自体は、5面までは、Excelのマクロで行っていますが、あまり日にちが経って、気が付いたときには遅かったということがタマにあります。(今現在で、8面に来ています)よろしくお願いします。
    • good
    • 0

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