Twitterで勤怠管理について話が出てきて昔ExcelVBAマクロとNFC(ICカード)を連携させてデータを取ってくる物を作った事を思い出しました。
そのVBAマクロを使って「こんなん出来るよ」的な紹介をしようと過去のデータを漁ってたけど見当たらりませんでした。
そこで思い出しも兼ねてNFC(ICカード)読み取り機を引っ張り出して再度ExcelVBAマクロを作ったのでここで紹介します。
概要
今回作成するマクロはICカードでリーダーにて読み取ったIDを元に登録情報を引っ張ってきて表示するという簡単なマクロです。
必要なもの
このVBAマクロを作るために以下の物が必要になってきます。
- NFC読み取り機
- ICカード
- NFC読み取り機の制御用API
NFC読み取り機は基本どれでも可能だと思います。
ちなみに僕が今回のマクロで使用したNFC読み取り機はSONY製の物です。
ICカードについては今回IDの読み取りだけを使っているため、読み取り可能な物であれば何でもOKです。(上記NFC読み取り機ではmanaca(交通系ICカード)やスマホ(おサイフケータイ機能付き)でも読み取りできました)
NFC読み取り機の制御用APIについて、昔は「株式会社オレンジタグス」さんで公開してくれていたAPIを使って実装したのですが現在は見当たらず断念しました。
代わりを探したところ、「ひつじかいの雑記帳」さんのところで「Sheep Smart Card Dll」を公開してくれているのでこれを使いました。(ありがとうございます)
32bit版と64bit版でわかれているので環境に合った物をダウンロードします。(OSではなくExcelに合ったバージョンを選びましょう)
ダウンロードした「Sheep Smart Card Dll」は環境に合った場所へ格納します。
- OS、Excelともに64bit:SheepSmartCard64.dllをC:\Windows\System32
- OS64bit、Excel32bit:SheepSmartCard32.dllをC:\Windows\SysWOW64
- OS、Excelともに32bit:SheepSmartCard32.dllをC:\Windows\System32
サンプルデータを確認
Sheep Smart Card Dllと一緒にExcelマクロ用のサンプルデータも公開してくれています。
まずはサンプルデータを使って動作の確認をしていきましょう。(事前にNFC読み取り機が動作することを確認しておきましょう)
NFC読み取り機にICカードを置き、「ID読み取り」ボタンをクリックすることで「カードID」にICカードのIDが表示されます。(OS、Excelともに64bitの環境であれば動きますがそれ以外の環境ではソースコードの修正が必要です)
サンプルデータのソースの最初ではSheep Smart Card Dllの宣言をしています。
環境に応じて(a)(b)(c)のいずれか1つだけコメントを外して残りはコメントにしておきます。(さきほど「ID読み取り」ボタンを押してもエラーとなった方はこちらを見直してみましょう)
プロシージャは「ID読み取り」ボタンのクリックイベント1つだけです。
「GetSmartCardUID()」関数を使うことでICカードからIDを取得することができます。
たいへんシンプルでわかりやすかったです。
ICカードのIDから名前を取得してみる
IDの表示だけではつまらないのでサンプルデータをベースにIDに紐づく名前を表示するソースに変更してみます。
「ID読み取り」ボタンのクリックイベントの最初でIDと名前の紐づけ情報をCollectionに詰め込む処理を追加しました。(今回は軽く確認のためだけの改変だったのでFor文で1~2行目のデータだけ詰め込んでいます)
サンプルデータでは取得したIDをそのまま表示していたのでIDから名前を取得してそれを表示するように変更しました。
IDと名前の紐づけ情報はSheet3にA列にID、B列に名前を書いて対応しています。
実際に動作させて確認してみました。
IDによる紐づけが出来るので前回記事にて紹介したaccdb(mdb)と連携することで更にパワフルなシステム構築もできると思います。
まとめ
「ひつじかいの雑記帳」さんの「Sheep Smart Card Dll」のおかげで簡単なソースを組むだけでICカードと連携できるVBAマクロを容易に作成できるようになります。
ICカードからIDを読み取るだけの機能ですがタイムカードの代替えやポイントカードの導入などアイデア次第でいろんなシステムを作ることができそうです。
コメント
はじめまして、みるねと申します。
本日はお聞きしたいことがありコメントさせて頂きました。
RC-S380のドライバーをインストールしソニー製NFCポート自己診断し通信ができている事を確認。
環境はWindows10の64bit
マイクロソフトエクセル365の64bitです。
指定の場所にSheep Smart Card Dll64.dllを置き、エクセルのサンプルソースをひつじかいさんの所からダウンロードしID読み取りをクリックしたところ、カードがセットされていないか、または読み取り出来ないカードがセットされていますと表示されUIDが読み取れない状態となっています。
何か心当たりや御指導頂けることありませんでしょうか。
エクセルのソースをそのまま使用したら読み取れないのでしょうか。
お分かりの範囲で御指導頂ければ幸いです。
みるねさん
コメントありがとうございます。
管理人の渡り鳥です。
コメントの内容、確認させていただきました。
OS、Excelともに64bitとの事でDLLも64bit版をダウンロードされているようでここは問題無さそうですね。
また、「カードがセットされていないか、または読み取り出来ないカードがセットされています」とメッセージが表示されている事でDLLを呼び出しはしているようです。(DLLの呼び出しが出来ない場合であればExcelのデバッグエラーが出るはずなので)
環境については問題無いと思います。
今はICカードリーダーが手元に無いので動作の確認が出来ないですがこちらでも確認してみます。
みるねさん
カードリーダーを使って確認してみました。
環境はExcelのバージョン以外みるねさんと同じです。
【環境】
OS:64bit Windows 10 Home
Excel:64bit Microsoft Office Standard 2019
【手順】
1. 「SheepSmartCardSample_Excel.zip」「SheepSmartCard64.zip」の2つをダウンロードして解凍しておく
2. 「SheepSmartCard64.dll」を「C:\Windows\System32」へ格納する
3. カードリーダー(RC-S380)をPCに接続する(自動でドライバーがインストールされる)
4. 「SheepSmartCardSample.xlsm」を開いて「ID読み取り」ボタン押下で「カードがセットされていないか、または読み取りできないカードがセットされています。」が表示される
5. カードリーダーにNFCカードを置いて「ID読み取り」ボタン押下で「カードID」にカードIDが表示される
という事でみるねさんの現象を再現する事はできませんでした。
これ以上はこちらの環境での確認が出来ないのでダメもとで試す提案をします。
1. (RC-S380のドライバーがソフトウェアであるなら)ソフトウェアをアンインストールしてみる(Excelマクロと競合している可能性を考えた提案)
2. ドライバーをアンインストールしてみる(ドライバーに何らかの不具合が生じてExcelマクロから正しく認識していない可能性を考えた提案)
これらを試してみてもうまくいかない場合はすいません、お手上げです。