在宅勤務を適度にサボるならExcelマクロ(VBA)で!Teamsにも対応

Excelマクロ(VBA)を使って、適度に在宅ワークをサボる方法です。

在宅勤務を適度にサボるならExcelマクロ(VBA)で!Teamsにも対応

会社から貸与されているパソコンってのは、何かと監視が厳しいものだ。放置してスリープ状態が続いていると、『さぼりか?おおん?』と難クセつけられてもメンドクサイ。

特に、Microsoft Teamsによるステータス監視はやっかいだ。5分間パソコンの操作がなければ「退席中」と表示が出てしまう。

また、スクリーンセーバーやスリープ設定の変更ができないのも難点である。すごい短時間に設定されているうえ、管理者によって変更できなくされていたり、変更できたとしてもすぐバレて戻せと指示されることも多い。

そんなメンドクサイ監視をくぐり抜けて、適度にサボる方法はないかと考えたのが、Excelマクロを使った方法だ。

一応断っておくと、筆者は在宅ワークを監視するなんて無駄だと思っている。仕事は成果なので、結果さえ出ていれば、常識の範囲内なら何をしていようと構わないと思う。だが、世の中には監視が大好きな会社や上司が多いらしい。とにかく、ニーズがありそうなので作ってみたというわけ。

ここでは Excelマクロ(VBA)を使って適度に在宅ワークをサボる方法 を紹介します。

すべて自己責任でお願いします。当方では一切の責任を負いません。


機能紹介

今回紹介するExcelマクロで、できることを簡単に書いておこう。当然、Excelがインストールされていることが大前提だ。

まずは、スリーブモードにならないようにしなければならない。そのためには適度にマウスを動かしておけばよい。これには「SetCursorPos」というWin32 APIを利用する。「mouse_event」というWin32 APIと組み合わせれば、クリックやホイール操作も可能だ。

また、Teamsを退席中にさせないためには、キーボード入力が有効なようだ。これには「SendKeys」という関数を利用し、セルを上下移動させることで対応できる。

そして、適度にファイルを保存するこで、管理者側にやっている感を伝えることができるだろう。

これらを定期的に動かすことで、サボっていることに気がつかせないという方法だ。定期的な動作の実現には「Application.OnTime」というメソッドを使っている。

在宅勤務を適度にサボるExcelマクロを作る

では、在宅勤務を適度にサボるExcelマクロの作り方を紹介しよう。

「開発」タブが表示されているか確認

まずは「開発」タブが表示されているか確認しよう。リボンを右クリックして「リボンのユーザー設定」から「開発」にチェックを入れればOK。

リボンのユーザー設定から開発にチェックを入れる

詳しくは「Excel マクロ/VBA画面の表示方法(開発タブ)」を参考にしてほしい。

新規ブックを作って保存する

最初に新規にExcelブックを作って、適当な場所に名前を付けて保存する。

新規にExcelブックを作って保存する

この時、ファイルの種類は「Excel マクロ有効ブック (*.xlsm)」にすること。これじゃないとマクロが保存されないので注意してほしい。

コードを貼り付ける

「開発」タブから「Visual Basic」のボタンを押して、VBAの画面を開こう。

VBAの画面を開く

次に、プロジェクトを右クリックして「挿入」から「標準モジュール」を選択する。

プロジェクトに標準モジュールを追加する

出てきた画面に下記のコードを貼り付ける。

Option Explicit
#If Win64 Then
  Private Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
  Private Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, _
                          Optional ByVal dx As Long = 0, _
                          Optional ByVal dy As Long = 0, _
                          Optional ByVal dwDate As Long = 0, _
                          Optional ByVal dwExtraInfo As Long = 0)
#Else
  Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
  Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, _
                      Optional ByVal dx As Long = 0, _
                      Optional ByVal dy As Long = 0, _
                      Optional ByVal dwDate As Long = 0, _
                      Optional ByVal dwExtraInfo As Long = 0)
#End If

Private EarliestTime As Variant
Private RowPos As Long, ColPos As Long

'
' 処理名 :Auto_Open
' 処理内容:変数の初期化
'
Private Sub Auto_Open()
  ' 初期化
  ActiveWindow.Zoom = 100
  Range("A1").Select
  Range("A1:E6").ClearContents
  RowPos = 0
  ColPos = 0
