VB のたまご

作成日: 2016/12/22, 更新日: 2016/12/22


なんちゃって仮想労働者を作る2

構成

  •  窓口担当bat に対して、請求書作成指示.xlsx を D&D すると、窓口担当 exe が受け取り、 担当者として作業者 exe に作業依頼をかけます。作業者 exe は指示書をもとに請求書を作成します。 作成した請求書のパスを受け取り、パスを報告します。

  • イメージ

登場人物

  •  役割分担が絡む関係で、再度以下に分類します。


  • 主な役割
    概念名 具体的な名称 説明
    人間 請求書作成指示.xlsx 指示書を、窓口batにD&Dする
    窓口bat バイト.bat 指示書をD&Dされたら、指示書と共に窓口exeに委託する
    窓口exe Manager1.exe 依頼内容を元に、作業担当者を判断して仕事を委託する
    作業者exe Worker1.exe 依頼された仕事をこなすメインな人
    ClosedXML.dll OpenXml よりも簡単操作で作成できるライブラリ
    DocumentFormat.OpenXml.dll Excel が未インストールでも作成できるライブラリ
    請求書テンプレート.xlsx 作業者の負担軽減のため、新規作成ではなく穴埋め方式で作成してもらうための資料
    成果物 請求書.xlsx 仮想労働者が作成した成果物

作業者exe

  •  ここでは、あらかじめ準備しておいた「請求書テンプレート.xlsx」をベースとして、渡された「請求書作成指示.xlsx」にあるデータを転記して、 「請求書.xlsx」を作成していきます。

  •  請求書作成指示.xlsx、請求書テンプレート.xlsx はだいたいこんな感じです。
  • イメージ

  •  それではソースです。コンソールアプリ形式で作成していて、NuGet から ClosedXML をインストールしています。 ClosedXML は内部的に DocumentFormat.OpenXml を参照しているので、2つ一緒じゃないと動作しないところに注意が必要です。

  • Imports System.IO
    Imports ClosedXML.Excel
    
    Module Module1
    
        Sub Main(args As String())
    
            If args.Length = 0 Then
                Exit Sub
            End If
    
            Dim orderFile = args(0)
            Dim templateFile = Path.GetFullPath("請求書テンプレート.xlsx")
            Dim outputFile = Path.GetFullPath("請求書.xlsx")
            DoWork(orderFile, templateFile, outputFile)
    
            Console.WriteLine(outputFile)
    
        End Sub
    
        Private Sub DoWork(orderFile As String, templateFile As String, outputFile As String)
    
            ' 指示書
            Dim orderBook = New XLWorkbook(orderFile)
            Dim orderSheet = orderBook.Worksheet("Sheet1")
    
            ' テンプレート請求書
            Dim outputBook = New XLWorkbook(templateFile)
            Dim outputSheet = outputBook.Worksheet("Sheet1")
    
            ' 品名テーブルの現在位置
            Dim index = 17
    
            ' A1, A2, ... と1始まり。1行目はヘッダー行のため2始まり
            For i = 2 To orderSheet.LastRowUsed().RowNumber()
    
                Dim key = orderSheet.Cell("A" + i.ToString()).Value.ToString()
                Dim value = orderSheet.Cell("B" + i.ToString()).Value.ToString()
    
                If key.Trim() = String.Empty Then
                    Exit For
                End If
    
                Select Case True
                    Case key = "請求日"
                        outputSheet.Cell("G2").Value = value
    
                    Case key = "請求先企業名"
                        outputSheet.Cell("A3").Value = value
    
                    Case key.StartsWith("品名")
                        Dim items = value.Split(","c)
                        outputSheet.Cell("B" + index.ToString()).Value = items(0)
                        outputSheet.Cell("D" + index.ToString()).Value = items(1)
                        outputSheet.Cell("E" + index.ToString()).Value = items(2)
                        index += 1
    
                End Select
    
            Next
    
            outputBook.SaveAs(outputFile)
    
        End Sub
    
    End Module
    

窓口exe

  •  続いて窓口担当です。こちらもコンソールアプリ形式で作成しています。窓口bat から渡された指示書を、作業者exeに渡しています。

  • Imports System.IO
    
    Module Module1
    
        Sub Main(args As String())
    
            If args.Length = 0 Then
                Exit Sub
            End If
    
            Dim orderFile = args(0)
            Select Case True
                Case Path.GetFileName(orderFile) = "請求書作成指示.xlsx"
    
                    Dim worker = Path.GetFullPath("Worker1.exe")
                    Dim psi = New ProcessStartInfo
                    psi.FileName = worker
                    psi.Arguments = orderFile
                    psi.CreateNoWindow = True
                    psi.UseShellExecute = False
                    psi.RedirectStandardOutput = True
    
                    Using p = Process.Start(psi)
    
                        Dim outputFile = p.StandardOutput.ReadToEnd()
                        outputFile = outputFile.Replace(vbNewLine, String.Empty)
    
                        p.WaitForExit()
                        p.Close()
    
                        Console.WriteLine("done.")
                        Console.WriteLine("generated file is here.")
                        Console.WriteLine(outputFile)
                        Console.WriteLine("thank you for using my work.")
    
                    End Using
    
                Case Else
                    Console.WriteLine("sorry, not support.")
                    Exit Sub
    
            End Select
    
        End Sub
    
    End Module
    

窓口bat

  •  最後に、窓口となるbatファイルです。D&Dで受け取ることを想定しており、受け取った後、窓口exeに委託しています。 今回は請求書作成指示.xlsx をD&Dで渡すようなルールにしています。

  • @echo off
    cd /d %~dp0
    
    Manager1.exe %1
    
    pause
    

動作確認

  •  実行すると、以下のようなコマンドプロンプト画面が表示された後、請求書.xlsx が生成されています。
  • done.
    generated file is here.
    C:\~\請求書.xlsx
    thank you for using my work.
    続行するには何かキーを押してください . . .
    

  •  生成された請求書
  • イメージ
  •  こんな感じです。ちゃんと指示データが反映されていますね。

まとめ

  •  今回の例だと、あまり相手の存在感が無く実感できませんがイメージが持てましたでしょうか? 前回の冒頭で述べたことが現実として実現できるかどうか、世の中に期待するか自分で作ってしまうか。

  •  なーんて、これ作る方が逆に大変ですよね。今回の例だと仮想知的労働者には程遠いですが、 簡単でもいいから自分を助けてくれる補助ツールとか作ってみると楽できるかもですよ。

  •  最後まで読んでいただき、ありがとうございました。