解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

VBScript から VBScript を同期実行して戻り値を取得する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


世の中には色々なプログラム言語がありますが、それぞれ得意なことが限定されたりします。
もちろん全くできない事は無いはずですが、プログラムが複雑になったり、プログラムを書く量がとても増えてしまったりと業務上の不都合が出て来る事もあります。

取っ掛かりとして VBScript から別の VBScript を実行して別の VBScript の戻り値を取得する Script を作成します。



関数

ソースコード
〜呼び出される VBScript ①〜


Sample2.vbs

msg = "これは Sample2.vbs です。"

MsgBox msg

WScript.Quit(101) ' 戻り値

ソースコード
〜呼び出される VBScript ②〜


Sample3.vbs

msg = "これは Sample3.vbs です。"

MsgBox msg

WScript.Quit(102) ' 戻り値

ソースコード
〜呼び出す VBScript


Sample1.vbs

Set objWsh = WScript.CreateObject("WScript.Shell")
 
' Sample2.vbs を実行
ret2 = objWsh.Run("Sample2.vbs", , True)
 
' Sample3.vbs を実行
ret3 = objWsh.Run("Sample3.vbs", , True)

msg1 = "これは Sample1.vbs です。"
msg1 = msg1 & vbcrlf & _
   "ret2 = " & ret2 & vbcrlf & _
   "ret3 = " & ret3

MsgBox msg1

Set objWsh = Nothing

使い方

まず、上でソースコードを紹介した下の(1)〜(3)の VBScript を同じフォルダ内に作成します。

(1)呼び出される VBScript
(2)呼び出される VBScript
(3)呼び出す VBScript

図1 Script


呼び出される VBScript ①(Sample2.vbs)を単体で実行すると図2 のメッセージが表示されます。
図2 メッセージ


呼び出される VBScript ②(Sample3.vbs)を単体で実行すると図3 のメッセージが表示されます。
図3 メッセージ


呼び出す VBScript (Sample1.vbs)を実行すると図4 〜図6 のメッセージが順に表示されます。
図4 メッセージ


図5 メッセージ


図6 メッセージ



コメント

どんなプログラム言語であれ、外部のプログラムを実行する方法があるはずなので、 VBScript では簡単でしたが、他のプログラム言語でもやってみたい。



以上

C# でドラッグ&ドロップしたファイルのパスワード付き zip ファイルを作る



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


前の記事で、ファイルをドロップしたら zip ファイルが作成される VBScript を作成したのですが、パスワードをかけられませんでした。

私が特殊なのかもしれませんが、 zip ファイルってメールに添付する時にしか使って無いんですよね。

だから、ここまでする必要あるのかっていう意見もあるかもしれませんが、 C# でファイルをドロップしたらパスワード付きの zip ファイルが作成されるプログラムを作ります。



下準備

開発環境

Visual Studio 2017 Community

プログラム言語

C#

DLL

DotNetZip

プログラムが出来上がるまで

.NET Framework 4.5 以降から ZipFile クラスという zip ファイルを扱うクラスが追加されています。

それで、よく調べもせず、とりあえずパスワード無しの zip ファイル作成プログラム作ったのですが、いざ、パスワードを付けようと調べたら ZipFile クラスからはパスワードを設定できる様な仕様は見つかりませんでした。

パスワードが設定出来る zip ファイルの事を調べていたら、 DotNetZip という DLL がある事が分かりました。

結局、 C#DotNetZip を使ってプログラムを作成しました。

DotNetZip のダウンロードと使い方

まずは検索します。図1 の通りに検索しました。
図 1 検索するところ


検索結果は図2 の通りです。1番上のWebページを開きます。
図 2 検索したところ


図3 の画面が表示されたら、『Tools』をクリックします。
図 3 検索結果のトップを開いたところ


『Tools』の中の『Ionic.Zip.dll』をクリックします。
図 4 Tools を開いたところ


図5 の画面右下の『Download』をクリックしてダウンロードします。
図 5 ダウンロード画面


ダウンロードした『Ionic.Zip.dll』のアイコン画像です。
図 6 dll アイコン


visual studio で参照設定を行った画面です。
図 7 Visual Studio 2017 Community の参照設定


