【DLサンプル付き】SikuliXでエクセル操作を自動化する方法ー入門編ー

【DLサンプル付き】SikuliXでエクセル操作を自動化する方法ー入門編ー

SikuliXで始めるExcel自動化

エクセルは手軽に表形式でデータを管理できますが、そのデータを別の場所へ繰り返し入力するといった作業は大変ですね。本記事ではこのような業務を自動化できるように、SikuliXでエクセルを扱う方法をご紹介します。

本記事ではできるだけ難しいプログラムを使わないようにしていますが、基本的な操作は分かる前提で書かれています。SikuliXの基本操作が分からないという方は、【初心者向け】SikuliXを入れたらまずやるべきチュートリアル5選をご覧ください。

なお、プログラムの完成系はこちらからダウンロードしていただけます。自動化プログラムを作るうえで参考にしていただければ幸いです。

SikuliXでエクセルを扱うには?

SikuliXでエクセルを操作するには以下の方法があります。

  • 「SikuliXのキー入力」で操作する
  • Pythonのライブラリを使用する
  • SikuliXからVBAを実行する

Pythonのライブラリを使用は効率的な方法ではありますが、扱うにはある程度プログラミングの知識が必要です。本記事では、SikuliXの基本的な操作でエクセルを扱えることをご紹介するため「SikuliXのキー入力でエクセルを操作する方法」をご説明します。

エクセルデータの入出力を行う

今回は例として、エクセルに保存したデータをメモ帳に貼り付けるプログラムを作成します。エクセルのA, B列のセルを一つずつメモ帳に貼り付けて、貼り付けが終わった行にはC列に「OK」と入力していきます。

前準備として、下の画像のようにエクセルファイルを作成し、どこかのフォルダに保存してください。

プログラムの大まかな流れは以下の通りです。

  1.  メモ帳とエクセルファイルを開く
  2.  A,B列のセル内の文字をメモ帳に貼り付け、完了した行のC列セルにOKと記入
  3. 次の行へ移動(あとは、2と3の繰り返し)
SikuliXでエクセルを自動操作するプログラム

それでは、1ステップずつプログラムを作成してみましょう。

メモ帳とエクセルファイルを開く

メモ帳は新規ファイルとして開き、エクセルは事前に保存してあるファイルを開きます。SikuliXでアプリケーションを開くにはさまざまな方法がありますが、今回は「App.open()」を使用して開きます。

App.open("実行ファイルパス・保存済みファイルのパス")

新規ファイルとして開く場合は実行ファイルのパスを、保存済みのファイルを開く場合はそのファイルのパスを入力します。パスを入力するときは、下記のような点に注意してください。

  • \マークは二つ重ねて入力する
  • パスの中にスペースが含まれる場合は、ダブルクオーテーション(“”)をさらにシングルクオーテーション(”)で囲む
  • パスの中に日本語が含まれる場合はクオーテーションの前に「u」を入力する

メモ帳とエクセルファイルを開くには次のようにします。メモ帳の実行ファイルのパスやエクセルファイルのパスはご自身の環境に合わせて入力してください。プログラムを実行する前に、毎回すでに開いているメモ帳やエクセルを閉じてください。

「App.open()」でアプリケーションを開いた後は、そのアプリケーションを操作する処理を書くことになります。そのため、アプリケーションが「App.open()」で正常に開いたことを待つ処理を入れましょう。SikuliXで待つ処理は「sleep関数」と「wait関数」があります。

sleep関数は指定した秒数だけプログラムの実行を待つという処理でした。今回の場合、何秒待てばよいでしょうか?2秒だと少し不安ですが、毎回10秒待つとなると時間がかかりすぎな気がします。今回のケースではsleep関数を使わず、「wait関数」を使用しましょう。

wait関数は特定の画像が画面に現れるまで、指定した秒数だけプログラムの実行を待ちます。画像が見つかればその時点でプログラムは再開され、画像が時間内に見つからなければエラーになります。wait関数を使うと、アプリケーションが開いたと同時にプログラムを再開できます。

wait(“画像”, “秒数”)

画像は「スクリーンショットを撮る」で入力します。秒数は省略することができ、省略した場合の秒数はデフォルトで3秒です。例えば下の画像のようにwait関数を使うとメモ帳とエクセルが開かれたことを確認できます。

メモ帳は新規ファイルで開くので、メモ帳のウインドウタイトルが見つかれば、メモ帳が開かれたと判断しています。エクセルは開くファイルによってファイル名が変わるので、ウインドウタイトルを使っていません。どのようにして開かれたことを判断するかは悩ましいですが、今回は拡張子の「.xlsx」の部分で判断しています。

各セル内の文字をメモ帳に貼り付け、完了した行にOKと記入

まず読み取りたいのは「A2」のセルです。「A2」のセルにカーソルを合わせる方法を考えてみましょう。

