記事一覧

勝手にソリューション - 特定のユーザーにおみくじを楽しんでもらう

 

  
目次     



  

特定の人物におみくじを楽しんでもらう

ハロー、みなさん。エジソンです。 

先日、以下のような記事を書きました。



話を要約すると、Aさんが便利なツールを作り、社内でも一定の評価を得ているのにも関わらず、Aさんに精神的な攻撃を加えてくるBさんがいるので、Bさんにおみくじプログラムを楽しんでもらいストレスを緩和させ、円満な人間関係を築こう…、そんなお話?!

そのようなソリューションを提供すべく、勝手にプログラムを書いてみました。


Excel VBAのコード

早速コードを見ていきましょう!

ちょっと長いコードになりますので、事前に内容を整理しておきます。
「マクロ実行時に、Bさんにのみ、おみくじを引かせてあげたい!」

これを実現するためには…。

  1. 特定のユーザーを識別するためにユーザー情報を取得するモジュール
  2. おみくじを引くプログラムとしてのモジュール
  3. マクロ実行時に、特定のユーザーの判定・おみくじを引く処理を仕込んだサンプルコード

上から順に、それぞれリスト1~3でコードを掲載しました。

※prettyprintプラグインにて、VBAコードを表示すると、コメント行の解釈がおかしなものになるため、コメント行はシングルクォートを2つ連続で表記しています。

リスト1:標準モジュール「UserInfoGetter」として保存
Option Explicit

'' ユーザー名の取得
Public Function GetUserName()

    Dim network As Object
    Set network = CreateObject("WScript.Network")
    
    GetUserName = network.userName

End Function

'' コンピュータ名の取得
Public Function GetComputerName()

    Dim network As Object
    Set network = CreateObject("WScript.Network")
    
    GetComputerName = network.computerName

End Function

'' IPアドレスリストの取得
Public Function GetIPAddress() As Collection
    Dim ret As Collection
    Set ret = New Collection

    Dim netAdapters As Object
    Dim netAdapter As Object
    Dim ipAddress As Variant
    
    Set netAdapters = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") _
                           .ExecQuery("Select * from Win32_NetworkAdapterConfiguration " & _
                           "Where (IPEnabled = TRUE)")

    For Each netAdapter In netAdapters
    
        For Each ipAddress In netAdapter.ipAddress
            ret.Add ipAddress
        Next
    Next

    Set GetIPAddress = ret

End Function

'' Macアドレスリストの取得
Function GetMacAddress() As Collection

    Dim ret As Collection
    Set ret = New Collection

    Dim netAdapters As Object
    Dim netAdapter As Object
    Dim macAddress As Variant
    
    Set netAdapters = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") _
                           .ExecQuery("Select * from Win32_NetworkAdapterConfiguration " & _
                           "Where (MACAddress IS NOT NULL)")

    For Each netAdapter In netAdapters
    
        ret.Add netAdapter.macAddress
    Next
    
    Set GetMacAddress = ret

End Function

まず、リスト1に着目すると、単にユーザー情報を取得するモジュールです。ユーザー情報の識別をどのように実施するかは、おみくじを仕込む作成者側の戦略に依存します。ここでは、色々なユーザー情報の取得の仕方が有り、状況に応じてそれぞれの関数を使ってね!というものです。

リスト2:標準モジュール「Omikuji」として保存
Option Explicit

'' おみくじを取得する
Public Function GetOmiKuji() As String

    Dim randomNumber As Integer
    
    randomNumber = Int(Rnd * 100)
    
    If 0 <= randomNumber And randomNumber <= 14 Then
    
        GetOmiKuji = "大凶"
    
    ElseIf 15 <= randomNumber And randomNumber <= 29 Then
    
        GetOmiKuji = "凶"
    
    ElseIf 30 <= randomNumber And randomNumber <= 44 Then
    
        GetOmiKuji = "小吉"

    ElseIf 45 <= randomNumber And randomNumber <= 59 Then
    
        GetOmiKuji = "中吉"
    
    ElseIf 60 <= randomNumber And randomNumber <= 74 Then
    
        GetOmiKuji = "吉"
    
    ElseIf 75 <= randomNumber And randomNumber <= 99 Then
    
        GetOmiKuji = "大吉"
    
    End If