ILMerge のダウンロードと使い方

図8 の『Download』ボタンをクリックします。
図 8 ILMerge のダウンロードページ


図8 の『Download』ボタンをクリックすると、図9 のページに遷移します。
図 9 ILMerge のダウンロード


ダウンロードした ILMerge のアイコン画像です。
図 10 ILMerge のアイコン


コマンドプロンプトを起動した画面です。
図 11 コマンドプロンプト


exe ファイルと dll ファイルを 1 つにまとめた exe ファイルの出力フォルダに移動します。
図 12 出力フォルダへ移動

図 13 出力フォルダへ移動


ILMerge.exe を指定します。
図 14 ILMerge.exe の指定


結合する exe ファイルを指定します。
図 15 結合する exe の指定


結合する dll ファイルを指定します。
図 16 結合する dll の指定


結合した後の exe ファイルの名前を指定します。
図 17 exe ファイルの名前


プラットフォームを指定します。
図 18 プラットフォームの指定



関数

ソースコード


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Ionic.Zip;
using Ionic.Zlib;
 
 
namespace DotNetZip
{
    class Program
    {
        static void Main(string[] args)
        {
            // 自分のパスを取得する
            string selfPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
 
            // 日付をパスに使用できるように / を - に置換する
            // 時間をパスで使用できるように : を - に置換する
            DateTime dtDateTime = DateTime.Now;                // 現在の日時を取得
            string strDateTime = dtDateTime.ToString();        // 文字列に変換する
            string[] arrDateTime = strDateTime.Split(' ');     //スペースで分割し、配列に格納する
            arrDateTime[0] = arrDateTime[0].Replace("/", "-"); // 日付置換
            arrDateTime[1] = arrDateTime[1].Replace(":", "-"); // 時間置換
 
            // Zip ファイルのパスの作成
            string zipPath = selfPath + arrDateTime[0] + "_" + arrDateTime[1] + ".zip";
 
            // パスワード作成
            int digits_num = 23;
            char[] chPass;
            chPass = PasswordRandomASCII(digits_num);
            string pass = string.Join("", chPass);
 
            // パスワード出力ファイルのパス作成
            string passPath = selfPath + arrDateTime[0] + "_" + arrDateTime[1] + ".pass";
 
            // ファイルドロップ以外の実行を拒絶する
            if (args.Length == 0)
            {
                return;
            }
 
            try
            {
                // Zip ファイルの作成
                using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
                {
                    // パスワードをかける
                    zip.Password = pass;
 
                    // ファイルの追加
                    for (int i = 0; i < args.Length; i++)
                    {
                        zip.AddFile(args[i], "");
                    }
 
                    // Zip ファイルを保存
                    zip.Save(zipPath);
                }
 
                // パスワードのファイル出力
                File.WriteAllText(passPath, pass);
            }
            catch
            {
                Console.WriteLine("Zip ファイルは作成できませんでした。");
                Console.ReadKey();
            }
        }
 
        // パスワード作成関数
        // アルファベットの A ~ z に対応するアスキーコードの 65 ~ 122
        // を返す関数
        static char[] PasswordRandomASCII(int digits_num)
        {
            // パスワード格納用配列
            char[] code = new char[digits_num];
 
            // 乱数発生関数の作成
            Random rnd = new Random();
 
            // 乱数作成
            for (int i = 0; i < digits_num; i++)
            {
                // 乱数発生させて、アスキーコードを文字変換して代入する
                // 乱数は 65 以上 123 未満
                code[i] = (char)rnd.Next(65, 123);
            }
           
            // 戻り値
            return code;
        }
    }
}

使い方

exe ファイルを好きなところに置いてファイルをドロップすれば zip ファイルが出来上がります。
なお、 zip ファイルは exe ファイルと同じディレクトリに出来上がります。



コメント

まぁ、使用頻度はあまり多くはありませんが、 C# の良い練習になりました。



以上

ドラッグ&ドロップしたファイルを zip ファイルにする VBScript



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


フリーソフトで zip ファイルを作っていたのですが、ソフト開いて、ファイル選択して、実行ボタンを押す…という作業が煩わしかったので、ファイルをドロップしたら zip ファイルが作成される VBScript を作成します。



