HOME BBS A B C D E F G H
1


「BakuJAN活用例」の解・体・親・書

親愛なる貴方のために・・・え?誰?

2.使用者の履歴を残す

 インターネットの世界では、サーバーサイドプログラムが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形式にすることも自在にできます。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Microsoft(R) Excel、Microsoft Visual Basicは米国Microsoft Corporationの米国およびその他の国における登録商標または商標で、Microsoft Corporationのガイドラインに従って画面写真を使用しています。