none
特定のExcelファイルを開いたときメッセージボックスを出すようにしたい RRS feed

  • 質問

  • はじめまして。よろしくお願いします。

    仕事でExcelファイルに描かれた伝票を印刷する機会があるのですが、毎月25日以降は日付を来月の1日付けにするルールがあり、よく忘れてしまいます。そこで、25日以降に伝票ファイルを開いたとき、注意喚起のメッセージボックスを開くようにしたいです。本来はExcel側で日付を自動修正したりメッセージボックスを開くようにすべきでしょうが、チームで共有する伝票ファイルは勝手に変更することはできません。PowerShellで伝票ファイルが起動されたかを監視し、メッセージボックスを開くようなプログラムを考えていますが、伝票ファイルが起動されたことを検出する方法が分かりません。どなたか教えていただけないでしょうか?

    2019年1月31日 12:08

すべての返信

  • 伝票ファイルってエクセルなんですよね。

    それならPowershellで伝票ファイルが起動された監視するよりも

    Powershellから伝票ファイルを起動する様にしたらいかがでしょうか。

    まぁその程度ならカレンダー等入れる程度で良いような気もしますが。。。

    2019年2月1日 3:14
  • こんな?

    #以前に同じ名前でイベント監視を登録している場合は削除
    Get-EventSubscriber | Where-Object -Property "SourceIdentifier" -EQ "watch_excelfile" | ForEach-Object {Unregister-Event  -SourceIdentifier $_.SourceIdentifier}
    
    Add-Type -AssemblyName System.Windows.Forms
    
    #監視したいエクセルファイルのパス
    $targetExcelFile = "C:\Test\ワークシート.xlsx"
    #エクセルのファイルのあるフォルダ
    $folder = [System.IO.Path]::GetDirectoryName($targetExcelFile)
    #エクセルの作る一時ファイル名
    $fileName= "~$" + [System.IO.Path]::GetFileName($targetExcelFile)
    #エクセルの作る一時ファイルのフルパス
    $temporary = [System.IO.Path]::Combine($folder , $fileName)
    
    #フォルダ内監視用クラス
    $watcher= new-object System.IO.FileSystemWatcher $folder
    
    #フォルダ内のファイル変更を監視するイベントに名前を付けて登録する(
    Register-ObjectEvent -SourceIdentifier watch_excelfile -InputObject $watcher -EventName "Changed" -Action {
        param([System.Object] $sender,[System.IO.FileSystemEventArgs] $e)
        #Write-Host $e.FullPath
        #Write-Host $temporary
        #フォルダの中でファイル変更が発生して、そのファイル名がエクセルで開いた時に作られる一時ファイル名である場合
        if( $e.FullPath -eq $temporary)
        {    
            #メッセージボックスを表示
            [System.Windows.Forms.MessageBox]::Show($e.FullPath ,"監視")
        }
    }
    
    #監視開始
    $watcher.EnableRaisingEvents = $true


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2019年2月1日 3:56
  • 皆様ありがとうございます。

    なるほどPowershellから伝票ファイルを起動するやり方もありますね。今回はこれでもできますが、監視したいファイルが複数ある場合、それぞれに対してPowershellを用意する必要があるため煩雑になります。一つの監視ファイルを作ってAが起動されたらこうする、Bが起動されたらこうすると書いたほうが便利だと思います。

    今、gekkaさんのサンプルコードをいじくっています。「監視したいエクセルファイルのパス」だけ自分用のに書き変えても、「Where-Object : パラメーター名 'Property' に一致するパラメーターが見つかりません。」とエラーが出てしまいました。おそらくここも自分用に書き換える必要があると思いますが、Powershellはまだあまり詳しくなく現在奮闘中です。

    2019年2月1日 14:13
  • もしかするとPowerShell 2.0環境ではないですか?

    その場合、

    Get-EventSubscriber | Where-Object -Property "SourceIdentifier" -EQ "watch_excelfile" | ForEach-Object {Unregister-Event  -SourceIdentifier $_.SourceIdentifier}

    Get-EventSubscriber | Where-Object {$_.SourceIdentifier -eq "watch_excelfile"} | ForEach-Object {Unregister-Event  -SourceIdentifier $_.SourceIdentifier}

    と修正すると動くかもしれません。

    2019年2月19日 7:47
    モデレータ