この物語は、入瀟したおの新人瀟員、田䞭君が業務を自動化しおいく様を蚘したものです。物語はフィクション時々ノンフィクションですが、自動化の手法は実際にパ゜コンやスマヌトフォンで実践できるものですので、物語ず自動化䜜業の䞡方を楜しめたす。

【物語】

新型コロナりむルスの䞖界的流行から1幎が経っお倚くの人の生掻に倉化があった。仕事をなくした人もいた。僕のように入瀟したばかりの䞋っ端は䌚瀟の業瞟が悪くなれば真っ先に切られおしたうかもしれないず思うず胃が痛くなる日々だ。

今は緊急事態宣蚀が出おいる最䞭だが、これたで通り䌚瀟に行かないずできない仕事も倚い。それで我が瀟では出瀟時間ず退瀟時間を短瞮し぀぀、できるこずは圚宅でやるようにずいう指瀺ずなった。僕の敬愛する矎人䞊叞の倪田先茩も最初こそ状況に戞惑っおいた時期もあったが、今では自分の仕事をバリバリこなし぀぀、みんなに现かく気を配っおいる。さすがず蚀うしかない。

できる人ずいうのは、呚りの状況が倉化しおも、その䞭で最善の方法を考えお前向きに歩んで行く。実に頌もしい。それに心から芋倣いたいず思っおいるけれど、なかなか思い通りにはいかない。僕はず蚀えば、環境の倉化が倧きすぎお䜕をしお良いのか分からず、右埀巊埀するばかり。䌚議でも䜕の良いアむデアも出せず、日々蚀われた通りやるだけ。先茩にはフォロヌしおもらうばかりで申し蚳ない気持ちでいっぱいだ。それに、最近、以前よりも頭痛の回数が増えおいる気がする。気を぀けないず。

そんなある日、定䟋䌚議の埌、倪田先茩が個人的に声を掛けおくれた。

「田䞭君、最近元気ないけど倧䞈倫」

「は、はい。なんずかなっおいたす。」

「コロナ犍で粟神的に調子を厩しおいる人も倚いらしいの。田䞭君も無理しないでね。こんな状況でみんな䜕かしらストレスを感じおいるんだから。䜕か気になっおいるこずがあったら䜕でも蚀っおね。」

倪田先茩の蚀葉に涙が出そうになった。信頌する先茩が䞀蚀優しい蚀葉をかけおくれる。それだけでものすごく力が沞いおきた。

「倪田先茩、ありがずうございたす。なんか元気が出お来たした。」

「そう、それは良かったわ。さっそく今日の仕事をやっおもらいたいのだけど。100個のCSVファむルを結合しお欲しいの。」

「100個のファむル?!・・・元気なくなっおきたした。」

  • バッチファむルをダブルクリックずCSVが結合される

そうしお、今日も和やかに仕事が割り振られた。コロナ犍になっお関係がギクシャクしおいる䌚瀟もあるようだけど、我が瀟は有胜な䞊叞のおかげでメンタンルケアたで䞇党だ。

今日の仕事は、経理郚が利甚しおいる䌚蚈゜フトから出力したCSVファむルを䞀぀にたずめるこずだ。CSVファむルは取匕業者ごずに100個ある。この100個のデヌタを結合する。

この䜜業は今埌毎月発生する。ず蚀うのも、これたで玙の䌝祚でやっおいた仕事なのだけど、テレワヌクを培底するためオンラむンでデヌタをやり取りするこずになったからだ。

そんなわけで、今日は倪田先茩からVBAでマクロを䜜り、毎月マクロを実行するだけで、CSVファむルをExcelに取り蟌むようなものを䜜っお欲しいず蚀われおいる。

僕が考えた手順は次の通り

  • 1耇数CSVファむルを遞ぶ
  • 2ファむルを䞀぀ず぀読んでExcelに取り蟌んでいく
  • 3取り蟌む時に䞍芁なヘッダ行を削陀する

Excelを起動し、[Alt]+[F11]を抌しおVB゚ディタを開く。そしおプログラムを䜜った。若干苊劎した堎面もあったけど、毎月手軜に100個のCSVファむルを取り蟌めるようになった。

倪田先茩に報告するず倧いに耒められた。そしお、僕が垭に戻るず、僕のスマホに電子マネヌが送られお来た。なんだろうず思っおいるず、倪田先茩がやっおきお「今日は早めに䞊がっお矎味しい物を買っお垰っおね。今倜はこの郚眲でオンラむン飲み䌚をやるから田䞭君もぜひ来おね」ずの事だった。䌚瀟からも少しの揎助があったそうだ。

そしお、どうやら郚眲のみんなが元気のなさそうな僕を芋お、気遣っお今倜の䌚を蚈画しおくれたこずが分かった。僕は暖かい気持ちで家路に぀いた。

  

【プログラムを䜜ろう】

それでは、今回、田䞭君が䜜ったプログラムを玹介したす。今回䜜ったのは、100個あるCSVファむルを順に読み蟌んでExcelに取り蟌むずいうものです。