関数

ソースコード


'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
   WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
                "ファイルをドロップしてください。"
   WScript.Quit
End If
 
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
 
'-------------------------------------------------------------------------------------------------------
' ドロップされた引数がファイル以外ならアラートして終了する
For each args In WScript.Arguments
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダかファイルかを判定する
   If objFileSys.FolderExists(args) then
      '-------------------------------------------------------------------------------------------------
      ' is folder.
      ' ファイルシステムオブジェクトの破棄
      Set objFileSys = Nothing
      WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   ElseIf objFileSys.FileExists(args) then
      '-------------------------------------------------------------------------------------------------
      ' is file.
   Else
      '-------------------------------------------------------------------------------------------------
      ' is unknown.
      ' ファイルシステムオブジェクトの破棄
      Set objFileSys = Nothing
      WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
                  "処理を終了します。"
      WScript.Quit
   End If
  
Next
 
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
 
'-------------------------------------------------------------------------------------------------------
' Zip ファイルを作成するパスの作成
ZipFile = SelfPath()
ZipFile = ZipFile & "\" & Date2PathFormat() & "_" & Time2PathFormat() & ".zip"
 
'-------------------------------------------------------------------------------------------------------
' Zip ファイルのヘッダーの作成
ZipFileInput = ZipFileHeader()
 
'-------------------------------------------------------------------------------------------------------
' 空の Zip ファイルの作成
Call NewZipFile(ZipFile, ZipFileInput)
 
'-------------------------------------------------------------------------------------------------------
' シェルオブジェクト作成
Set objWsh = WScript.CreateObject("Shell.Application")
 
'-------------------------------------------------------------------------------------------------------
' Zip ファイルの作成
For each args In WScript.Arguments
  
   ' Zip ファイルオブジェクトの作成
   Set objFile = objWsh.NameSpace(ZipFile)
  
   ' Zip ファイルの中身のファイル数のカウント
   ZipItemCnt = objFile.Items().Count
  
   ' Zip ファイルの中身を追加
   objFile.CopyHere(args)
  
   ' 追加の完了を待つ
   Do While ZipItemCnt = objFile.Items().Count
      WScript.Sleep(250)
   Loop
  
   ' Zip ファイルの中身のファイル数の更新
   ZipItemCnt = ZipItemCnt + 1
  
Next
 
'-------------------------------------------------------------------------------------------------------
' シェルオブジェクトの破棄
Set objWsh = Nothing
 
Function SelfPath()
  
   ' ファイルシステムオブジェクト作成
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
  
   ' 自分のパスの取得
   SelfPath = objFileSys.getParentFolderName(WScript.ScriptFullName)
  
   ' ファイルシステムオブジェクトの破棄
   Set objFileSys = Nothing
  
End Function
 
Function Date2PathFormat()
  
   ' 日付をパスに使用できるように / を - に置換する
   Date2PathFormat = Replace(Date, "/", "-")
  
End Function
 
Function Time2PathFormat()
  
   ' 時間をパスに使用できるように : を - に置換する
   Time2PathFormat = Replace(Time, ":", "-")
  
End Function
 
Function ZipFileHeader()
  
   ' zip ファイルのヘッダ情報
   Header = Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
  
   ' 変換コード格納変数の準備
   buf = ""
  
   ' ヘッダーのコード変換
   For i = LBound(Header) To UBound(Header)
      buf = buf & Chr(Header(i))
   Next
  
   ' 戻り値
   ZipFileHeader = buf
  
End Function
 
Sub NewZipFile(FilePath, InputString)
  
   ' ファイルシステムオブジェクト作成
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
  
   ' ファイルの作成
   Set objFile = objFileSys.CreateTextFile(FilePath, True)
  
   ' ファイルへ出力
   objFile.Write(InputString)
  
   ' ファイルを閉じる
   objFile.Close
  
   ' ファイルオブジェクトの破棄
   Set objFile = Nothing
  
   ' ファイルシステムオブジェクトの破棄
   Set objFileSys = Nothing
  
End Sub

使い方

