• Excel's Run

Excelがインストールされていると、拡張子が.csvのCSV(Comma Separated Values)ファイルはExcelに関連付けされている。エクスプローラーで.csvファイルをダブルクリックすればExcelが走り出す。しかし、日本語版Excelでは、ファイルのエンコードがシフトJISであると仮定されている。このやり方でUTF-8のCSVファイルを開こうとすれば、文字化けするだけでなく、場合によっては、区切り位置を間違うこともある。

Windowsでもメモ帳がUTF-8に対応している昨今、シフトJISでしか読み込めないのは情けない感じがする。しかし、この文字エンコードの仮定がUTF-8に変更されることはない。というのは、すでにシフトJISであることを前提としたマクロや、ExcelにCSVを処理させるシステムが大量に稼働しており、変更することは、これらすべてが動作しなくなることを意味する。

シフトJISとUTF-8は、一部のコードが重複していて、完全な自動判別ができない。このため、文字コードを仮定して読み込む必要があり、従来との互換性を維持するにはシフトJISを仮定するしかないのである。

UTF-8エンコードのCSVファイルを読み込むには、先にExcelを起動して、PowerQuery(リボンのデータタブ ⇒ データの取得 ⇒ テキストまたはCSVから)を使って読み込む。このときであれば、文字エンコード方式を指定できる。なお、この方法では、必ずしも拡張子が.csvである必要はなく、.txtでタブ区切りといったファイルを読み込むこともできる。

バッチファイルなどからExcelを起動してPowerQueryにファイルを読み込ませることができるなら、関連付けを利用してエクスプローラーからPowerQuery経由でファイルを読み込むことが可能になる。

色々とやってみたが、PowerQueryを起動するためのQueries.Addメソッドを使うには、Excelマクロ(VBAスクリプト)が必要になり、WSHのVB Scriptなどからは起動できなかった。Copilotにも聞いてみたが、結論は同じ。しかし、Excel側でマクロが動くように設定しておくのは、ちょっと面倒だ。できればExcelの設定などは変更したくない。

そこでWSH(Windows Scripting Host)のVBScriptを使い、SendKeysでキーボードショートカットを操作して、PowerQueryにCSVファイルを読み込ませることにした。後述するようにSendKeysは万能だが欠点がある。リスト01がそのスクリプトだ。


■リスト01

Dim oExcel
Dim shell
Set shell = CreateObject("WScript.Shell")
Set oExcel = CreateObject("Excel.Application")
myPath=WScript.Arguments.Unnamed.Item(0)
oExcel.Application.Visible=true
oExcel.Application.Workbooks.Add
shell.sendkeys "%aFT"
WScript.Sleep 5000
shell.sendkeys "%N"&myPath&"%O"

このスクリプト(ExcelCsv.vbs)は、以下のように起動する(以下ファイルはすべて「C:\cmd」以下にあるものとする)。


cscript.exe c:\cmd\ExcelCsv.vbs <CSVファイルパス>

ファイルの関連付けの登録を簡単にするのと、デバッグを容易にするため、これを起動するバッチファイル「csv.bat」を(リスト02)のように定義しておく。


■リスト02

@echo off
rem echo file:"%1"
cscript.exe /NoLogo C:\cmd\ExcelCSV.vbs "%1"
rem pause

このコマンドを拡張子「.ucsv」に関連付けするのであれば、以下のコマンドをPowerShellで実行する。Windows 11 Ver.24H2以前ではsudoが使えないので、管理者権限でPowerShellを起動して実行する。


sudo cmd.exe /c assoc .ucsv=UTF8.CSV
sudo cmd.exe /c ftype UTF8.CSV="c:\cmd\csv.bat" %1

UTF-8エンコードのCSVファイルの拡張子.ucsvとすれば、エクスプローラーで.ucsvファイルをダブルクリックして、ExcelのPowerQueryでファイルを読み込む直前まで実行できる(写真01)。ここで「読み込む」ボタンを押せば新規に作成したブックファイルにCSVファイルが読み込まれる。「読み込む」ボタンを押す前であれば、文字エンコードや区切り方法を変更することもできる。

  • 写真01: 関連付けで.ucsvファイルからExcelを起動すると、PowerShellのファイル読み込みダイアログが表示された状態になる。ここで「読み込み」ボタンを押せばワークシートにCSVファイルがテーブルとして読み込まれる。また文字エンコードや区切り文字の修正も可能で、さらに加工したければ、「データの変換」ボタンを押してPowerQuery編集ウィンドウを開くこともできる

ただし、SendKeysを使っているので、ファイルをダブルクリックしたあと、読み込みのPowerQueryダイアログが表示されるまでは、マウス操作を行わないようにする。途中、どうしてもダイアログが開くまでに時間が掛かる部分あり、5秒の待ち時間を入れている(WScript.Sleepで5000ミリ秒=5秒の一時停止を行っている)。このとき、マウス操作などで他のウィンドウを選択してしまうと、以後の処理がすべて失敗してしまう。これがSendKeysによる制御の欠点である。

今回のタイトルネタは、1976年のMGM映画「Logan's Run」である。邦題は「2300年未来への旅」で、「2001年宇宙の旅」に引っ張られたようなタイトルだが、製作が同じMGMという以外の関係はない。翌年にStar Warsが公開されており、「ちゃちい」特撮のハリウッド映画としては最後のものに近い。Computer Graphics(CG)も本作には使われておらず、翌月に封切られた「Future World」(邦題未来世界。West Worldの続編)がCGを最初に使った長編映画となった。