以前の仕事で元ヘビーデューティーの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の古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。