• ベストアンサー

エクセルで365×24の表を8760×1に並び替えたいです

 エクセルで、下のような365×24の表で    A  B  C  ・・X 1  ● ● ●   ●           2  ● ● ●   ● 3  ● ● ●   ●        ・                365  ● ● ●   ●            で、これを8,760×1の表に簡単に変換したいのですがやり方がわかりません。少なかったらコピーして行と列を入れ替えるで、やってもいいのですが今回はこれが、かなりの量があり手作業だと時間がかかりすぎ、実用的ではありません。ですので、この作業を簡単に出来る方法を探しております。どうぞ宜しくお願いします。  なお、こちらはオフィス2000、2002を使用しております。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 まずCSVファイルに書き出します。すると次のようになっているでしょう。 ●,●,●,●,● ●,●,●,●,● ●,●,●,●,●  それで、縦一列ですので、「カンマ」をすべて「改行」に置換します。ワープロソフト、またはテキストエディタを使います。  すると、次のようになります。  これを再度、Excelで読み込みます。以上です。 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●

senmi00
質問者

お礼

 回答有難うございました。教えていただいた方法でうまく出来ましたが、今回はかなりの量のデータを処理しなくてはいけなかったので、この方法では時間がちょっとかかりすぎてしまいました。  しかし、このようなやり方があるとは思わなかったので、勉強になりました。どうもありがとうございました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

関数式でやる思考プロセスを説明します。 エクセルの関数は式を入れるセル以外の、他のセルに値をセットできません。(VBAは自由です。) (本件は別のセルに持ってくるだけで、演算は要りません ので、望みのセルを指定するだけで良いのです。) 受けるセル側で、どこからかの来て欲しいセルを表現(指定)すれば良いのです。 A列の下に続けてB列をその下にC列を続けるやり方を 考えます。 例えば値を持ってくる(受ける)セル1000行目には どの行の、どの列なのか?を考えます。 A列1-365を越えるとBの1-365を持ってくる。 これで730セル埋まります。1000-730=270ですからC列の270行目のセルを持ってくるべきことが 判ります。このことを一般化して、 (A)列は現在行1000を365で割った2に1足した 2+1=3(-->C列)が決める。 (B)元の表の上からの第何番行数は、余りの270が決める。 以上は元の表の左上隅($A$1)を基点にして考えてい る。 以下は4行の元表例で説明します。 行は=MOD(ROW()-1,4)+1を使うと、1、2、3、4、1、2、3、4・・・の繰り返しが出来る。 列は=INT((ROW()-1)/4)+1を使うと、1,1,1,1,2,2,2,2,3、3、3、3・・・が出来る 左上隅を基点に列、行を指定してセルを表現する関数に OFFSET関数があることを思い出して、これを使う。 (知ってないと思い出せませんが) ただOFFSET関数はOFFSET(基点、行、列) ですが行や列は「隔たり」行数や列数を指定せねばならないので-1しておく必要があります。 それで空いた列の第1行に =OFFSET($A$1,MOD(ROW()-1,365),INT((ROW()-1)/365))といれ、下へ複写します。8760行まで+ハンドルを引っ張るのは大変ですがほかに楽な方法はないでしょう。 ---- VBAならOFFSETに当たるのはCells(i,j)です。この問題ではCells(i,1)です。こちらなら元の表のx行、y列から収まるべきiを計算します。i=(x-1)*365+jになります。 xは1-365、yは1-24をFOR分でネストして 繰り返します。

senmi00
質問者

お礼

 回答有難うございました。詳しく教えていただいたのですが、私には少しハードルが高くちょっと理解できない部分がありましたが、これから少しづつ勉強していきたいです。  今回は本当に有難うございました。

  • junijuni
  • ベストアンサー率25% (12/48)
回答No.3

こんなのもありかな… Sub Rearranges() nRow = 365 nCol = 24 For i = 1 To nRow For j = 1 To nCol ’A1、A2、A3…、B1、B2と一行にするときはこっち ActiveSheet.Cells((j - 1) * 10 + i, nCol + 1) = ActiveSheet.Cells(i, j) ’A1、B1、C1…、A2、B2と一行にするときはこっち ActiveSheet.Cells((i - 1) * 4 + j, nCol + 1) = ActiveSheet.Cells(i, j) Next Next End Sub マクロで実行します。 条件に応じてコメント行を使い分けてください。 行数が変わる場合はnRowの値を、 列数が変わる場合はnColの値を変更してください

senmi00
質問者

お礼

 回答有難うございました。マクロについて、よくわからなくうまくできなかったのですが、今回教えていただいて、興味がわきました。これから少しづつ勉強できたらいいなと思いました。  今回は有難うございました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 どこかの列(仮にY列)を作業列として使用します。 Y1に、 =OFFSET($A$1,INT((ROW()-1)/24),MOD(ROW()-1,24)) と入力して、8760行目までコピーします。 これだと、 A1,B1,C1・・・X1,A2,B2・・・W365,X365 の順になります。(行優先) もし列優先で、 A1,A2,A3・・・A365,B1,B2・・・X364,X365 のようにするなら、数式を、 =OFFSET($A$1,MOD(ROW()-1,365),INT((ROW()-1)/365)) にします。 数式をコピーして全データを表示出来たら、そのデータ範囲を選択してコピーし、別の場所に[形式を選択して貼り付け]の[値]貼り付けして下さい。

senmi00
質問者

お礼

 回答有難うございました。教えていただいた関数を入力してうまく出来ました。すばやい解凍有難うございました。

関連するQ&A

専門家に質問してみよう