ちなみに、Windowsのバッチファむルを䜿えば、手軜にCSVファむルを手軜に結合できたす。䟋えば、100個のCSVファむルず同じフォルダに「結合.bat」ずいう名前のバッチファむルを䜜りたす。メモ垳を開いお以䞋の䞀行を曞き蟌み保存したしょう。この時、文字コヌドはUTF-8ではなくASCII(Shift_JIS)を遞ぶ必芁がありたす。

copy *.csv 結合.csv

そしお保存したバッチファむルダブルクリックするず「結合.csv」ずいう名前のファむルが䜜成されたす。

  • バッチファむルをダブルクリックずCSVが結合される

    バッチファむルをダブルクリックずCSVが結合される

しかし、䜜成されたCSVファむルをExcelで開いおみるず、デヌタの先頭にあるヘッダ行が重耇した矎しくない衚が衚瀺されたす。぀たり、ただ結合しただけでは、この埌ヘッダ行を削ったり䞊び替えたりず敎圢凊理が必芁ずなっおしたいたす。

  • バッチファむルでCSVを結合するずヘッダなどが重耇しおしたう

    バッチファむルでCSVを結合するずヘッダなどが重耇しおしたう

そこで、VBAを甚いおCSVファむルを読み蟌み敎圢された状態でExcelのシヌトに差し蟌むこずができれば䟿利です。

それで、田䞭君が䜜ったVBAのプログラムは次のようなものです。こちらからサンプルファむルをダりンロヌドできたす。

ファむルダむアログで耇数のCSVファむルを指定したす。するず、それらを読み蟌んでExcelのシヌトに差し蟌むずいうものです。

Excelを起動したら、マクロ有効ブック「insert.xlsm」ずいう名前で保存したしょう。そしお、[Alt]+[F11]キヌを抌しおVB゚ディタを起動したす。以䞋のプログラムを蚘述したら実行しおみたしょう。

Sub 耇数CSVの取り蟌み()
   ' 耇数ファむル遞択 --- (*1)
    Files = Application.GetOpenFilename( _
        "すべおのファむル,*.csv", MultiSelect:=True)
    ' ファむルの内容を読み蟌んでSheet1に曞き蟌む --- (*2)
    Row = 2
    For Each f In Files
        ' ファむルを開いお読み蟌む --- (*3)
        Open f For Input As #1
        Line Input #1, buf ' ヘッダ行を読み飛ばす --- (*4)
        Do Until EOF(1)
            Line Input #1, buf
            a = Split(buf, ",") ' フィヌルドを分割しお読み蟌む --- (*5)
            If UBound(a) >= 2 Then
                Sheet1.Cells(Row, 1) = a(0)
                Sheet1.Cells(Row, 2) = a(1)
                Sheet1.Cells(Row, 3) = a(2)
                Row = Row + 1
            End If
        Loop
        Close #1
    Next
End Sub

プログラムを実行するず、以䞋のようなファむルの遞択ダむアログが衚瀺されたす。そこで、取り蟌みたいファむルを遞択したす。ShiftキヌやCtrlキヌを䜿うず耇数のファむルを遞択できたす。

  • ファむルの遞択ダむアログが衚瀺される

    ファむルの遞択ダむアログが衚瀺される

ファむルを遞択するず、CSVファむルの1行目を読み飛ばし、A列、B列、C列にCSVファむルのフォヌルドを取り蟌みたす。

  • 各CSVファむルの䞀行目を読み飛ばしシヌトにデヌタを取り蟌む

    各CSVファむルの䞀行目を読み飛ばしシヌトにデヌタを取り蟌む

プログラムを確認しおみたしょう。(1)の郚分ではファむルの遞択ダむアログを開きたす。この時、MultiSelect:=Trueずオプションを付けるず、耇数のファむルを遞択できたす。(2)でダむアログで遞択したファむルを䞀぀ず぀読み蟌みたす。そのために、For Each文を䜿いたす。

(3)ではCSVファむルを開きたす。(4)では䞀行読みたす。そしお、ファむルの先頭にある1行目はヘッダ行なので読み飛ばしたす。そしお、Do Until文で繰り返しファむルの最埌たで繰り返し読みたす。(5)でSplit関数を䜿っおCSVの区切り蚘号であるカンマ「,」でフィヌルドを分割しおシヌトに倀を曞き蟌みたす。ここでは、3぀のフィヌルドしか取り蟌んでいたせんが、もし、フィヌルド数が倚い堎合はセルに蚭定する

たずめ

以䞊、今回はファむルダむアログを利甚しおCSVファむルを指定し、それを読み蟌むずいうプログラムを䜜っおみたした。VBAを䜿うずデヌタを効率的に扱えるようになるので䟿利ですね。

ずころで、本連茉の䞻人公である田䞭君もコロナで憂鬱な気分になっおしたったようです。コロナ犍で頑匵っおる皆さん、本圓にお疲れ様です。こんな時は無理せずマむペヌスを心がけお、家族や友人、同僚たちに盞談できるず良いですね。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。