End Sub

'
' 処理名 :さぼりまくろー
' 処理内容:在宅勤務を適度にサボるためのマクロ。
'           セルを移動し、文字入力、マウスカーソルの移動、キー押下、保存。
'           これを1分間隔で繰り返す。
' 引数  :なし
' 戻り値 :なし
'
Public Sub SaboriMacroo()

  ' 初期化
  ActiveWindow.Zoom = 100
  Range("A1:E6").ClearContents

  ' セル位置の設定
  RowPos = RowPos + 1
  ColPos = ColPos + 1

  ' 移動先セルを選択して文字入力
  Cells(RowPos, ColPos).Select
  Cells(RowPos, ColPos).Value = "サボり中..."
  
  ' マウスカーソル移動先の座標を取得
  Dim x, y As Long
  x = ActiveWindow.PointsToScreenPixelsX(Selection.Left * 96 / 72) ' ポイント<->ピクセル変換
  y = ActiveWindow.PointsToScreenPixelsY(Selection.Top * 96 / 72) ' ポイント<->ピクセル変換
  
  ' マウスカーソルの移動
  SetCursorPos x, y
  mouse_event 2 'マウス左ボタンを押す
  mouse_event 4 'マウスz左ボタンを離す
  
  ' ↓と↑のキー押下
  SendKeys "{DOWN}"
  SendKeys "{UP}"

  ' セル位置の初期化
  If RowPos = 5 Then RowPos = 0
  If ColPos = 5 Then ColPos = 0

  ' 以降、1分間隔で実行する。
  EarliestTime = Now() + TimeValue("00:01:00")
  Application.OnTime EarliestTime, "SaboriMacroo"

  ' 開始時刻を設定
  Range("A6").NumberFormatLocal = "@"
  Range("A6").Value = "次の開始は " & EarliestTime

  ' 保存
  ThisWorkbook.Save
End Sub

こんな感じになっていればOK。

標準モジュールにソースコードを貼り付けた様子

ボタンを作る

最後に、マクロを実行するボタンを用意しよう。

「開発」タブの「挿入」から「ボタン」を選択する。

挿入からボタンアイコンをクリックする

「マクロの登録画面」が出たら、「SaboriMacroo」を選択して「OK」ボタンをクリックする。

ボタンにマクロを登録する

ボタンを右クリックして、適当な名前をつければ完成だ!

ボタンの名前を変更する

Excelマクロ実行前の注意点

このマクロを実行する前に、いくつか注意点があるので書いておく。

  • 他のExcelブックを閉じてから利用してください。
  • ボタンのクリックは1回のみです。2回以上クリックしないでください。
  • 実行中は他のアプリを操作しないでください。
  • 停止したい場合はExcelを終了してください。

まず、他のExcelブックを閉じておいてほしい。閉じていないと、他のExcelブックへ文字入力が発生するなどの影響が出る。

ボタンのクリックは1回のみ有効だ。2回以上クリックするとタイマーが複数起動し、動作に影響を及ぼすことになる。

実行中は他のアプリの操作はNGだ。マウスカーソルが自動で移動するので、予期せぬ動作が発生する可能性がある。メーラーやTeamsなどを起動しておくことはOK。

利用は自己責任でお願いします。当方では一切の責任を負いません。

ソースコードの説明

紹介したソースコードの説明を簡単に書いておく。興味があれば読んでほしい。

このプログラムは、「セル移動」、「文字入力」、「マウスカーソル移動」、「左クリック」、「キー押下」を実行してファイルを保存している。これを1分間隔で実行することでWindowsのスクリーンセーバーやスリーブ、Microsoft Teamsのステータス変更への対応を可能としている。もしかしたら「キー押下」だけでも効果があるかもしれないが、管理者がどんな監視をしているかわからないため、このような仕様にしている。やっている感を出しておくことも重要だ。

VBAが書ける人ならコードを読めばわかると思うが、Win32 APIやSendKeys、Application.OnTimeについては少し詳しく説明しておこう。

SetCursorPos

SetCursorPos」は、マウスのポインターを指定した場所に移動させるWin32 APIだ。

