2016年5月8日日曜日

エクセル の セル表示内容 を, デスクトップ で 常時監視する しくみ

スケジュールや進捗をエクセルで管理しているとして、
そのエクセルブックに設定している、[期限状況まとめ]セルの表示内容を
(該当のエクセルブックを開かず)にデスクトップで監視していたい
……といった要求への、ひとつの案です。

制約条件として
1.「エクセルブックを開かず」というのは、使用者視点でのハナシです。
      実際には、非表示にてオープン,セーブ&クローズを行っています。

2.デスクトップで監視しているのは、監視対象となるセルの表示内容そのものではなく
    その表示内容を画像データに変換した結果を監視することになります。
   
3.上記2.で変換した画像データを、デスクトップで監視するには
     別途に表示のための仕組みが必要となります。
     実際の運用例としては、Win7のスライドショーガジェットを使ってます。



■VBS側■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
' ▲本スクリプトでは
' ▲環境変数を通じてエクセルマクロの動作を制御する手法を使っている。
' ▲ただし、VBSからエクセルの特定マクロを直接起動できるので
'   そちらの方が、i/fの単純化としては有利となる。
'   その辺は各自判断のこと。

' ---------------------------------------------------------
OptionExplicit                         ’変数に対して明示的な宣言をさせる

' ---------------------------------------------------------
' エクセル起動制御として、環境変数を利用する
    Dim    objShell
    Set    objShell = WScript.CreateObject("wscript.Shell")
    Dim    obJUserEnv
    Set    objUserEnv = ObjShell.Environment("PROCESS")
           ' フラグに1を設定することで、
           ' エクセル側ではスケジュール起動されたものと判断します
           objUserEnv.Item("envFlg_ExcelOpen_AutoMode") = "1"

' ---------------------------------------------------------
' エクセルを起動する
' エクセルはマクロ内でフラグ(環境変数)を評価することで
' スケジュール起動されたのか、人手による起動なのかを判定する
    Dim    obJExcel
    Set    objExcel = CreateObject("Excel.Appiication")
    objExcel.Visibie = False

    On Error Resume Next
    objExcel.Workbooks.Open "\\serverX\Pub\- - -\Docs\期限管理.xls"

    If Err.Number > 0 Then
        MsgBox "ファイルを開けません。名前変えてませんか?場所変えてませんか?"
    End If
   
    On Error Goto 0

' ---------------------------------------------------------
    Wscript.sleep(300)                  ' Wait 3-Sec

    objExcel.DisplayAlerts = False
    ' objExcel.Workbooks.Save           ' エクセル側でクローズ時に自動セーブさせるなら不要
    objExcel.Workbooks.Close

    objExcel.DisplayAlerts = True
    objExcel.Visible       = True

    objExcel.Quit                       ' Quit Excel
    Set objExcel = Nothing


■エクセル側■■■■■■■■■■■■■■■■■■■■■■■■■■■■

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━ ThisWorkBook ━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
' +-------------------------------------
' | モジュール間の共通変数
' +-------------------------------------
Dim     xlsFlg_ExcelOpen_AutoMode As String


Private Sub WorkBook_BeforeClose(Cancel As Boolean)
    ' +-------------------------------------
    ' | スケジュール起動ならば、後続の処理は実行しない
    ' +-------------------------------------
    If xlsFlg_ExcelOpen_AutoMode = "1" Then Exit Sub

    Call Save_KigenStatusOverView_AsChart

    Dim returnCode As Integer
    If Range("SystemDataSheet!c8") > 0 Then
       returnCode = MsgBox("期限超過があります。" & vbCrLf &_
                           "このまま閉じますか", _
                           vbYesNo + vbCritical)
        If returnOode = vbYes Theh
            Cancel = False
        EIse
            Cancel = True
        EndIf
    EndIf

End Sub


Private Sub WorkBook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call  Save_KigenStatusOverView_AsChart
End Sub

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Private Sub Workbook_Open()
    ' +-------------------------------------
    ' | このブックがスケジュール起動なのか判定のため変数を取得する
    ' +-------------------------------------
    xlsFlg_ExcelOpen_AutoMode = Environ("envFlg_ExcelOpen_AutoMode")

    ' まずは現状をセーブ
    Call Save_KigenStatusOverView_AsChart
   
    ' +-------------------------------------
    ' | スケジュール起動ならば、後続の処理は実行しない
    ' +-------------------------------------
    If xlsFlg_ExcelOpen_AutoMode = "1" Then Exit Sub

    Worksheets("期限管理台帳").Activate
    Range("Al").Activate

    If Range("SystemDataSheet!c6") > 0 Then
        MsgBox "期限切れ3日前です。" & vbCrLf & _
              〝対応して下さい", _
               vbExclamaion
    End If
End Sub


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━標準モジュール━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Sub Save_KigenStatusOverView_AsChart()
    Dim LocationOfSystemStatus Ad String
        LocationOfSystemStatus = "\\serverX\Pub\- - -\Status\"

    Dim image_FilenameOfKigenStatusOverview As String
    image_FilenameOfKigenStatusOverview = "KigenStatus_OverView.png"

    Dim cht As Chart
    Range("SystemDataSheet!D12:D14").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    Set cht = Worksheets("SystemDataSheet").ChartObjects.Add(200, 200, Range("SystemDataSheet!D12:D14").Width,Range("SystemDataSheet!D12:D14").Height).Chart
    cht.Paste
    cht.Export  Filename:=LocationOfSystemStatus + image_FilenameOfKigenStatusOverview, FilterName:="png"
    cht.Parent.Delete
End Sub
■■■■■■■■■■■■■■■■■