親愛なる貴方のために・・・え?誰?
インターネットの世界では、サーバーサイドプログラムがWEBサイトを閲覧した人々や巡回ロボット(クローラー/スパイダー)の足跡を「アクセスログ」として記録しています。足跡は、そのコンピュータ(携帯電話などPDAも含む)を特定する識別情報で、実際に操作している人間までは特定できません。
会社のパソコンなどでは、1台のパソコンを複数の人が使うことも想定されます。最近のWindowsマシンでは、Administretor(アドミニストレーター権限)で予め登録してあるユーザー以外の使用を排除するため、使用者にパスワードの入力を求めたりもします。
図:パスワードを入力しないと、ログインできないようにしている
[ BakuJAN活用例.xls
]のユーザーフォームを起動させると、VBAマクロはログインするためのパスワード入力をユーザーに求めます。予めブックに記録してあるパスワードと照合を行い、入力したバスワードと合致すれば操作を続行できますし、合致しなければ延々と待受け画面のままで待機します。
ログイン用のパスワードを知らないユーザーの操作は受け付けず、また、ログインを制限するだけでなく、ログインに成功した日時・パスワードを履歴として、このブックとは別の外部ファイルに記録するVBAマクロを実行しています。
- ★
値が確定して初めて動くExitイベントプロシージャ
- ★
外部ファイルが無ければ新規に作成し、データを追記する
- このプロシージャでは、正しいパスワードを入力し終えると、外部ファイル(日付毎に作成される独立したファイル)の存在をVBAマクロが判断し、[
OpenTextFileメソッド ] の引数[ create = True
]によってファイルが無ければ新規に作成し、ファイルがある場合は[ WriteLineメソッド
]を使って、編集(追加記述)をします。追加される位置は、ファイルの最下行になります。[ WriteLineメソッド
]の行では、各データは[ "(ダブルクォーテーション) ]で囲まれ、[ ,(カンマ)
]で区切られたフォーマットで記録されます。
コードの始めにある[ UCase(EdtPass00) ]と[
UCase(Pwd_ad) ]は、それぞれユーザーが入力したパスワードと登録してあるログイン用のパスワードが入力されている[
TextBoxコントロール ]の名前で、[ Valueプロパティ ]を返しています。条件式[ Ifステートメント
]でお互いの値が等しいときに、処理を続けるようになっています。複数のユーザーアカウントとの照合方法は、別の章で紹介しています。[
Ucase関数
]は、小文字を大文字に変換する関数で、常に大文字で照合するようにしています。 パスワードを入力する[
EdtPass00 ]は、[ Changeイベント ]ではなく[ Exitイベント
]を使っています。ユーザーが、パスワードの入力を完了した意思表示として[ Enterキー
]を押すか、バーコードスキャナーでバーコードの読み取りが完了したコード(キャリッジターン等)が入力され、フォーカスが他のコントロールに移る際に、このコードが実行されます。
- ★
マルチページコントロールのページを切り替える
ログの出力が終わると、[ ログイン画面 ]から[
メニュー画面 ]へと切り替えるため、[ MultiPage1 ]の[ Valueプロパティ ]を[ 1
]に変更します。ログイン画面には、ユーザーフォームを閉じるために必要な[ 終了ボタン
]を表示していませんから、パスワードを知らない場合は、強制終了([ Ctrl ] + [ DEL
]やパソコンのコンセントを抜く?)を行う以外に、マクロを中止する手立てもありません。
扱いやすい [ Changeイベント
]を使った場合は、パスワードが1文字ずつ入力される度にイベントが発生し、その度に、保存してあるパスワードとユーザーが入力したパスワードを総当りで検証するようになりますが、[
Exitイベント ]との違いはどのようなものなのでしょうか。
仮に[ Changeイベント
]を使ったとすると、1文字ずつ入力される度に、パスワードの判定や判定に移るための桁数カウントを行うコードが加わります。[
Changeイベント ]では、コードの前半で[ LEN関数 ]を使い、入力値が指定文字数になるまで[ Exitステートメント
]でプロシージャを抜けさせる方法もありますが、[ EdtPass00
]が扱うのはパスワードなので、桁数さえも判明することは避けたい理由から[ Exitイベント ]を使っています。
無事にパスワードを使ってログインできたときに、初めて[ メニュー画面
]が表示されます。その裏側では、ログインした年月日と時間、それとパスワードが記録された「ログファイル」が作成されています。
仮に、このマクロを起動フォルダ[ XLStart ]に置いておけば、そのパソコンで[ Excel
]が起動するたびにログイン画面が表示され、秘密裏に[ Excel
]の起動時間を記録できます。ワークシート上のキーボード操作ではありますが、[ OnEntryプロパティ
]でアクティブセルを特定し、ユーザーのキーボード操作を記録することもできますが、悪用してはだめですよ。
番外2.
- Download Vectorサイト -->「キーボード操作記録VBAマクロ キー録
ver1.0」
ログ(外部CSVテキストファイル)を作る以外に、こんな動作をするマクロブックです。 1.
初回起動時に自分自身を隠す。 2. 過去ログをオリジナルメニューバーへリスト化する(7日分)。 3.
過去ログを高速に読み取る。 ログファイルは、その日初めてログインがあった際に、[
(その日の年月日).log
]という外部ファイルを作成します。また、その日2回目以降のログイン情報は、同ファイルに追記されます。 記録されるフォーマットは、「"2005/04/01
08:58:21","IN:ADMIN-01"」とダブルクォーテーション(")で囲まれたデータと、カンマ区切り(,)で構成しています。 Excelブック以外のファイル、カンマ区切りやタブ、スペース区切りなどのフォーマット、また、TXT・LOG・DOC・CGIなどの拡張子があるにせよ、主にテキストエディターでも読み書き出来るタイプのテキストファイルは、[
CreateObject関数
]を使って読み書きをしています。 ワークシートの規制の枠から飛び出し、外部ファイルを使うことで、「最大65,536個のデータ」までしか扱えないという、Excel上で運用するための制限が無くなります。 ログフォーマットは、プロシージャ内の記述で指定しているだけなので、CGI等で使われる「<>」を区切り文字に使うことも、ログファイル名を[
その年月日.CSV ]とCSV形式にすることも自在にできます。
|