下記を宣言すれば使えるようになる。

Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

使い方は簡単。X軸とY軸を指定すればOK。下記は、左から100px、上から200pxの位置へポインターを移動する記述だ。

SetCursorPos 100, 210 '  X軸:水平位置を指定, Y軸:垂直方向を指定

mouse_event

「mouse_event」は、マウスの左、右、ホイールを操作するWin32 APIだ。

下記を宣言すれば使えるようになる。

Declare Sub mouse_event Lib “user32” (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal dy As Long = 0, Optional ByVal dwDate As Long = 0, Optional ByVal dwExtraInfo As Long = 0)

使い方は簡単。操作の定数を引数に渡すだけだ。

mouse_event 2 'マウス左ボタンを押す
mouse_event 4 'マウス左ボタンを離す

よく使われる定数を書いておく。

定数内容
2左ボタンを押す
4左ボタンを離す
8右ボタンを押す
10右ボタンを離す
20中央ボタンを押す
40中央ボタンを離す

クリックという一つの動作は、ボタンを押すことと離すことでで成り立っている。仮に右クリックをしたいとするならば、引数に 8 と 10 を設定することで実現できる。

SendKeys ステートメント

「SendKeys」は、キーボード操作をアクティブなウィンドウに送信してくれる関数だ。それはまるで、キーボードから入力したかのようにね。

SendKeys 文字列, [ wait ]

指定できる文字列は下記のサイトで確認できる。

SendKeys ステートメント (VBA) | Microsoft Learn

Application.OnTime メソッド

「Application.OnTime」は、指定された時刻にプロシージャを実行してくれる。

OnTime (EarliestTime、 Procedure、 LatestTime、 Schedule)

名前必須データ型説明
EarliestTime必須バリアント型
(Variant)
プロシージャを実行する時刻を指定します。
Procedure必須文字列型
(String)
実行するプロシージャ名を指定します。
LatestTime省略可バリアント型
(Variant)
プロシージャの実行が可能になる最も遅い時刻。 たとえば、 LatestTime が EarliestTime + 30 に設定されていて、別のプロシージャが実行されているために、Microsoft Excel が Ready 、Copy、Cut、または Find モードに含まれていない場合、Excel は最初のプロシージャが完了するまで 30 秒待ちます。 Excel が 30 秒以内に準備モードになっていない場合、プロシージャは実行されません。 この引数を省略すると、Excel はプロシージャを実行できるようになるまで待機します。
Schedule省略可バリアント型
(Variant)
新しい OnTime プロシージャをスケジュールする場合は True。 以前に設定したプロシージャを解除する場合は False。 既定値は True です。

30秒後にプロシージャを実行するには下記のようにする。

Application.OnTime Now + TimeValue("00:00:30"), "my_Procedure"

午後6時にプロシージャを実行するには下記のようにする。

Application.OnTime TimeValue("18:00:00"), "my_Procedure"

OnTimeメソッドの設定を取り消すなら下記のように記述すればよい。

Application.OnTime EarliestTime:=TimeValue("18:00:00"), Procedure:="my_Procedure", Schedule:=False

詳しい使い方は下記のサイトで確認できる。

Application.OnTime メソッド (Excel) | Microsoft Learn

完成品のダウンロード

VBAなんてしらんけど、とにかく楽してサボりて~んだ!って、めんどくさがりな方は、下記より完成品をダウンロードするといいぞ。

SaboriMakuroo.xlsm

ダウンロードした後は、ファイルを右クリックしてプロパティを開き、下図の赤枠部分の「許可する」にチェックを入れて使えるようにしないとマクロが動作できないぞ。

ファイルのプロパティで許可するにチェックを入れる

ファイル内の注意事項をよく読んでご利用ください。当方では一切の責任を負いません。

まとめ

Excel マクロ(VBA)を使って適度に在宅ワークをサボる方法を紹介しました。

これで、在宅勤務中に本を読んだり、おやつをしたり、適度にサボることができる。チャットやメールが届いた際には、音で知らせる設定にしておき、音量を大きめにしておくことで、適時対応が可能となるのでオススメだ。

くれぐれもマクロ起動したまま長時間の離席はしないように、ね。

それでは素敵な在宅ワークを!

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。