作業を少しでも効率化するためにbatやVBAなどのツールを作って使う


この記事は、富士通システムズウェブテクノロジー Advent Calendarの8日目の記事です。
（お約束）本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。

# 始めに
社会人2年目の、ただでさえ仕事が早くない自分は、地道に作業してるとまともな業務もできません・・。
少しでも直接作業に時間を多く使えるよう（もしくは少しの時間でも作業を遂行できるよう）に、効率化のためのツールを作成しようとしている記事でございます。
やっていることは初歩の初歩なので、当記事が参考になる方少ないとは思いますが・・・

#現時点でできているもの
本格的に実作業系を効率化するのはこれから（どんなことに困っているかを抽出中）なので、とりあえず今までに作った自分が困ったことを対処するツール、およびその作成方法のご紹介。

##サクラエディタのタスクキル用bat
人に聞いて回ったところ私だけのエラーっぽいんですが、サクラエディタであるファイルを一般ユーザで開いた後、管理者権限で別のファイルを開こうとするとエラーが起きてしまう（逆もしかり）。
先に開いていた方を閉じても、タスクは消えないため、タスクキルしないと管理者権限では開けない。
いちいちタスクマネージャ開いてサクラエディタのタスク探してタスクの削除してると時間かかるしストレスもたまるので、せめてボタン一個でタスクキルできないかと考えた結果のツールです。

###コード

    taskkill /im sakura.exe

これをバッチファイルに書くだけです（ほんとに記事にするようなことかこれ）。
taskkillコマンドは、プロセスID、もしくはイメージ名を指定して、その対象のタスクを終了するコマンド。
オプションでどちらを指定するのかを示します。
/PID
がプロセスIDを指定、
/IM
がイメージ名を指定するオプションです。
今回目的のサクラエディタのイメージ名は上記の通りsakura.exeなので、サクラエディタのタスクを消したいだけなら上記のコマンドでOK。
もし「私は絶対にプロセスIDでタスクを消したいんだ」という人がいるのであれば、tasklistコマンドを使うことで、現在動いているタスクのイメージ名、プロセスIDを閲覧することが可能です。
ただし、それなりの量が表示されると思うので、要覚悟。

###ショートカット作成
このツールはコード内容よりこっちのほうが有用かつ大変かもしれ・・いや絶対有用なのはこっちの方です。
ショートカット作成ならバッチを右クリックすればいいだけなんで楽なんですが、デスクトップに置くにしろエクスプローラに置くにしろ、ウィンドウの操作が面倒なのでタスクバーに置きたかったのです。
しかし、バッチファイルやそのショートカットはタスクバーにはピン止めできない様子。困った。
調べたところ、以下の記事に対処法があったので採用。

>バッチファイルをタスクバーに登録する方法
>http://pdat.jp/android-kindle/2012/09/bat/

やり方：
・バッチファイルのショートカットを作成。
・ショートカットを右クリックし、プロパティを開く。
・「ショートカット」タブの「リンク先」のパスの先頭に、

    %windir%\system32\cmd.exe /c

を追加（/cと前後のパスの間には半角スペースを忘れないこと）
・プロパティを、OKを押して閉じ、ショートカットを右クリックしてタスクバーにピン留めする

バッチファイルのショートカットを作成し、その参照先としてバッチファイルではなくコマンドプロンプトを設定し、
そこからバッチファイルを起動させるという形にすることでタスクバーにピン留めできるようになるみたいです。

ただし、この場合ショートカットのアイコンがプロンプトのアイコンと被るので、プロンプトをタスクバーにピン止めしている私には紛らわしくてしょうがない。
ので、同じくショートカットのプロパティ内の、「ショートカット」タブから、アイコンの変更を行うことで好きなアイコンに変更します。
あまり細かく調べていないため、使用できるアイコンはwindowsがデフォルトで用意しているものに限られますが、見知らぬアイコンにしておけば一応は違いが分かるようになるので。

これでサクラエディタのタスクキルがタスクバーからワンクリックでできるようになった・・・と思いきや、サクラエディタを先に管理者権限で開いていると、このままのショートカットではタスクキルできないことが判明。
これまたショートカットのプロパティ内「ショートカット」タブから詳細設定を選択、「管理者として実行」をチェックしてOKすることでやっとこさタスクキルツール完成。
管理者として実行オプションのせいでワンクリックとはいきませんが、タスクマネージャをいちいち開かなくて済むことを考えればまぁ…

##作業管理用Excel VBA

仕事してたらそりゃまぁいろんな作業を振られるわけで、忘れっぽい私には全部巣のままで覚えきることなんてできません。
手書きも、メモ帳のコストやメモ帳事態を忘れるリスク~~、いちいちメモ帳引っ張り出してくるのも面倒~~などなど考え、忘れたらそもそも仕事ができないから忘れないはずのPCで管理できないかと思った結果のExcelでの管理です。

### シート作成
シートの書き方は作業をするのに必要な情報を各々が入れればいいはずなので・・・一応自分が作った管理表を載せておきます（ぼやけてるけど…）。
![sagyoukanri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539889/8b90f03a-3f31-8ef7-4443-c3354be7d8d8.png)
F列、G列の「状態」と「優先度」の列には入力規制を設けています（いうまでもなくこの辺も自由）。
![nyuryokukisei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539889/ec5d997a-7420-19d7-45d0-283850339667.png)

###コード
上記のシートに合わせて以下のようにコードを作成。

    Option Explicit

    Sub log_manage()
    
    Dim log_num As Integer
    Dim i As Integer
    
    log_num = 4

    Do While Worksheets(2).Cells(log_num, 6).Value <> ""
        log_num = log_num + 1
    Loop
    
    i = 4

    Do While Worksheets(1).Cells(i, 1).Value <> ""
        If Worksheets(1).Cells(i, 6).Value = "完了" Or Worksheets(1).Cells(i, 6).Value = "立ち消え" Then
            Worksheets(2).Rows(log_num).Value = Worksheets(1).Rows(i).Value
            Worksheets(1).Rows(i).Delete
            log_num = log_num + 1
            i = i - 1
        End If
        i = i + 1
    Loop
    
    End Sub

これまた全体的に簡単。
そもそもの書き方は調べてもらうとして、中身についてです。
結論から言うとステータスを「完了」または「立ち消え」に設定したタスクを別に作成した履歴シートに送るコードです。
変数log_numには履歴シートに次に書き込む行番号を代入、変数iは繰り返し文に使う一時変数です。
履歴シートへの書き込みは4行目から始めているので、まずlog_numに4を代入。
do While文で履歴シートに既に履歴が書き込まれている行をカウントします。
次に、タスク一覧の概要欄が空セルになるまでタスクの状態を上から順に確認していき、「完了」、または「立ち消え」の場合は履歴シートのlog_numの行にそのタスクを書き込みます。
全体的に簡単な書き方を選択しているため、シートの順番を変えたりするだけで割と簡単に壊れてしまいますので、参考にされる場合はご注意を。

#今後に関して
現在自分が作成しているツールは以上です。今後は対策する課題を考えて、それに対して新しいツールを作る予定です。
現状考えているのは、teratermとvbaを利用したネットワーク機器のログ取得ツールが便利そうかなと言ったところ。

#終わりに
拙い記事かと思われますが、読んでいただけたなら幸いです。この記事に書いてあるコードの改善方法はいくらでも見つかると思いますので、突っ込んでやろうと言う方がもしいらっしゃればぜひ突っ込んでいただけると勉強になります。