アップデート
私は以下のVBAメソッドをテストしましたが、列の制限のために(私にとっては)失敗します。したがって、64ビットバージョン(または2003年以降のバージョン)のExcelがない限り、列を使用してテストすることはできません。列の代わりに行を使用するようにVBAバージョンを変更しましたが、正常に機能します。
ここで両方のバージョンのデモを作成しました:https ://dl.dropbox.com/u/14854735/ptdata.xls
VBAメソッド(簡単/迅速)
以下はテストされていません。作業するワークブックのコピーを作成し、コードエディターを開いて、以下を新しいコードモジュール(ワークブックまたはワークシートのコードセクションではない)に貼り付けます。
Const ROW_HEADER = 1 ' No Row Header - Set to 0
Const COL_HEADER = 1 ' No Column Header - Set to 0
Sub FormatDocument()
' This sub assumes the following
' Your source worksheet has column headers (row 1)
' Your source worksheet has row headers (column 1)
' So your data is bound by the range $B$2:$BL$49
' See above constants if this is not the case
' Your source sheet must be the active sheet when you run this sub (unless you edit below)
Dim Source As Worksheet
Dim Destination As Worksheet
Dim Pass As Integer
Dim CYear As Integer
Dim CMonth As Integer
Dim Column As Integer
Set Source = Thisworkbook.ActiveSheet ' If possible change this to the name of the source sheet
For Pass = 1 To 4
Set Destination = ThisWorkbook.Worksheets.Add
Column = 1
For CYear = (63 + ROW_HEADER) To (1 + ROW_HEADER) Step -1
For CMonth = 0 To 11
Destination.Cells(Column, 1).Value = Source.Cells(COL_HEADER + Pass + (CMonth * 4), CYear).Value
' NOTE: I've switched the row and column
' It will now use many rows and a single column
' Destination.Cells(1, Column).Value = Source.Cells(COL_HEADER + Pass + (CMonth * 4), CYear).Value
Column = Column + 1
Next
Next CYear
Next Pass
End Sub
フォーミュラメソッド
次の数式を宛先シートに貼り付けて、必要なすべてのセルにコピーする必要があります(目的の値タイプを取得するように変更した後)。これは基本的に、2次元配列(データ)を1次元配列にマッピングすることです。
=INDIRECT(ADDRESS(((((COLUMN()-1)-(12*INT((COLUMN()-1)/12))))*4)+2,64-INT(COLUMN()/12),1,TRUE,"SourceSheet"))
数式を更新しましたが、期待どおりに機能するはずですが、それでも列数によって制限されます(1950年1月から1971年4月までは可能な限り多くなります)
このコードでは、列ヘッダーと行ヘッダーも考慮に入れる必要があります。これらが必要ない場合は、に+1+n
なり+0+n
、に64-INT(COLUMN()/12)+1
なり64-INT(COLUMN()/12)+0
ます。今後の質問へのヒント:自分で解決策を作成しようとした場合(アウトラインだけでなく、実際のコードまたは数式)、質問に含める必要があります。だから私たちはあなたが自分で行ったことを見ることができます:)