Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
スリープとVBAの実行
投稿日時: 20/07/20 09:10:02
投稿者: ngc1955

基本的な事ですがWindowsのスリープとVBAの実行に関しては特に注意することはありますか。配布先PCでは、スリープはユーザーが変更できません。
 
次のコードは自動的に23時59分にexBackupサブルーチンを呼ぶプログラムですが、一応スリープ時間を短くしてexTmerを変えて何度か実験しましたが、(予想に反して!?)うまく動作するようです。
 
 
exTime = 86340 '23h59m
     
 Do
          mySeconds = exTime - timer
         
    DoEvents
         
        If Int(mySeconds) = 0 Then
            exBackup
        End If
      
Loop
 
 
また今回は実際は時間表示など行ったのでこの方が簡単だったのでそうしましたが、他のコード
 
Application.OnTime EarliestTime:=TimeValue("23:59:00"), Procedure:="exbBackup"
 
でもスリープ中の動作は問題ないでしょうか?
 

回答
投稿日時: 20/07/20 10:02:37
投稿者: WinArrow
投稿者のウェブサイトに移動

問題は、バックアップを実行しようとするときに、何らかの操作中ということが
あった場合への対応だと思います。
操作中に正しくバックアップされる保証はあるのか?

投稿日時: 20/07/20 11:01:40
投稿者: ngc1955

すぐに回答ありがとうございます。
 
バックアップの対象ブックはLAN上の共有ブック(レガシー)で日中は頻繁にからか開いたり更新されたりします。そこで全員が作業しない真夜中に行えばよいと考えたのです。したがってバックアップを他に阻害する要素はありません。
 
Windowsのスリープに対してVBAも実行できないだろうと予想していました。他のサイトのQ&Aにできないという記事もありました(ただし2012年の記事)
 
https://okwave.jp/qa/q7843623.html
 
ところが実際に試してみると、動作は行わるようなので、いったいどういったことだろうと思い質問させていただきました。LopP中にDoEventsという関数が入れてありますが、これはネット上にあったサンプルプログラムを意味がわからないまま入れたのですが、この部分が関係してるのでしょうか。

投稿日時: 20/07/20 12:10:37
投稿者: ngc1955

すみません。実験のやり方がまずかったのかもしれません。
 
実験としてはイミディティウインドウで現在のtimerの値をみてexTimeをプラス120=2分後くらいにして、Windowsの電源管理設定で時間のスリープを1分にしてスリープインさせて動作を検証していましたが
 
先ほど、Windows10の設定画面では時間スリープを設定するとディスプレイの電源OFFもそれと同じ時間になることに気が付きました。つまり、私がスリープ中でもVBAが動くと勘違いしたのは、実はディスプレイはOFFになっただけでスリープインしていなかったようです。つまりこのコードを動作させると、そもそも時間のスリープインはしないようです。今電力計をつけてみましたが、電力がおちない。そういえば電源ランプも同じでした。すみません。
 
それで、このVBAコードの動作中にunndowsボタンからスリープクリックでスリープインしたところ、電力がほとんど1、2Wになってスリープインしました。結果はバックアップサブルーチンは呼ばれていませんでした。
 
ということは、このDeventsが含まれるループを実行中には時間ではスリープインしないという事でよいのでしょうか。それならば、配布先でもPCの電源さえ落とさなかったら、目的は達成できるのですが・・
 
 

回答
投稿日時: 20/07/20 13:36:10
投稿者: hatena
投稿者のウェブサイトに移動

ngc1955 さんの引用:
ということは、このDeventsが含まれるループを実行中には時間ではスリープインしないという事でよいのでしょうか。それならば、配布先でもPCの電源さえ落とさなかったら、目的は達成できるのですが・・

 
その辺はちょっと分かりませんが、真夜中にバックアップを実行したいということですよね。それまでスリープインさせないというのは、エコではないですよね。
 
自分なら、タスクスケジューラでバックアップ時刻にブックを開いてVBAを実行させるようにしますね。
 
Windows 10のタスクスケジューラでスリープを解除してタスクを実行できるよう設定する方法
https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=020406

回答
投稿日時: 20/07/20 14:20:25
投稿者: Suzu

引用:
バックアップの対象ブックはLAN上の共有ブック(レガシー)で

 
【レガシー】がどんな意味なのか判りませんが、
ネットワーク上の ドライブ が NAS を指しているなら
その NAS 側で バックアップを取ることが可能な事があります。
 
NAS の管理者 に相談してみてください。

投稿日時: 20/07/20 15:24:31
投稿者: ngc1955

 Hatenaさん、Sizuさん回答ありがとうございます。
 
>タスクスケジューラでVBAを開始
ご紹介のリンクみました。ちゃんとWindowsでそのような要望に応えるような機能があるのですね。これとVBAを組み合わせれば完璧ですね!
 
しかし、使用先ではコントロールパネルは管理者権限でロックされているそうです。Sizuさんがおっしゃるように管理者に決済をとってバックアップというのが正道な方法でしょう。
 
まあ、フリーでも市販品でも良いバックアップユーティリティは多数ですが、これも管理者権限でインスツールはできません。そんな中ExcelVBAマクロならエンドユーザーが工夫できるという事でよい点ですが、だからといってVBAでスリープを止めてしまうのは良くないかもしれません。
 
なおブックの共有というのは現在のバージョンではクラウドによる共有が標準になっていてレガシ機能としてオプションで追加できるという機能です。一つのブックをLAN上で同時編集が可能です。30人くらいの同室のグループならかえって簡易で便利です。