上のソースコードをメモ帳にコピペして、拡張子を『.vbs』にして、すべてのファイルとして保存すれば、ドロップしたファイルの zip ファイルが出来上がります。
なお、 zip ファイルは VBScript と同じディレクトリに出来上がります。



コメント

VBScript では zip ファイルにパスワードがかけられないみたいなので、残念ですが C++ か何かで書き直そうかと思います。



以上

ドラッグ&ドロップしたファイルを印刷する VBScript に画像印刷機能を追加した




こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。




この記事の目次




目的


前に書いた記事で、ドラッグ&ドロップしたファイルを印刷する VBScript を書きました。
ですが、そのプログラムでは画像ファイルを印刷する事が出来ませんでした。

そこで、画像ファイルも印刷出来る様に改良しました。

ただ、印刷の出来上がりは微妙です。
印刷位置の水平、鉛直などの設定をしていないため、左上に寄った画像が印刷されます。




関数

ソースコード


'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
   WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
                "ファイルをドロップしてください。"
   WScript.Quit
End If
 
'-------------------------------------------------------------------------------------------------------
' フォルダ内ファイルリスト出力
for each args In WScript.Arguments
  
   '----------------------------------------------------------------------------------------------------
   ' ファイルシステムオブジェクト作成
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダかファイルかを判定する
   If objFileSys.FolderExists(args) then
      ' is folder.
      WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   ElseIf objFileSys.FileExists(args) then
      ' is file.
   else
      ' is unknown.
      WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   End If
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダか画像かを判定する
   Flag_Image = False
   pos = InstrRev(args, ".")
   argsExtension = Mid(args, pos)
   Flag_Image = ImageDetermination(argsExtension)
  
   ' ドロップされたファイルが画像以外なら
   If Flag_Image = False Then
     
      '-------------------------------------------------------------------------------------------------
      ' シェルオブジェクト作成
      Set objWsh = WScript.CreateObject("Shell.Application")
     
      '-------------------------------------------------------------------------------------------------
      ' 引数ファイルのパスの分解
      pos = InstrRev(args, "\")
      Dir_Name = Left(args, pos - 1)
      file_Name = Mid(args, pos + 1)
     
      '-------------------------------------------------------------------------------------------------
      ' フォルダオブジェクト と ファイルオブジェクトの作成
      Set objFolder = objWsh.NameSpace(Dir_Name)
      Set objFile = objFolder.ParseName(file_Name)
      'Msgbox objFolder.Title & vbnewline & objFile.Name
     
      '-------------------------------------------------------------------------------------------------
      ' 印刷する
      objFile.InvokeVerbEx("Print")
     
      '-------------------------------------------------------------------------------------------------
      ' シェルオブジェクトの破棄
      Set objWsh = Nothing
     
   ' ドロップされたファイルが画像なら
   Else
     
      '-------------------------------------------------------------------------------------------------
      ' 印刷する
      Set objWsh = CreateObject("WScript.Shell")
      objWsh.Run "mspaint.exe " & args & " /p"
      Set objWsh = Nothing
     
   End If
  
Next
 
Function ImageDetermination(argsExtension)
  
   ' 画像ファイルの拡張子を記憶
   ImageExtension = Array(".jpg", ".jpeg", ".JPG", ".JPEG", ".jpe", ".jfif", ".pjpeg", ".pjp", _
                          ".png", _
                          ".gif", _
                          ".svg", ".svgz", _
                          ".bmp", ".dib")
  
   ' 画像判定ループ
   For i = LBound(ImageExtension) To UBound(ImageExtension)
     
      ' 画像ファイルの拡張子と同一の拡張子であれば
      If ImageExtension(i) = argsExtension Then
        
         ' 画像ファイルであると判断する
         ImageDetermination = True
        
         ' 関数を終了する
         Exit Function
        
      ' 画像ファイルの拡張子と不一致の拡張子であれば
      Else
        
         ' 画像ファイル以外と判断する
         ImageDetermination = False
        
      End If
     
   Next
  
End Function

使い方

上のソースコードをメモ帳にコピペして、拡張子を『.vbs』にして、すべてのファイルとして保存すれば、ドロップしたファイルを印刷するプログラムが出来ます。
この VBScript は画像も一応印刷出来ます。

画像が新たに印刷出来る様になったので、下に整理しておきます。

印刷出来るファイル

テキストファイル(.txt)
PDF ファイル(.pdf)
Microsoft Excel ファイル(.xls, .xlsx)
Microsoft PowerPoint ファイル(.ppt, .pptx)
Microsoft Word ファイル(.doc, .docx)
メールファイル(.msg)
バッチファイル(.bat)
VBScript ファイル(.vbs)
画像ファイル(.png, .jpg, .bmp)

印刷出来ないファイル

dat ファイル(.dat)
CSV ファイル(.csv)
 




コメント

印刷の設定が出来る様に改良していきたい。




以上

ドラッグ&ドロップしたファイルを印刷する VBScript




こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。




この記事の目次




目的


ファイルをドロップすると通常使用するプリンタで印刷する VBScript プログラムを作成します。

印刷部数が足りなくて、急な印刷が必要だったり、ファイルを開かずに印刷出来るため、 PDF ファイルなど、あまり編集を必要としないファイルの効率的な印刷に便利です。




関数

ソースコード


'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
   WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
                "ファイルをドロップしてください。"
   WScript.Quit
End If
 
'-------------------------------------------------------------------------------------------------------
' フォルダ内ファイルリスト出力
for each args In WScript.Arguments
  
   '----------------------------------------------------------------------------------------------------
   ' ファイルシステムオブジェクト作成
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダかファイルかを判定する
   If objFileSys.FolderExists(args) then
      ' is folder.
      WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   ElseIf objFileSys.FileExists(args) then
      ' is file.
   else
      ' is unknown.
      WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   End If
  
   '----------------------------------------------------------------------------------------------------
   ' シェルオブジェクト作成
   Set objWsh = WScript.CreateObject("Shell.Application")
  
   '----------------------------------------------------------------------------------------------------
   ' 引数ファイルのパスの分解
   pos = InstrRev(args, "\")
   Dir_Name = Left(args, pos - 1)
   file_Name = Mid(args, pos + 1)
  
   '----------------------------------------------------------------------------------------------------
   ' フォルダオブジェクト と ファイルオブジェクトの作成
   Set objFolder = objWsh.NameSpace(Dir_Name)
   Set objFile = objFolder.ParseName(file_Name)
   'Msgbox objFolder.Title & vbnewline & objFile.Name
  
   '----------------------------------------------------------------------------------------------------
   ' 印刷する
   objFile.InvokeVerbEx("Print")
  
   '----------------------------------------------------------------------------------------------------
   ' シェルオブジェクトの破棄
   Set objWsh = Nothing
  
Next

使い方

上のソースコードをメモ帳にコピペして、拡張子を『.vbs』にして、すべてのファイルとして保存すれば、ドロップしたファイルを印刷するプログラムが出来ます。

色々なファイルをドロップしてみたところ、印刷出来ないファイルもありました。

下に整理しておきます。

印刷出来るファイル

テキストファイル(.txt)
PDF ファイル(.pdf)
Microsoft Excel ファイル(.xls, .xlsx)
Microsoft PowerPoint ファイル(.ppt, .pptx)
Microsoft Word ファイル(.doc, .docx)
メールファイル(.msg)
バッチファイル(.bat)
VBScript ファイル(.vbs)

印刷出来ないファイル

dat ファイル(.dat)
CSV ファイル(.csv)
画像ファイル(.png, .jpg)  




コメント

画像ファイルが印刷出来ると使用する機会が増えそうな気がするので、改良していきたい。




以上

VBScript でフォルダ内ファイル一覧のファイル出力


こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。




この記事の目次




目的


フォルダをドラッグ & ドロップすると、フォルダ内のファイルリストを CSV ファイルに出力する VBScript プログラムを作成します。




関数

ソースコード


'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
   WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
                "フォルダをドロップしてください。"
   WScript.Quit
end If
 
'-------------------------------------------------------------------------------------------------------
' ファイル入出力用の変数
ForReading = 1
ForWriting = 2
ForAppending = 3
 
'-------------------------------------------------------------------------------------------------------
' フォルダ内ファイルリスト出力
for each args In WScript.Arguments
  
   '----------------------------------------------------------------------------------------------------
   ' ファイルシステムオブジェクト作成
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダかファイルかを判定する
   If objFileSys.FolderExists(args) then
      ' is folder.
   ElseIf objFileSys.FileExists(args) then
      ' is file.
      WScript.Echo "ファイルがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   else
      ' is unknown.
      WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   End If
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされたフォルダのオブジェクト取得
   Set objFolder = objFileSys.GetFolder(args)
  
   '----------------------------------------------------------------------------------------------------
   ' ファイルが見つからなかった場合、プログラムを終了する
   If objFolder.Files.Count = 0 then
      WScript.Echo "ファイルは見つかりませんでした。"
      WScript.Quit
   End If
  
   '----------------------------------------------------------------------------------------------------
   ' 出力ファイルパスの作成
   pos = InstrRev(args, "\")
   InputFolderName = Mid(args, pos + 1)
   PathOutput = Left(args, pos) & "\" & InputFolderName & "-FileList" & ".csv"
  
   '----------------------------------------------------------------------------------------------------
   ' テキストファイルを開く
   Set fileWriter = objFileSys.OpenTextFile(PathOutput, ForWriting, True)
  
   '----------------------------------------------------------------------------------------------------
   ' 出力
   for each f In objFolder.Files
      fileWriter.WriteLine f.Name
   next
  
   '----------------------------------------------------------------------------------------------------
   ' テキストを閉じる
   fileWriter.Close
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされたフォルダのオブジェクトの破棄
   Set objFolder = Nothing
  
   '----------------------------------------------------------------------------------------------------
   ' ファイルシステムオブジェクトの破棄
   Set objFileSys = Nothing
  
   '----------------------------------------------------------------------------------------------------
   ' 作成したファイルリストを開く
   Set objWsh = WScript.CreateObject("WScript.Shell")
   objWsh.Run PathOutput
   Set objWsh = Nothing
  
next

使い方

上のソースコードをメモ帳にコピペして、拡張子を『.vbs』にして、すべてのファイルとして保存すれば、ドロップしたフォルダの中のファイルを CSV のリストに出力するプログラムが出来ます。

CSV のファイルリストはドロップしたフォルダと同じ場所に作成されます。

デスクトップに置いておくと意外と便利です。




コメント

この記事では CSV ファイルを作成していますが、テキストファイル、 Microsoft Word ファイル、 Microsoft Excel ファイルなどに出力するといろいろな使い道がありそうです。




以上

VBA で効率的にメール処理




こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。




この記事の目次




目的


メールの処理が苦痛です。(正確には苦痛でした。)
前の職場では1日に250通くらいのメールを受信していました。
今は1日に10通も受信しない日があるくらいで、逆にメールを確認しなさ過ぎてうっかり頼まれごとを忘れる(というか気づいていない)事も有ったり…

動作単位でボタンを作成して、わずらわしい操作を無くしていきたいと思います。
メール転送とフォルダ移動のボタン作成します。




メール処理の自動化のカタチ

メール処理の自動化を最初に考えた時は、色々考えました。

タスクになりそうなものを自動抽出…
スレッド機能から自然言語処理

しかし、難しいばかりか、プログラム実行後の後処理として今までなかった操作の発生など、どうしても複雑化していってしまい、どれも成功とは言えませんでした。

そこで、ボタンが増えるというのを我慢して、あえてボタン1つの動作を小さい範囲の動作として、どのボタンをクリックするかは判断する方向のカスタマイズを行い、少なからず、完全自動化を目指した時よりは成功に近づいたと思っています。
一例としてメール転送とフォルダ移動のボタン作成とソースコードを載せます。

まず、図1のVBE画面からソースコードを書いていきます。

図1 VBE 画面


メール転送

私のメーラーMicrosoft Outlook です。
メール転送は『Ctrl + F』のショートカットキーが割り当てられています。
しかし、メール転送で1番メンドウと感じている操作は E-Mail Address の入力欄をマウスでクリックする事と E-Mail Address の入力だと思っています。

ソースコード
〜メール転送〜

このソースコードはグループメンバーに展開する必要のあるメールを見つけた時に、ボタン1つで転送することを想定したプログラムです。

GrMemberという変数でE-Mail Addressを指定しています。
ここは書き換えて使ってください。

転送本文という変数でメール本文を指定しています。
だいぶ素っ気ないので、ここも書き換えて使ってください。

『.Send』のところはPCの設定上、Microsoft Outlook から警告ダイアログが表示されると思いますが、 VBA セキュリティの設定を変更すると警告無く動作するかと思います。

ですが、セキュリティ設定変更は推奨しないので、コメントアウトして、転送メールが表示された後、『Alt + S』で送信することをオススメ致します。


Public Const GrMember = "**********@****.co.jp; **********@****.co.jp; **********@****.co.jp; **********@****.co.jp"
Public Const 転送本文 = "各位" & vbNewLine & vbNewLine & "転送します。確認ください。"
 
Sub メール転送()
    
    ' 選択アイテム数の取得
    選択アイテム数 = Application.ActiveExplorer.Selection.Count
   
    ' 選択アイテムの処理
    For i = 1 To 選択アイテム数
       
        ' アイテムの取得
        Set olItem = Application.ActiveExplorer.Selection.Item(i)
       
        ' アイテム種類の取得
        アイテム種類 = TypeName(olItem)
       
        ' アイテム種類がメールなら
        If アイテム種類 = "MailItem" Then
           
            Set Fw = olItem.Forward
               
            With Fw
               
                .Display
                .To = GrMember
                .Body = 転送本文 & vbNewLine & .Body
                .Send
               
            End With
           
        End If
       
    Next i
   
End Sub

フォルダ移動

Microsoft Outlook でメールをフォルダ移動する時は、移動させたいメールを選択して、移動先のフォルダにドラッグ & ドロップするとメールのフォルダ移動が出来ます。
私はこの操作が嫌いです。
ドラッグ距離が長く、たまに全然違うフォルダに移動させてしまうからです。

ソースコード
〜フォルダ移動〜

このソースコード②はソースコード①で書いたプログラムで転送した後に実行することを想定しています。

フォルダ移動はメンドウですが、フォルダ1つに対して1プログラムとしてます。

以下の2つを変更すれば移動させるフォルダを変更できます。
"作成日:2017-10-02" (データファイル名)
"周知事項" (データファイル内、フォルダ名)


Sub 周知事項フォルダへ移動()
   
    ' 選択アイテム数の取得
    選択アイテム数 = Application.ActiveExplorer.Selection.Count
   
    ' 選択アイテムの処理
    For i = 1 To 選択アイテム数
       
        ' アイテムの取得
        Set olItem = Application.ActiveExplorer.Selection.Item(i)
       
        ' アイテム種類の取得
        アイテム種類 = TypeName(olItem)
       
        ' アイテム種類がメールなら
        If アイテム種類 = "MailItem" Then
           
            Set 移動先フォルダ = Application.Session.Folders("作成日:2017-10-02").Folders("周知事項")
            olItem.Move 移動先フォルダ
           
        End If
       
    Next i
   
End Sub

ボタンの作成

Microsoft Outlook ではツールバーをユーザーが作成出来ます。

作り方を順番に説明します。

①まずは言わずと知れた Microsoft Outlook の画面です。


②メニューバーの空いているところで右クリックします。


③右クリックで開いたプルダウンメニューの『ユーザー設定』をクリックします。


④ユーザー設定ダイアログが表示されたら『新規作成』ボタンをクリックします。


ツールバーの名前を入力して、『OK』ボタンをクリックします。


⑥ユーザー設定ダイアログに戻ったら、ユーザー設定ダイアログの『コマンド』タブをクリックし、ダイアログ左側にある『分類』という列の『マクロ』をクリックします。


⑦作成したマクロが表示されます。


⑧表示されているマクロをツールバーにドラッグ&ドロップします。


⑨このままだとツールバーを見失ってりするので、画面上にドッキングします。


⑩あとは⑧の作業をツールバーに登録したいプログラムの数だけ繰り返してツールバー作成完了です。




コメント

日常のメール処理を振り返って、ボタンを増やしていけば、後は反射神経勝負になります。
リズムよくボタンを押して、メールを片付けていきましょう。




以上