Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5294 / 13646 ツリー ←次へ | 前へ→

【51668】ショートカットメニューやコマンドメニューを自動で閉じる方法 ZARDist 07/9/29(土) 5:25 質問[未読]
【51672】Re:ショートカットメニューやコマンドメニ... n 07/9/29(土) 11:39 発言[未読]
【51673】Re:ショートカットメニューやコマンドメニ... ichinose 07/9/29(土) 12:20 発言[未読]
【51675】Re:ショートカットメニューやコマンドメニ... ZARDist 07/9/29(土) 13:04 お礼[未読]
【51679】Re:ショートカットメニューやコマンドメニ... ichinose 07/9/29(土) 15:23 発言[未読]
【51680】Re:ショートカットメニューやコマンドメニ... n 07/9/29(土) 15:50 発言[未読]
【51681】Re:ショートカットメニューやコマンドメニ... ZARDist 07/9/29(土) 23:21 お礼[未読]
【51674】Re:ショートカットメニューやコマンドメニ... ZARDist 07/9/29(土) 12:35 お礼[未読]
【51676】Re:ショートカットメニューやコマンドメニ... n 07/9/29(土) 13:06 発言[未読]
【51677】Re:ショートカットメニューやコマンドメニ... n 07/9/29(土) 13:29 発言[未読]
【51678】Re:ショートカットメニューやコマンドメニ... ZARDist 07/9/29(土) 13:50 お礼[未読]

【51668】ショートカットメニューやコマンドメニュ...
質問  ZARDist  - 07/9/29(土) 5:25 -

引用なし
パスワード
   すみませんが教えてください。
ブックを開いてから5分後に閉じるマクロを作成したのですが、マクロが動作する前にショートカットメニューやコマンドメニューを開いた状態にしておくとマクロが動きません(途中で止まってしまう)。マクロ動作前にショートカットメニューやコマンドメニューを自動で閉じる方法はありませんでしょうか?
よろしくお願いしたします。

【51672】Re:ショートカットメニューやコマンドメ...
発言  n  - 07/9/29(土) 11:39 -

引用なし
パスワード
   こんにちは。
OnTime メソッドを使われていますか?

>(途中で止まってしまう)
というのがどういう状態なのでしょう?
各メニューを開いた状態や、セル編集状態だとマクロは実行されませんが、
通常は、その状態が解消されて、マクロが実行可能になった時に実行されます。
OnTime メソッドをどのように記述されていますか?

【51673】Re:ショートカットメニューやコマンドメ...
発言  ichinose  - 07/9/29(土) 12:20 -

引用なし
パスワード
   ▼ZARDist さん:
おはようございます。

>ブックを開いてから5分後に閉じるマクロを作成したのですが、マクロが動作する前にショートカットメニューやコマンドメニューを開いた状態にしておくとマクロが動きません(途中で止まってしまう)。マクロ動作前にショートカットメニューやコマンドメニューを自動で閉じる方法はありませんでしょうか?

この現象の再現手順書(セルa1を選択した状態で右クリックすることによって表示されるメニューを表示した状態で待機する等)と「ブックを開いてから5分後に閉じるマクロ」のコードを記述するようにしてください。

「ブックを開いてから5分後に閉じるマクロ」には、Application.Ontimeメソッドを使用したコードやループで5分経過させるコードなどいくつか考えられますから・・・。

これらの記述を行えば、多くの方がZARDist さんが発見した現象を再現できますよね?

VBSや別プロセスのExcelから対象Excelを操作すると可能ですよ!!

例、メモ帳に以下のコードを記述してください。

 dim app,bk,stt
  Set app = CreateObject("excel.application")
  With app
   .Visible = True
   set bk=.Workbooks.add
   bk.worksheets(1).cells(1,1).value="新規ブックの表示成功"
   stt=now()
   do while now()-stt<=#00:00:10#
     wscript.sleep 500
     loop   
   .visible=false
   .visible=true
   bk.Close False
   .quit
   end With
  set app=nothing

このテキストファイルにtest.vbsというファイル名を付けて
保存してみてください。
(尚、このまま上記のコードをコピーすると、各行の前後の空白が全角になっている可能性があります。全角のままだとエラーになりますから、コピー後に空白を半角に修正してください)


このtest.vbsを実行してください。

Excelが起動され、新規ブックが表示されます。
(セルA1に「新規ブックの表示成功」と表示後、約10秒待機します)

この間に適当なセルを選択し状態で右クリックすることによって表示されるメニューを表示した状態で待機します。


約10秒後にExcelが終了します。

Win2000&excel2002で確認しました。

一例ですが、試してみてください。

【51674】Re:ショートカットメニューやコマンドメ...
お礼  ZARDist  - 07/9/29(土) 12:35 -

引用なし
パスワード
   こんにちは。ご返答ありがとうございます。

>OnTime メソッドを使われていますか?
使っています。ちなみに私が作ったマクロは以下の通りです。

