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