End Function

リスト2は、おみくじプログラムです。乱数で1~100の数値を得て、対応する結果の文字列に変換しています。

リスト3:マクロの実行コードにおみくじプログラムを仕込む
'' 実行ボタン
Private Sub btnExecute_Click()

    Dim kuji As String
    
    If Not IsSpecialUser Then
        '' 特別なユーザーではないので通常実行
        MsgBox "何かしら実行する…", vbOKOnly, "Info"
        Exit Sub
    End If
    
    '' 特別なユーザーの場合…
    '' おみくじを引く
    kuji = omikuji.GetOmiKuji
    
    '' おみくじの内容を表示する
    MsgBox kuji & "を引きました", vbOKOnly, "Info"
    
    '' 大吉かを判定する
    If kuji = "大吉" Then
    
        '' 大吉ならば、何かしらの処理を実行する
        MsgBox "何かしら実行する…", vbOKOnly, "Info"
    End If
    

End Sub

'' 特別なユーザーであるかを判定する
Private Function IsSpecialUser() As Boolean

    '' ユーザー情報
    Dim userName       As String
    Dim computerName   As String
    Dim ipAddressList  As Collection
    Dim ipAddress      As Variant
    Dim macAddressList As Collection
    Dim macAddress     As Variant
    
    '' ユーザー情報を取得する
    userName = UserInfoGetter.GetUserName
    computerName = UserInfoGetter.GetComputerName
    Set ipAddressList = UserInfoGetter.GetIPAddress
    Set macAddressList = UserInfoGetter.GetMacAddress
    
    IsSpecialUser = False
    
    '' ユーザーで判定する
    If userName = "ここに情報を入力" Then
        IsSpecialUser = True
        Exit Function
    End If
    
    '' コンピューター名で判定する
    If computerName = "ここに情報を入力" Then
        IsSpecialUser = True
        Exit Function
    End If
    
    '' IPアドレスで判定する
    For Each ipAddress In ipAddressList
    
        If ipAddress = "ここに情報を入力" Then
            IsSpecialUser = True
            Exit Function
        End If
    
    Next
    
    '' Macアドレスで判定する
    For Each macAddress In macAddressList
    
        If macAddress = "ここに情報を入力" Then
            IsSpecialUser = True
            Exit Function
        End If
    
    Next
    
End Function


リスト3は実行例です。このコードは Excel のシート上に仕込んだものです。シートにボタンを設置し、ボタンのイベントハンドラを btnExecute_Click として記述しています。

同コードに IsSpecialUser 関数を書いており、こちらで特定のユーザー情報を埋め込み、結果を True で返却すれば OK です。

IsSpecialUser の戻り値が、False なら通常通りの動作になり、True ならおみくじプログラムが発動し、大吉を引くとメイン処理が実行されるという流れになります。

omikuji.png 


特定のユーザー情報の調査

社内のIT情報として、ユーザー情報がオープンにされていない場合は、プログラム中からユーザーを識別することができません…。であれば、調べるしか無いですよね。

社内環境であれば、共有フォルダが設置していると思われるので、まずはマクロに、”マクロが実行された際にユーザー情報をログとして保存するプログラム”を仕込みましょう。

そうして得たログから、お目当てのユーザー情報を特定します。

そうして、リスト3の IsSpecialUser 関数に、特定したいユーザー情報を仕込めば完成となります。
ユーザー情報は、ユーザー名、コンピュータ名、IPアドレス、Macアドレスの何れでも構いません。一つでも入手できれば、プログラムからユーザーを特定できますからね。


おわりに

おちゃらけた事に対して、真面目に取り組んでみましたが、いかがでしたか?
頼まれてもいないのに、勝手にソリューション(問題解決)しちゃいました。

ご利用は計画的に!
関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp

ezolab