前回の[名前の管理]へ追加は、ピボットテーブルを作りたかったから書いた訳で。
こちらもスクリプト実行ライブラリに登録しておきます。
ピボットテーブル作成
データ集計が好きな人は良く使ってるコレです。
WinActorでピボット使いたいなんて思っちゃう猛者ならお馴染みのヤツ。
このライブラリの前に[名前の管理]からセル範囲の名前を追加し、定義済みの名前をデータソース名に指定して、このノードを実行して下さい。
集計の列と行は、カンマ区切りにすることで複数指定できます。
集計項目の集計内容は、プルダウン式で「合計,平均,最大値,最小値,カウント」から選べます。
出力シート名は、以下の通りの動きをします。
- シート名が存在すれば、そのシートに出力する。
- 同じシート名が無ければ、新しくその名前のシートを作成する。
- 空白を指定した場合、新しいシートを作成して出力します。
出力セルは、R1C1形式で出力範囲の左上セルを指定します。
「スクリプト実行」ノードの実装イメージ
スクリプトタブにこれを張り付け。
' ==== プロパティ ====================================================
fname = !ファイル名!
AreaName = !データソース名!
ColNames = !列項目(カンマ区切り)!
RowNames = !行項目(カンマ区切り)!
ValName1 = !集計項目!
ValFunc1 = !集計|合計,平均,最大値,最小値,カウント!
sheetName = !出力シート名!
PutRange = !出力セル(R1C1形式)!
' ====指定されたファイルを開く====================================================
' ファイルのパスをフルパスに変換する
Set fso = CreateObject("Scripting.FileSystemObject")
absname = fso.GetAbsolutePathName(fname)
If StrComp(UCase(fname), UCase(absname)) = 0 Then
filePath = absname
Else
folderPath = GetUMSVariable("$SCENARIO-FOLDER")
filePath = fso.GetAbsolutePathName(fso.BuildPath(folderPath, fname))
End If
' workbookオブジェクトを取得する
Set workbook = Nothing
On Error Resume Next
' 既存のエクセルが起動されていれば警告を抑制する
Set existingXlsApp = Nothing
Set existingXlsApp = GetObject(, "Excel.Application")
existingXlsApp.DisplayAlerts = False
' 一先ずWorkbookオブジェクトをGetObjectしてみる
Set workbook = GetObject(filePath)
Set xlsApp = workbook.Parent
' GetObjectによって新規に開かれたWorkbookなら
' 変数にNothingを代入することで参照が0になるため
' 自動的に閉じられる。
Set workbook = Nothing
' Workbookがまだ存在するか確認する
For Each book In xlsApp.Workbooks
If StrComp(book.FullName, filePath, 1) = 0 Then
' Workbookがまだ存在するので、このWorkbookは既に開かれていたもの
Set workbook = book
xlsApp.Visible = True
End If
Next
' Workbookが存在しない場合は、新たに開く。
If workbook Is Nothing Then
Set xlsApp = Nothing
' Excelが既に開かれていたならそれを再利用する
If Not existingXlsApp Is Nothing Then
Set xlsApp = existingXlsApp
xlsApp.Visible = True
Else
Set xlsApp = CreateObject("Excel.Application")
xlsApp.Visible = True
End If
Set workbook = xlsApp.Workbooks.Open(filePath)
End If
' 警告の抑制を元に戻す
existingXlsApp.DisplayAlerts = True
Set existingXlsApp = Nothing
On Error Goto 0
If workbook Is Nothing Then
Err.Raise 1, "", "指定されたファイルを開くことができません。"
End If
' ====指定されたシートを取得(無ければ作る)==========================================
Set worksheet = Nothing
On Error Resume Next
' シート名が指定されていない場合は、新しいシートを生成する
If sheetName = "" Then
workbook.Sheets.Add
Set worksheet = workbook.ActiveSheet
Else
For Each sht In workbook.Worksheets
If sht.Name = sheetName Then
Set worksheet = sht
End If
Next
If worksheet Is Nothing Then
workbook.Sheets.Add
Set worksheet = workbook.ActiveSheet
worksheet.Name = sheetName
End If
End If
On Error Goto 0
worksheet.Activate
' ====ハイライトを表示する========================================================
' HwndプロパティはExcel2002以降のみ対応
On Error Resume Next
ShowUMSHighlight(xlsApp.Hwnd)
On Error Goto 0
' ====ピボットテーブルを作る======================================================
xlDatabase = 1
xlRowField = 1
xlColumnField = 2
xlSum = &HFFFFEFC3
xlAverage = &HFFFFEFF6
xlMax = &HFFFFEFD8
xlMin = &HFFFFEFD5
xlCount = &HFFFFEFF0
PutRange = worksheet.Name & "!" & PutRange
Set pvCache = workbook.PivotCaches.Create(xlDatabase, AreaName)
Set pvTable = pvCache.CreatePivotTable(PutRange)
If Len(ColNames) > 0 Then
Labels = split(ColNames, ",")
For i=0 To UBound(Labels)
With pvTable.PivotFields(Labels(i))
.Orientation = xlColumnField
.Position = i + 1
End With
Next
End If
If Len(RowNames) > 0 Then
Labels = split(RowNames, ",")
For i=0 To UBound(Labels)
With pvTable.PivotFields(Labels(i))
.Orientation = xlRowField
.Position = i + 1
End With
Next
End If
FuncOpt = 1
Select Case ValFunc1
Case "合計"
FuncOpt = xlSum
Case "平均"
FuncOpt = xlAverage
Case "最大値"
FuncOpt = xlMax
Case "最小値"
FuncOpt = xlMin
Case "カウント"
FuncOpt = xlCount
End Select
If Len(ValName1) > 0 Then
pvTable.AddDataField pvTable.PivotFields(ValName1), ValFunc1 & " / " & ValName1, FuncOpt
End If
Set xlsApp = Nothing
Set worksheet = Nothing
Set workbook = Nothing
Set fso = Nothing
注釈タブにはコメントをこんな感じで。
Excelの機能、ピボットテーブルを作成します。
・「データソース名」には[名前の管理]で定義したセル範囲の名前を指定します。
・「列項目」、「行項目」は、カンマ区切りで複数指定できます。
・「列項目」、「行項目」、「集計項目」は空白の場合、適用されません。
・「出力シート名」は、シート名が存在しない場合、その名前のシートを作成します。
空白の場合は、デフォルト名で新しいシートを作成して出力します。
・「出力セル」には、R1C1形式でピボットテーブルの左上位置のセルを指定します。

