Excel
VBScript
ちょいプロ

正規表現にマッチした部分をExcelに書き出す + 階段グラフにする


概要

正規表現にマッチした部分をExcelに書き出す + プロットする - Qiitaに若干手を加えて、階段グラフにしてみます。

plot2.gif

以下の記事を参考にしています。

Excelで階段グラフを描く方法 - それ、僕が図解します。


使ったデータ


plot.txt

(1,100)

(2,200)
(3,300)
(4,400)
(5,500)


使った正規表現

"\((\d),(\d{3})\)"


コード


plot_階段グラフ.vbs

'------ 本題とあまり関係ない部分 ここから ----

' スクリプトにドロップされたファイル名を取得する。
If Wscript.Arguments.Count > 0 Then
fname = Wscript.Arguments.Item(0)
Else
WScript.Echo "テキストファイルをドロップしてください"
WScript.Quit
End If

'オブジェクトの準備
Set objExcel = CreateObject("Excel.Application") 'Excel操作
Set objFso = CreateObject("Scripting.FileSystemObject") 'ファイル操作
Set objRegExp = CreateObject("VBScript.RegExp") '正規表現
Set objWshshell = CreateObject("WScript.Shell") 'Windowsシェル操作

objExcel.Visible = True 'Excelを見えるようにしておく(今回は手で閉じる,保存する)
objWshshell.AppActivate objExcel.Caption 'Excelを最前面にする

Set objSheet = objExcel.WorkBooks.Add().ActiveSheet 'アクティブなシートのオブジェクトを持っておく
'------ 本題とあまり関係ない部分 ここまで----

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 正規表現にマッチした部分をExcelに書き出す + 階段グラフにする
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' まずは、正規表現にマッチした部分をExcelに書き出す
objSheet.Cells(1,1).Select 'A1をアクティブセルにする
Set objInFile = objFSO.OpenTextFile(fname) '入力のテキストファイルを開く
Do While objInFile.AtEndOfStream <> True

str = objInFile.ReadLine ' 1行読む

objRegExp.pattern = "\((\d),(\d{3})\)" 'パターン設定

Set objMatchCol = objRegExp.Execute(str) '検索実行
If objMatchCol.Count > 0 Then
'マッチした場合
'マッチした部分をさらに分解する
Set objSubMatches = objMatchCol.Item(0).SubMatches

'Excelに書き出す
' 階段グラフにするポイントの部分。前回の値をセルに入れる。
If objExcel.ActiveCell.Row > 1 Then
objSheet.Cells(objExcel.ActiveCell.Row, 1) = objSubMatches.item(0)
objSheet.Cells(objExcel.ActiveCell.Row, 2) = objSheet.Cells(objExcel.ActiveCell.Row-1, 2)
'セルを次の行に進めておく
objSheet.Cells(objExcel.ActiveCell.Row+1,1).Select
End If

' 変化した部分の値 (正規表現でマッチした部分)
objSheet.Cells(objExcel.ActiveCell.Row, 1) = objSubMatches.item(0)
objSheet.Cells(objExcel.ActiveCell.Row, 2) = objSubMatches.item(1)

' セルを次の行に進めておく
objSheet.Cells(objExcel.ActiveCell.Row+1,1).Select
End If
Loop
objInFile.Close '入力のテキストファイルを閉じる

'次に、Excelに書き出したデータをプロットする

Set objChart = objSheet.ChartObjects.Add(120, 20, 300, 200) 'チャートオブジェクトを作る。

objChart.Chart.ChartType = 74 '散布図にする

objChart.Chart.SetSourceData(objSheet.UsedRange) 'データソースに書き出した箇所を設定する

objSheet.Cells(1,1).Select



注意

objExcel.Visible = Falseにする場合は、スクリプトの最後でSave/SaveAs→Close→Quit(→Set X=Nothing)の流れで閉じるようにします。Quitを呼ばないとExcel.exeが残ります

大してメモリ使わないし、サクッと終了するならSet X = NothingはなくてもOKです。