Function UNPIVOTCROSSTABLE(DATA_AREA As Range, _
Optional HEADER_ROW_AREA As Range, _
Optional HEADER_COLUMN_AREA As Range, _
Optional BLANK_SLIP As Boolean = True, _
Optional HEADER_ORDER As Long = 0)
'----------------------------------------------------------------------------------------------------
' クロス表をリストに変換する自作関数
' DATA_AREA :縦一列にするデータ領域
' HEADER_ROW_AREA :テーブルの行ヘッダー(左部)領域
' HEADER_COLUMN_AREA:テーブルの列ヘッダー(上部)領域
' BLANK_SLIP :データ領域が空白だった時にスキップするかの判定
' HEADER_ORDER :一覧への反映を行ヘッダー、列ヘッダーのどちらからにするか判定する
' 1 :ヘッダー部を左からHEADER_COLUMN_AREA→HEADER_ROW_AREAにする
' 1以外:ヘッダー部を左からHEADER_ROW_AREA→HEADER_COLUMN_AREAにする※こっちがデフォ
'----------------------------------------------------------------------------------------------------
Dim header_column_row As Long, header_row_column As Long
Dim header_row_columns As Long, header_column_rows As Long
Dim data_row As Long, data_column As Long
Dim result_tmp() As Variant, result() As Variant
Dim data_count As Long
Dim r As Long, c As Long
'--- 行ヘッダーが設定されていたら列数をカウントする
If HEADER_ROW_AREA Is Nothing Then
header_row_columns = 0
Else
header_row_columns = HEADER_ROW_AREA.Columns.Count
End If
'--- 列ヘッダーが設定されていたら行数を感とする
If HEADER_COLUMN_AREA Is Nothing Then
header_column_rows = 0
Else
header_column_rows = HEADER_COLUMN_AREA.Rows.Count
End If
'--- 仮の二次元配列を作る※列数はヘッダー部+1、行数は一旦データ部のセル数にしておく
ReDim result_tmp(1 To DATA_AREA.Count, 1 To header_row_columns + header_column_rows + 1)
'--- データ数を一旦0にしておく
data_count = 0
'--- 行→列の順にデータをまとめる
For data_row = 1 To DATA_AREA.Rows.Count
For data_column = 1 To DATA_AREA.Columns.Count
'--- 空白スキップの設定を見ながらデータを取得する
If Len(Trim(DATA_AREA(data_row, data_column))) > 0 Or BLANK_SLIP = False Then
'--- データ数をカウントアップする
data_count = data_count + 1
'--- 行列のどちらから反映させるか判定しつつ一覧にする
If HEADER_ORDER = 1 Then
'--- 行ヘッダーを一覧にする
For header_column_row = 1 To header_column_rows
result_tmp(data_count, header_column_row) = HEADER_COLUMN_AREA(header_column_row, data_column)
Next
'--- 列ヘッダーを一覧にする
For header_row_column = 1 To header_row_columns
result_tmp(data_count, header_column_rows + header_row_column) = HEADER_ROW_AREA(data_row, header_row_column)
Next
Else
'--- 列ヘッダーを一覧にする
For header_row_column = 1 To header_row_columns
result_tmp(data_count, header_row_column) = HEADER_ROW_AREA(data_row, header_row_column)
Next
'--- 行ヘッダーを一覧にする
For header_column_row = 1 To header_column_rows
result_tmp(data_count, header_row_columns + header_column_row) = HEADER_COLUMN_AREA(header_column_row, data_column)
Next
End If
'--- データを一覧にする
result_tmp(data_count, header_row_columns + header_column_rows + 1) = DATA_AREA(data_row, data_column)
End If
Next
Next
'--- 空白をスキップした分リサイズさせる
ReDim result(1 To data_count, 1 To header_row_columns + header_column_rows + 1)
For r = 1 To data_count
For c = 1 To header_row_columns + header_column_rows + 1
result(r, c) = result_tmp(r, c)
Next c
Next r
'--- リサイズした2次元配列を返す
UNPIVOTCROSSTABLE = result
End Function
コメント