3次元転置(Microsoft Excel)
以前の仕事で元ヘビーデューティーのLotus1-2-3ユーザーとして、Pattiは、Excelに非常に欠けている機能である3次元でデータを転置する機能に非常に執着しました。 Excelでは2次元の転置がサポートされていますが、Pattiは、行、列、またはテーブルを取得して、ワークシートのスタック全体に分散させる方法を見つけていません。これは、財務部の全員が毎日使用している機能であり、彼女は本当にそれを見逃しています。
パティは正しいです。 Excelでこれを行うための組み込み関数はありません。最も近いオプションは、ピボットテーブルとそれに含まれる「ページの表示」機能を使用することです。通常、次の手順に従います。
。通常どおり、データからピボットテーブルを作成します。
。ワークシートを作成する列をピボットテーブルの[レポートフィルター]セクションに配置します。
。リボンの[オプション]タブを表示します。 (このタブは、ピボットテーブルで作業している場合にのみ表示されます。)
。リボンの左端にある[ピボットテーブル]グループで、[オプション]ツールの横にある下向き矢印をクリックします。
。 [レポートフィルターページの表示]を選択します。 Excelは、ページを表示することを確認するように求めます。
。 6 [OK]をクリックします。
最終的には、手順2で指定した列のエントリごとに1つずつ、一連のワークシートが作成されます。これらのワークシートにはそれぞれ、ピボットテーブルの「ページ」が含まれています。
それでもまだ希望どおりの結果が得られない場合は、マクロを使用してデータを転置する必要があります。このようなマクロは非常に複雑になる可能性がありますが、基本的に必要なのは、データテーブルをステップ実行し、データの各行(または列)を独自のワークシートに移動することだけです。
例として、次のマクロ(Transpose3D)は、選択されたセル範囲から各行を取得し、その行を独自の新しく作成されたワークシートに配置します。
Sub Transpose3D() Dim rngTbl As Range Dim wsName As String Dim R As Integer Dim C As Integer Dim i As Integer Dim j As Integer Dim Killit As Integer Dim RCount As Integer Dim CCount As Integer Dim Table1() As Variant Dim Row1() As Variant RCount = Selection.Rows.Count CCount = Selection.Columns.Count If RCount < 2 Then MsgBox ("Error; Select a range with more than one row.") GoTo EndItAll End If wsName = ActiveSheet.Name R = ActiveCell.Row C = ActiveCell.Column Set rngTbl = Selection ReDim Table1(1 To RCount, 1 To CCount) ReDim Row1(1 To 1, 1 To CCount) Table1() = rngTbl.Value On Error GoTo Abend For i = 1 To RCount If SheetExists(wsName & "_Row_" & i) Then Killit = MsgBox("Sheet " & wsName & "_Row_" & i & _ " Already Exists!" & vbCrLf & _ " Cancel: Stop Transposition" & vbCrLf & _ " OK: Delete Sheet and Continue", vbOKCancel) If Killit = vbCancel Then GoTo EndItAll Application.DisplayAlerts = False Sheets(wsName & "_Row_" & i).Delete Application.DisplayAlerts = True End If Sheets.Add ActiveSheet.Name = wsName & "_Row_" & i Cells(R, C).Select For j = 1 To CCount Row1(1, j) = Table1(i, j) Next j Range(ActiveCell, ActiveCell.Offset(0, CCount - 1)) = Row1() Sheets(wsName).Select Next i GoTo EndItAll Abend: MsgBox ("Error in Routine Transpose3D.") EndItAll: Application.DisplayAlerts = True End Sub
Function SheetExists(SheetName As String) As Boolean Dim ws As Worksheet SheetExists = False For Each ws In ThisWorkbook.Worksheets If ws.Name = SheetName Then SheetExists = True Exit For End If Next ws End Function
注:
このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(11246)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice 365のExcelに適用されます。Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。