Private Sub Workbook_Open()
Timer
End Sub

Sub Timer()
  Dtime = Now + TimeValue("00:05:00") 
  Wtime = TimeValue("00:00:00")
Application.OnTime TimeValue(Dtime),"Autoclose",TimeValue(Wtime)
End Sub

Sub Autoclose()
ActiveWorkbook.Close
End Sub

>>(途中で止まってしまう)
>というのがどういう状態なのでしょう?

タイムアップしてもブックが閉じない状態です。
ブックが閉じれないと他の方が編集出来ないという不具合が発生します。

【51675】Re:ショートカットメニューやコマンドメ...
お礼  ZARDist  - 07/9/29(土) 13:04 -

引用なし
パスワード
   こんにちは、ご回答ありがとうございます。

拙い説明で大変申し訳ございません。<(_ _)>
ちなみに私が作ったマクロは以下の通りです。

Private Sub Workbook_Open()
Timer
End Sub

Sub Timer()
  Dtime = Now + TimeValue("00:05:00") 
  Wtime = TimeValue("00:00:00")
Application.OnTime TimeValue(Dtime),"Autoclose",TimeValue(Wtime)
End Sub

Sub Autoclose()
ActiveWorkbook.Close
End Sub

次に再現手順についてご説明いたします。
(上記マクロを保存して)
1.エクセルを「マクロ有効」にして開く
2.セルを選択し右クリックしてショートカットメニューを表示させる
(またはコマンドボタンを押してプルダウンメニューを表示させる)
3.本来なら5分後にブックが閉じるはずなのに閉じない
4.ショートカットメニューおよびプルダウンメニューを手動で閉じるとブックが自動で閉じる

>VBSや別プロセスのExcelから対象Excelを操作すると可能ですよ!!
すごいですね!びっくりしました!!
大変恐縮ですがもう2、3ご教示頂けませんでしょうか?

1.特定のブックを開きたい場合vbsのコード上でどのように表記すればよいでしょうか?
2.特定のブックのみ閉じたい場合vbsのコード上でどのように表記すればよいでしょうか?

お手数をおかけしますがよろしくお願い致します。

【51676】Re:ショートカットメニューやコマンドメ...
発言  n  - 07/9/29(土) 13:06 -

引用なし
パスワード
   そのコードだと、
>通常は、その状態が解消されて、マクロが実行可能になった時に実行されます。
と思いますが、実際には Wtime が 0 ではなかったりしますか?

それで『5分後に待機が発生したら、実行可能になるまで待機して、実行可能になった時に実行する』
では不都合がありますか?

また、
>ActiveWorkbook.Close
だと、編集して保存していなければ、Close時に「保存しますか?」のメッセージが出て、
それに応答しなければ開いたままだし、[キャンセル]されても開いたままですが、
そのような場合はどうされてるのでしょうか。

いずれにしても、ichinoseさんのアドバイスを元に対策をとられたほうが良いかと思います。

#余談
『Timer』はTimer関数と名前がかぶっていますから、別名にしたほうがよろしいかと。
それと
TimeValue(Wtime) は TimeValue(TimeValue("00:00:00")) と同じ意味になっています。

【51677】Re:ショートカットメニューやコマンドメ...
発言  n  - 07/9/29(土) 13:29 -

引用なし
パスワード
   さっきのレスはあまり気にしないでください。

>実際には Wtime が 0 ではなかったりしますか?
>それで『5分後に待機が発生したら、実行可能になるまで待機して、実行可能になった時に実行する』
>では不都合がありますか?
この部分。
【51675】を読んだらわかりました。
>4.ショートカットメニューおよびプルダウンメニューを手動で閉じるとブックが自動で閉じる
ではダメのようですね。

やはりvbsなのかな、という気もしますが、セル編集中に対しての対策は思い浮かびませんので
お力になれそうもありません。m(_ _)m

【51678】Re:ショートカットメニューやコマンドメ...
お礼  ZARDist  - 07/9/29(土) 13:50 -

引用なし
パスワード
   ▼n さん:
ご返答ありがとうございます。

>それで『5分後に待機が発生したら、実行可能になるまで待機して、実行可能になった時に実行する』では不都合がありますか?
エクセルブックは共有サーバーに入れていて複数名で交互に編集しますので、誰かが開きっぱなしだとそれ以降編集が出来なくなってしまいます。その防止対策として自動閉じマクロを作った次第です。

>>ActiveWorkbook.Close
>だと、編集して保存していなければ、Close時に「保存しますか?」のメッセージが出てそれに応答しなければ開いたままだし、[キャンセル]されても開いたままですがそのような場合はどうされてるのでしょうか。
すみません、私のコード記入ミスです。正しくは
Workbooks("○○予約システム.xls").Close False
です。

