スモールデータ集計の技

VBSを使ってExcelやCSVを操作し、ハイレベルなデータ集計技をお伝えします。

Excelの行データを列名で参照できるようにする。

前回はExcelの列を列名(カラム名)で指定するようにしました。今回はさらに各行のデータも列名で指定できるようにしましょう。

option Explicit
Dim fso, ExcelApp,  args
const xlToLeft = -4159
const xlUp = -4162
Set fso = CreateObject("Scripting.FileSystemObject")
Set ExcelApp = CreateObject("Excel.Application")
set args = WScript.Arguments
ReadExcelFile  args(0)
ExcelApp.Quit
WScript.Quit

Sub ReadExcelFile( filename )
  dim obook, ofile, row, oSheet,maxrow,telnum, schema, oneLine
  set ofile = fso.getFile( filename )
  set schema = CreateObject("Scripting.Dictionary")  '列名-列番号
  set oneLine = CreateObject("Scripting.Dictionary")  '列名-データ
  set oBook = ExcelApp.Workbooks.Open(ofile.path) 
  set oSheet = oBook.WorkSheets(1)
  maxrow =  oSheet.Cells(oSheet.Rows.count,1).end(xlUp).row
  ParseSchemaExcel oSheet, 1, schema  'ヘッダー行の解析
  for row = 2 to maxrow
    ParseLineExcel oSheet, row, schema, oneLine
    telNum= oneLine.item("電話番号")
     if Left(telNum,3) = "03-" then
       WScript.echo oneLine.item("名前")
     end if
  next
  oBook.close
end sub

Sub ParseSchemaExcel(oSheet, row , schema)
  dim col, maxcol
  schema.removeall
  maxcol = oSheet.Cells(1,oSheet.Columns.count).end(xlToLeft).column
  for col = 1 to maxcol
    if oSheet.cells( row, col ).value <> "" then
      schema.add Trim(oSheet.cells( row, col ).value), col
    end if
  next
end sub

Sub ParseLineExcel( oSheet, row, schema, oneline  )
  dim key
  oneline.removeall
  for each key in schema.keys
    oneLine.add key, oSheet.Cells( row, schema.item(key) ).value
  next
end Sub

実行方法は、上記をテキストファイルに転記して、ReadExcel.vbsといった名前のファイルに保存し、コマンドプロンプトから
cscript ReadExcel.vbs ファイル名
と入力します。
プログラムを解説します。
前回と差分は
set oneLine = CreateObject("Scripting.Dictionary") '列名-データ

ParseLineExcel oSheet, row, schema, oneLine
が追加され、前回は
telNum= oSheet.Cells(row, schema.item("電話番号")).value
だったのが
telNum= oneLine.item("電話番号")
に変わっています。そして最後にParseLineExcel( oSheet, row, schema, oneline )の処理が追加されています。
この処理はrow行を読み取って、onlineというディクショナリにキー:列名、item:データ値を入れるというものです。通常中身を細かく理解する必要はありません。ライブラリーだと思ってそのまま追加してください。
これによって、ReadExcelFile処理の中では直接セルを指定する必要がなくなり、データ処理がわかりやすくなります。
このテンプレートは”Excelファイルを引数に、列を指定してデータを読み出し処理を行う”というパターンでは、ReadExcelFileの中のforループの中だけを変更するだけで、広く使えるものですので是非ご活用ください。
今回はここまで。