0

Excelシートを4つの異なるシートに再フォーマットする方法を理解するのに苦労しています。今のところ、私は文書化する必要があります。1つはデータを含み、もう1つは他のデータを再フォーマットする必要があります。

背景は次のとおりです。

  1. 最初のドキュメントには、その年の(12)か月ごとに48行(4つのグループ)があります
  2. 対応する列は2012年から1950年のものです
  3. 例->最初の行は1月で、2012年、2011年、2010年などの降水量の値が示されています。
  4. 例-> 2行目は、同じ年のmaxTemp値を持つJANUARYです。
  5. 3番目の行はminTempおよび4番目のavgTempと同じです。次に、これらの4つが12回繰り返されます
  6. 1つのデータ型のすべての月をコピーして連結する必要があります
  7. (データが1950年1月から2012年1月までのデータになるように逆の順序で)
  8. そして、4つのExcelドキュメントのうちの1つ(データ型ごとに1つ)の新しい行に貼り付けます
  9. そのため、最後の1行には、1950年1月、1950年2月、1950年3月の降水量が含まれます... 2012年11月、2012年12月
  10. このように、1行は1950年1月から2012年12月までの順序で12(月)* 62(年)になります
  11. 基本的に、それぞれが1つの非常に長い行を持つ4つのExcelドキュメントがあります

これが私の考えです

(より良い方法がない限り)私は次のようなマクロ(または式)があるかどうか疑問に思っていました:

  1. 1950年1月から2012年1月の降水量に対応する逆の順序(つまり、Z3-C3)で行に参加します
  2. それをコピーして、それを連結します...
  3. 1950年2月から2012年2月の降水量に対応する逆順の別の行の同じ部分(つまり、Z7-C7)
  4. 1950年3月から2012年3月の降水量に対応する逆順の別の行(つまり、Z12-C12)
  5. 12か月すべて繰り返します
  6. それらを降水量Excelドキュメントに貼り付けます
  7. これは、4つのデータ型すべてに対して実行する必要があります(つまり、Z4-C4はminTemp 1950-2012年1月、Z8-C8 2月など)

これもまた、そのデータ型だけの1950年から2012年12月までのデータを含む1つの行を生成します

4

1 に答える 1

0

アップデート

私は以下の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 ます。今後の質問へのヒント:自分で解決策を作成しようとした場合(アウトラインだけでなく、実際のコードまたは数式)、質問に含める必要があります。だから私たちはあなたが自分で行ったことを見ることができます:)

于 2013-03-02T22:45:56.960 に答える