>#余談
>『Timer』はTimer関数と名前がかぶっていますから、別名にしたほうがよろしいかと。
>それと
>TimeValue(Wtime) は TimeValue(TimeValue("00:00:00")) と同じ意味になっています。
アドバイスありがとうございます。

【51679】Re:ショートカットメニューやコマンドメ...
発言  ichinose  - 07/9/29(土) 15:23 -

引用なし
パスワード
   こんにちは。

>ちなみに私が作ったマクロは以下の通りです。
>
>Private Sub Workbook_Open()
>Timer
>End Sub
>
>Sub Timer()
>  Dtime = Now + TimeValue("00:05:00") 
>  Wtime = TimeValue("00:00:00")
>Application.OnTime TimeValue(Dtime),"Autoclose",TimeValue(Wtime)
>End Sub
>
>Sub Autoclose()
>ActiveWorkbook.Close
>End Sub
>
>次に再現手順についてご説明いたします。
>(上記マクロを保存して)
>1.エクセルを「マクロ有効」にして開く
>2.セルを選択し右クリックしてショートカットメニューを表示させる
>(またはコマンドボタンを押してプルダウンメニューを表示させる)
>3.本来なら5分後にブックが閉じるはずなのに閉じない
>4.ショートカットメニューおよびプルダウンメニューを手動で閉じるとブックが自動で閉じる

↑こういう記述があると、多くの方が再現出来ますよね!!

>
>>VBSや別プロセスのExcelから対象Excelを操作すると可能ですよ!!
>すごいですね!びっくりしました!!
>大変恐縮ですがもう2、3ご教示頂けませんでしょうか?
>
>1.特定のブックを開きたい場合vbsのコード上でどのように表記すればよいでしょうか?
>2.特定のブックのみ閉じたい場合vbsのコード上でどのように表記すればよいでしょうか?

 dim app,bk,stt,fs
  set fs=createobject("scripting.filesystemobject")
  Set app = CreateObject("excel.application")
  With app
   .Visible = True
   set bk=.Workbooks.open(fs.GetParentFolderName(wscript.scriptfullname) & "\book1.xls")
   bk.worksheets(1).cells(1,1).value="book1.xlsの表示成功"
   stt=now()
   do while now()-stt<=#00:00:10#
     wscript.sleep 500
     loop   
   .visible=false
   .visible=true
   bk.Close False
   '.quit
   end With
  set app=nothing
  set fs=nothing

但し、上記のVbsコードを含むtest.vbsと読み込むブックであるBook1.Xlsは
同じフォルダ内にあるものとします。
(これも行の前後の全角の空白に気をつけてください)

nさん、こんにちは。

>やはりvbsなのかな、という気もしますが、セル編集中に対しての対策は思い浮かびませんので

VBSからだとセルを編集中の場合は、駄目ですね!!

でも、同じ方針で別Excelからコントロールすると私の環境だと
うまくいきましたよ!!(Win2000&Excel2002)

例、
Book2.Xlsというブックの標準モジュールに

'==================================================================
Option Explicit
Dim app As Application
Dim bk As Workbook
Sub main()
  Set app = CreateObject("excel.application")
  With app
    .Visible = True
    Set bk = .Workbooks.Open(ThisWorkbook.Path & "\book1.xls")
    End With
  Application.OnTime Now() + #12:00:05 AM#, "test"
End Sub
'==================================================================
Sub test()
  app.Visible = False
  app.Visible = True
  bk.Close False
'  app.Quit
  Set app = Nothing
  Set bk = Nothing
End Sub

として、読み込むブックBook1.Xlsと同じフォルダ上に保存した後、
実行してみて下さい。

>エクセルブックは共有サーバーに入れていて複数名で交互に編集しますので

Excelで↑こういうことするのは難しいですね!!
(参照だけなら、可能ですが)。


試してみてください。

【51680】Re:ショートカットメニューやコマンドメ...
発言  n  - 07/9/29(土) 15:50 -

引用なし
パスワード
   ichinoseさん。こんにちは。
あ、なるほどー。
>VBSや『別プロセスのExcelから対象Excelを操作すると可能です』
なのですね。
ありがとうございます。勉強になりましたm(_ _)m
win2000/xl2000でも確認できました。

【51681】Re:ショートカットメニューやコマンドメ...
お礼  ZARDist  - 07/9/29(土) 23:21 -

引用なし
パスワード
   ▼ichinose さん:
こんばんは。返答遅れてすみません。
色々と親切にご教示頂き有難うございます。
vbs、別Excelからコントロールする方法を両方試させて頂きましたが、おかげさまで両方とも上手くいきました。!!(Winxp&Excel2002)
ichinose さんは本当にお詳しい方なのですね!
今回こちらに初めて質問させて頂いたのですが、こんなに親切に教えて頂けるは思ってなかったので本当に有難かったしうれしかったです。
ぜひまた質問させて頂きたいと思います。その時はまたよろしくお願い致します。
有難うございました!

5294 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free