新規ファイルであればカーソルが「A1」に当たっているので下矢印キーを一度押せばよいですが、保存済みのファイルだとどこにカーソルが当たっているかはわかりません。よって、一度「A1」のセルにカーソルを当てる処理をしてから、下矢印キーを押すと「A2」のセルに合わせられます。

「A1」のセルには「Ctrlキー+HOMEキー」と入力すれば移動できます。矢印キーなどの特殊なキーの入力や、どこかのボタンを押しながら別のボタンを押す処理を実装するには以下のように記述します。

# 特殊キーの入力
type(Key.[入力する特殊キー])
# キーの同時押し
type("入力するキー", "押しっぱなしにするキー")

「A2」セルに移動する処理を実装すると次のようになります。

「A2」セルに移動したあとはセルをコピーしてメモ帳に貼り付けます。メモ帳はすでに開いているので、タスクバーのアイコンをクリックして表示させましょう。

A列セルの情報をコピーして、メモ帳に貼り付ける処理ができました。B列からの読み取りやC列への入力も同じような要領で行えます。

開いているエクセルやメモ帳を閉じて実行してみてください。「A2」セルと「B2」セルの文字がメモ帳に貼り付けられ、「C2」セルにOKと記入されます。ここまでで1行分の処理を完了することができました。最後の処理は「A3」セルへの移動です。

全部の行で実行できるようにする

今回はエクセルファイル内に3行分のデータを登録して保存しました。しかし、実際に業務で使用する場合はファイル内のデータの行数は事前に定まっていない場合がほとんどです。

そこで、上の行から順に繰り返し処理を行い、A列でデータが入っていないセルを見つけたら処理を終了するという実装を行います。繰り返しを行うにはwhile文を使います。条件判定をTrueにすることで、指定した処理を繰り返し続けます。

while True:
    # ここに記述した処理は繰り返し続ける

※この繰り返し処理はエラーになるか、強制終了するまで終わりません。処理を中止するには強制終了(alt + Shift + c)してください。

while文の中でA列のセルにデータが入っているかチェックを行い、空であればwhile文を終了させ、空でなければ処理を続行させます。このように条件に基づいて処理を切り替えるにはif文を使います。

if文の使い方(SikuliX)

A列のセルが空であるかで処理を分けるには次のように行います。

空であるかは「Env.getClipboard() == “\n”」で判断しています。

左辺の「Env.getClipboard()」はコピーしたデータを取得できます。空のセルをコピーした場合は改行だけがコピーされます。右辺の「\n」は改行を表現しています。「==」は等しいを意味するので、コピーしたセルが改行のみだった場合に左辺と右辺が等しくなり、if文の中身が実行されます。if文の詳しい使用方法はPython公式ドキュメントをご覧ください。

if文の中では「break」が実行されます。これは繰り返し処理を強制的に終了させるコードです。breakが実行された時点でwhile文の中の処理は終了します。

この繰り返し処理と今まで実装したエクセル操作を組み合わせましょう。

while文でエクセルとメモ帳の入出力を繰り返す

上の図を実装したコードがこちらです。

実行してみましょう。データが入っているすべての行について処理が行われ、空データの行で終了すれば成功です。エクセルをキー入力で操作することができました。

※if文の判定が上手くいかない場合は、終わることなく繰り返し処理が続きます。「alt + Shift + c」で処理を強制終了してください。

(補足)プログラムコードを整理する

完成したプログラムを見ると、繰り返し同じような処理を記述していることが分かります。「メモ帳を表示して貼り付け」や「エクセルを表示して右のセルに移動」がそうです。

何度も同じ処理を書いていると混乱しますし、処理を変更するときはひとつひとつ修正しなければならないので面倒です。このような処理は一つにまとめてしまいましょう。処理をひとまとめにするには関数を使います。

関数を定義する方法(SikuliX)

関数名は自分で好きにつけられますが、英字とアンダーバーを使うようにしましょう。関数内の処理をイメージできる英単語をアンダーバーで区切るという名付け方が一般的です。

「メモ帳を表示して貼り付け」と「エクセルを表示して右のセルに移動」を関数化してみましょう。プログラムの一番上に記述します。

関数にまとめた処理を呼び出すには「関数名()」と記述します。今回の例だと以下のようになります。

処理がまとまって見やすくなりました。関数の実行が上手くいかないという方は、関数を記述した位置を確認してみてください。関数を実行する場所よりも上に書かなければ、関数は呼び出せません。

まとめ

SikuliXを使ってエクセルを操作する方法をご紹介しました。繰り返し処理はプログラミングの要素が強く難しく感じられたかもしれませんが、エクセルの操作はキー入力だけで可能だとお判りいただけたかと思います。

データ数が多い場合や、もう少し複雑な処理を行う場合はキー入力のみでは難しいかもしれません。そのときはほかの方法、例えばpythonのライブラリを使ってエクセルを操作するなどが考えられます。

バルモアでもエクセル操作などを含む、業務の自動化をご支援しております。業務自動化でお困りのことがございましたら、お気軽にお問い合わせください。