Employee Blog
社員ブログ

pythonを使ってエクセル入力を簡単自動化

日々繰り返し行っている作業はありませんか?
例えば毎日勤務表をエクセルで付けるなど。

今回はエクセル勤務表の入力作業をpythonを使って自動化する方法をご紹介します。

今回利用する勤務表のエクセルファイルはこちら。
同じファイルを作成してみてください。

自動化で効率化できる手順のイメージです。

■これまで
 ① 勤務表の配置しているフォルダに移動する
 ② エクセルファイルを開く
 ③ 退勤時間に現在時間を入力する
 ④ 保存する
 ⑤ ファイルを閉じる
 ⑥ フォルダを閉じる

■これから
 ① デスクトップのアイコンをダブルクリック 以上!!

それでは作って行きましょう。

■環境構築

1. pythonインストール

今回はpythonで実装します。
まずはpythonをインストールしましょう。
インストール方法は公式サイト等を参考にしてください。
https://www.python.org/downloads/

2. 実行フォルダの作成

プログラムを作成するフォルダを作ります。
場所はどこでもOKです。今回はCドライブの下にwork_sampleフォルダを作りました。
作成したフォルダにサンプルのエクセルを配置します。

3. 仮想環境の構築

pythonには他の環境と競合しない仮想環境を作ることができます。
コマンドプロンプトを起動し作成フォルダに移動後に以下のコマンドで仮想環境を作成します。
実行後は.venvフォルダが作成されます。

python -m venv .venv

4. 外部ライブラリのインストール

作成した仮想環境を有効化します。
.venvが作成されたフォルダで以下のコマンドを実行し、(.venv)がコマンドに追加されていることを確認してください。

cmd /k .venv\Scripts\activate

次にpythonにライブラリをインストールするための”pip”を最新化します。

python -m pip install --upgrade pip

最後にpythonからエクセルを操作するライブラリ「xlwings」をインストールします。
他に有名なライブラリとして「openpyxl」や「pandas」などがありますが今回はxlwingsを利用します。

python -m pip install xlwings

ここまでで環境準備ができました。
次は実際にpythonのプログラムで実装します。

プログラム

以下のプログラムをコピーし、同じフォルダに「input.py」で保存します。
プログラムの詳細はコメントの内容を確認してみてください。

input.py
from datetime import date, datetime
import xlwings as xw

def main():
    try:
        print("時間を設定します")

        # エクセルアプリを開きます。
        # visible=Falseを設定することで実際のエクセルは開かず処理できます。
        app = xw.App(visible=False)
        # エクセルファイルを開きます
        wb = app.books.open("勤務表.xlsx")
        # activeなシートを選択します
        sheet = wb.sheets.active

        # 氏名のセルから値を取得し、未設定の場合にセットします
        # 値はsheet[セル名].valueで取得できます
        name = sheet["B1"].value
        if name is None:
            # 値を設定する場合はsheet[セル名].valueに代入します
            sheet["B1"].value = "アルク ブログ"

        # 勤務時間を設定します
        # 今日の日付を取得します
        today = date.today()
        # カレンダーの1行目(セルの4行目)から31日分ループで処理します
        for row_num in range(4, 34):
            # 1行分取得します
            # sheet.range("A1:C1")のように範囲指定すると1行取得できます
            row = sheet.range(f"A{row_num}:C{row_num}")
            # 0番目(A列)の日付を取得します
            cell_value = row[0].value

            # 日付が設定されていて、かつ今日と同じ場合に時間を設定します
            if isinstance(cell_value, datetime) and cell_value.date() == today:
                # 開始時間は9:00に固定して1番目(B列)に設定します
                row[1].value = "9:00"
                # 終了時間は現在時間をフォーマットして2番目(C列)に設定します
                row[2].value = datetime.now().strftime("%H:%M")

                # 対象日の設定が終わればループを抜けます
                break

        # ファイルを上書き保存します
        wb.save()

        print("設定しました")

    finally:
        # 処理が終わればファイルをアプリを閉じます
        wb.close()
        app.quit()


# コマンドからpythonを実行したときに呼び出されます
if __name__ == "__main__":
    main()

ここまで出来ればpythonでエクセルが入力できるようになります。
実際に動かしてみましょう。
コマンドプロンプトに(.venv)がついている状態でファイルを配置したフォルダから以下を実行します。

python input.py

エラー無く実行が出来れば、エクセルに時間が設定されているはずです。
ファイルを開いて入力されているか確認しましょう。

デスクトップにショートカットの配置

ここまでで自動化はできました。
ここから、最終目的のデスクトップから実行できるツールにします。

ツール起動はデスクトップの実行ファイルはwindowsのbatchファイルを使います。

以下のプログラムを「input.bat」のファイル名で保存します。

input.bat
@echo off
chcp 65001

rem 1. 仮想環境をアクティブ化
call .venv\Scripts\activate.bat

rem 2. Pythonの実行
python input.py

rem 3. 仮想環境を無効化
call .venv\Scripts\deactivate.bat

このinput.batファイルをダブルクリックすると、
pythonファイルが実行されて、勤務表に現在時間が入力されます。

最後にこのinput.batのショートカットをデスクトップに配置します。
試しにダブルクリックで起動して、エクセルに入力されていることを確認しましょう。

これでダブルクリックだけでエクセルに時間を入力することができました。

いかがでしたでしょうか?
今回は簡単なプログラムで説明しましたが、プログラムを使うと時間がかかる業務を一瞬で終わらせることができます。
是非お試しください。