なんちゃってSESエンジニアがExcel VBAで快適な朝をデザインする
SESの朝は無駄が多い
※纏めはqiitaにあります。このブログは、紆余曲折も含め記載してますので冗長です。
※全部フィクションですよ!
おはようございます。
僕はSESです。
今日も古めかしいPCを使い、
Windowsの標準ソフトと時代錯誤のサービスを使い倒しながら、
遅延だらけのイントラ回線の中で仕事をしていきたいと思います。
Trelloってなんだ?
朝やる事
朝やる事を時系列で書いてみます。
・PCの電源を入れる
・画面ロックのパスワードを入力
・必要なソフトを立ち上げる
・無駄な常駐ソフトを落とす
・出勤したことを伝えるメールを送る(在宅勤務が増えたので)
・メールに目を通す
・メールで対応しないといけないものに返答していく
書き始めると山ほどあるのでこの7人の侍にしておきますか
ではこの7つの処理を自動化・・・
していきたいのですが、
「PCの電源を入れる」「画面ロックのパスワードを入力」は割愛します。
多分解決策は以下です。
ただ、SES的なPCだと権限が制御されてるので出来ない可能性が高く割愛です。
PCの電源を入れる= WOL(Wake On LAN)
画面ロックPWD自動化=自動サインインを設定 or 画面ロックを設定解除
Slackってなんですか?
よって、この5人のスタメンで戦います!
1番:必要なソフトを立ち上げる
2番:無駄な常駐ソフトを落とす
3番:出勤したことを伝えるメールを送る(在宅勤務が増えたので)
4番:メールに目を通す
5番:メールで対応しないといけないものに返答していく
ちなみにバスケでは、ポジションを番号で呼びます。(野球も一緒だよね)
1番:ガード
2番:シューティングガード
3番:スモールフォワード
4番:パワーフォワード
5番:センター
最近では違う呼称かな。
故障しないようにね!
Macをスタバで使うって都市伝説ですよね?
1番:必要なソフトを立ち上げる
いや、Windowsのスタートアップを使えば良いじゃん!
その通りです。
ですが、スタートアップで必要なソフトが一気に立ち上がると、
めちゃめちゃ重くならないですか???
特にSESだと
・PCのスペックが悪い
・立ち上げないといけないソフトが多い
ので大渋滞が起きます。
また、社内ネットワークを使っていると、
朝の回線は大混雑
しているんですよね。
なぜかというと、各拠点の人が
朝の同じ時間にPCを立ち上げるからです。
低スペックPC上でもソフトが沢山立ち上がるし
回線も混雑してるんで
なんかPCがフリーズするような感じになります。
毎朝そんな負荷をPCにかけるのは良くないので、
立上げをデザインします。(←言ってみたかっただけ)
まぁ一回設定すれば、毎朝の立ち上がりが快適になるので、
自分はそれを眺めて自己満足に浸っています。
良い気分で朝を始められますよ!
Google SuiteがGoogle Workplaceになった?
どっちも知らねーよ!!!
自動立上げをExcel VBAで実施
Excel VBAを使って立上げをデザインします。
【使う技】
・Sleep API関数
・ThisWorkbookのopenプロシージャ
【事前説明】
Excel VBAには、”Excelを立ち上げた時に処理を実行する”というプロシージャがあります。
それが”ThisWorkbookのopenプロシージャ”です。
私はこれを使っています。
利点は、実行タイミングをデザインできる事です。
デフォルトのWindowsスタートアップだと、Windowユーザーへログインしたときに自動実行されますが、この手法だと、excelを立ち上げなければ実行されないので、実行タイミングを”よりデザイン”できます。
(excelを立ち上げるめんどくさい作業が1つ増えた。とは表現しません☺)
コード(Excel VBA)
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'APIを宣言
Private Sub Workbook_Open()
'処理を実行していいか訊きます。excelは業務中に何度か立ち上げ直す可能性があるため
'処理を実行するかしないか、デザインします。
If MsgBox("wanna bootup?", vbYesNo) = vbYes Then
'software open
Shell "実行したいソフトウェアのフルパス" '自分はClipboard管理ソフトなどを立ち上げます
'SES定番のメーラー、outlookを立ち上げます。
Shell "C:\Program Files (x86)\Microsoft Office\Office16\OUTLOOK.EXE"
'ここで7秒間処理を止めます。
outlookの完全立ち上がりを待ちます
Sleep 7000 '単位はミリ秒です。
'browserベースのサービスを立ち上げます。
'⇩これは汎用的な実行技で、URLを入力すると、デフォルトブラウザ(SESではEdge)が立ち上がります。。
CreateObject("Shell.Application").ShellExecute "対象URL"
'⇩これは、立ち上げるBrowserを指定しています。下記ではChrome指定です)
CreateObject("WScript.Shell").Run ("chrome.exe -url " & "https://www.youtube.com/channel/UChSOjYK2JGEnErS1FXglALQ")
'メッセージを表示させて、朝忘れそうな処理などをリマインドします。
MsgBox "今日の予定を確認しよう。昨日の勤怠報告がまだならやっておこう"
Else
'do nothing
End If
End Sub
これをご自身でカスタマイズすると、快適な朝がデザインできます。
自分はその日が「月末か月初か?」を読み取って、月末月初に必要な処理も記述しています。
2番:無駄な常駐ソフトを落とす
次は、無駄な常駐ソフトを落とします。
SESでありがちです。
まず私が朝一で落とすのは以下2つです。
・Microsoft Teams
・Skype for Business
SES的な皆さんも、自分で必要ないなと思ったソフトは落としましょう💛
というのも、SESのPCは低スペックです。
なるべくメモリやプロセスは空けておくと、多少動いてくれます。
これもデザインですね。
コードはOffice TANAKA先生のコードを参考にmicrosoft Teamsを落とすコードを書きました、が・・・。
Sub Sample3()
Dim WD, task
Set WD = CreateObject("Word.Application")
For Each task In WD.Tasks
If task.Visible = True And <strong>InStr</strong>(task.Name, "Microsoft Teams") > 0 Then
If MsgBox(task.Name & vbCrLf & "を終了させますか?", 36) = vbYes Then
task.<strong>Close</strong>
End If
End If
Next
WD.Quit
Set WD = Nothing
End Sub
【問題点】
・常駐側(プロセス自体)は終了しない(開いてるWindowは消えるが)
・動きが安定しない
(稀に、全然処理が終了せず、変なメッセージが出る)
何にしろ、プロセス自体が終了出来なかったので、違う方法をとります。
VBA Create 「VBAでIE操作「Internet Explorerのプロセスを強制終了」する」
Public Sub Call_TaskKill()
Dim obj As Object
Set obj = CreateObject("WScript.Shell")
obj.Exec ("taskkill.exe /F /IM Teams.exe")
obj.Exec ("taskkill.exe /F /IM lync.exe")
End Sub
結論、上記のコードで達成できました。
無事、常駐側(プロセス自体)事終了する事が出来ました。
今回終了したいアプリ
・Microsoft Teams
・Skype for Business 2016
Teamsの方は、実行ファイルの名前がすぐわかったので問題なかったのですが、Skype for Businessの方は分かりませんでした。
Teamsは分かったんですが・・・。
Skypeは、ショートカットが叩いてる実行ファイルを確認できませんでした。
ただ、ググった所、lync.exeかもしれないなと思ったら、ドンピシャでした。
他にもSkypeのクローズ(Kill task)は困ってる人が沢山いるみたいで、ググったら色々ヒットして面白かったです。
windowsはバージョン違いやMicrosoft 365(旧オフィス365)など色々あるし、SkypeはSkypeもあるしSkype for Businessもあるし、混乱しますよね。
exeファイル名の探し方も実行しましたが、SES的なPCだと権限が制限されてるのか、発見できませんでした。
(現在フォルダ位置が悪いだけかも)
3番:出勤したことを伝えるメールを送る
【手順】
・まず先にoutlookでテンプレートメールを作成しておきます。
・そして、それをVBAで呼び出します。
コード
'朝、在宅勤務になり勤務開始のメールを送らないといけないので、outlookのメールテンプレートを表示します。
Viva SES!
Dim objItem As Object
Set objItem = CreateItemFromTemplate("C:\Users\***勤務開始テンプレート.oft")
objItem.Display
これだけです。
4番:メールに目を通す
毎日大量のメールが届く。
そして自分が対応するべきメールはそれほどない。
それがSESです。
【やりたい事】
・自分が対応すべきメールをPICKアップする
【やり方】
・宛先でフィルタする
・件名でフィルタする
・内容でフィルタする
・分類項目でフィルタする
・フラグでフィルタする
【コード】
とりあえず、フィルタしたい項目の取得までを記載します。
事前準備
対象としたいメールをoutlookで選択しておきます。
複数選択可能です。
outlookを「スレッド化」している人は、スレッドを展開しておかないと一番最後のメールしか読み取りません。
(スレッド内の全てのメールを読み取るようにコーディングしていたんですが、まだうまく出来ていません)
Sub getBasicEmailInfo()
Dim outlookObj As Outlook.Application
Dim objParentFolder As Outlook.Folder ' parent
Dim pastingStartPointRow As Long
pastingStartPointRow = 1
Dim myNameSpace As Object
Dim oBjMailitem As Object
Dim InboxFolder, i, n, k, attno As Long
Dim myExplr As Outlook.Explorer
Dim flagbox As String
'pre-preparation
Set outlookObj = CreateObject("Outlook.Application")
Set myNameSpace = outlookObj.GetNamespace("MAPI")
Set InboxFolder = myNameSpace.GetDefaultFolder(6)
Set myExplr = outlookObj.ActiveExplorer
'For文始まるよ
For i = 1 To myExplr.Selection.Count
'outlook mailitemオブジェクトを取得します。
'reference : https://docs.microsoft.com/en-us/office/vba/api/outlook.mailitem
Set oBjMailitem = myExplr.Selection.Item(i)
'受信者を取得
Cells(pastingStartPointRow, 1).Value = oBjMailitem.ReceivedByName
'送信者のメールアドレスを取得
Cells(pastingStartPointRow, 2).Value = oBjMailitem.SenderEmailAddress
'受信日時を取得
Cells(pastingStartPointRow, 3).Value = oBjMailitem.ReceivedTime
'メール件名を取得
Cells(pastingStartPointRow, 4).Value = oBjMailitem.Subject
'メール本文を取得
Cells(pastingStartPointRow, 5).Value = oBjMailitem.Body
'フラグリクエスト(フラグの内容)を取得
Debug.Print "FlagRequest : " & oBjMailitem.FlagRequest
'flag種類の確認して日本語に置き換えます 0:フラグなし、1:完了フラグ、2:フラグあり
If oBjMailitem.FlagStatus = 0 Then
flagbox = ""
ElseIf oBjMailitem.FlagStatus = 1 Then
flagbox = "flag完了"
ElseIf oBjMailitem.FlagStatus = 2 Then
flagbox = "flagあり"
End If
Cells(pastingStartPointRow, 6).Value = flagbox
'分類項目を取得
Cells(pastingStartPointRow, 7).Value = oBjMailitem.Categories
pastingStartPointRow = pastingStartPointRow + 1
Next i
'''---コード7|セットした変数を解除
Set outlookObj = Nothing
Set myNameSpace = Nothing
Set InboxFolder = Nothing
End Sub
outlookの分類項目について
これのことです。
FlagRequestについて
以下のケースだと「ご協力お願いします」を取得します。
FlagRequestの値の確認方法:
5番:メールで対応しないといけないものに返答していく
上記で取得した値を基に、そのメール返信を自動、または半自動で実施します。
これで、快適な朝のデザイン(朝のルーティンを自動化)の初級編は終了です。
という事でこんな感じのコードを埋め込んでみます。
【処理の条件】
①メール本文に自分の名前があったら、”全員返信”でメールを開く
②Flagあり+自分の返信で終わっているメールには、催促のメールを送る
③メール件名の命名規則などの運用がガチガチに決まっている現場では、
それの通りのガチガチの返信をする
【コード】
最後に、全部を合わせるとこんなコードになります。
Viva SESライフ!
「英語は知覚で喋れる!」というワークアウトをしています!
https://www.meetup.com/englishperception/
英語学習でなかなか喋れたり、聞こえるようにならない方がいらっしゃいましたら、
ぜひ参加して頂ければと思います。
ZOOMで30分です。もちろん無料です。