- ベストアンサー
エクセルの移し変え作業(A表のデータをコピー、B表にペーストする)で
エクセルの移し変え作業(A表のデータをコピー、B表にペーストする)で もっと楽で時間の掛からない方法があれば教えてください。 現在のやり方 A表に、1日24時間毎のデータが1年分(365日×24時間=約8800行)あります。 上(1行目は1月1日1時のデータ)から、下(最終行目は12月31日24時のデータ)に向かってあります。 このデータをB表に移します。 B表の1行目は、1月1日のデータで、右方向に1時~24時までのセルがあります。 2行目は、1月2日のデータで、右方向に1時~24時までのセルがあります。 〃 〃 〃 〃 〃 365行目は、12月31日のデータで、右方向に1時~24時までのセルがありま す。 データ移し変え方法は、 A表から1日分(24データ)をコピー、B表の右方向へ行列を変更してペーストしています。 次に、1月2日を同様にしてコピー、ペースト、365回これをくりかえして1年分をまとめています。 この方法で7年分済ませましたが、作業してくれる方(私を含めて)が全員泣いてます。 花粉症なら分かっているけど風邪だと言い張って作業を休んだり、急に里帰りしたり、目が疲れるから3時間だけ、他にしなくてはならないことが、腱鞘炎だ、など、単調な作業でやたら時間がかかるので嫌われています。 今後、残りの作業年数が20年あり、エクセルの機能の中にこれが楽にできる 方法があれば、是非、是非、教えてください。 マクロは知らないので、出来るだけ、一般的な方法で。よろしくお願いします。
- みんなの回答 (17)
- 専門家の回答
質問者が選んだベストアンサー
原因不明ですね。 〔第3段階〕 Sheet2のA1に =INDEX(Sheet1!$A$1:$A$8760,(ROW()-1)*24+COLUMN(),1) としてみてください。 『Sheet1』はシートタブに表示されているシート名です。 『$A$1:$A$8760』はとりあえず『$A$1:$A$500』でもかまいません。 だめなら、 〔第3段階〕 Sheet1のA列のデータの入っている範囲に名前をつけます。 Sheet1のA列のデータの入っている範囲(A1からA列のX行まで)を選択して、 挿入→名前→定義で『DATA』を入力 Sheet2のA1に =INDEX(DATA,(ROW()-1)*24+COLUMN(),1) とします。 2.66がでればコピーします。 2.66がでなければ、 セルA1で =(ROW()-1)*24+COLUMN() がどうなるか教えて下さい。 セルA2で =(ROW()-1)*24+COLUMN() がどうなるか教えて下さい。 セルB1で =(ROW()-1)*24+COLUMN() がどうなるか教えて下さい。 Excelのバージョンが関係する? Indexを使ってみています。
その他の回答 (16)
- ubonoti01
- ベストアンサー率20% (43/211)
締め切られる前にもう一つ。 先のアドバイスで『例えば、A1~A365に数値1~365を入力しておき』としたのは、質問の例では、『Y1~Y365に数値1~365を入力しておき』としたほうが良いでしょう。 そうすればA1~X1に入っている式をダブルクリックでオートフィルすれば、A365~X365までが一瞬に求まります。 ダブルクリックのオートフィルを覚えたのは数年前に友人から聞いたものです。当時のExcel97でも使えました。解説本に載っているという話は聞いたことがありません。 お仕事が順風満帆で何よりですね。 もう、お礼は不要ですよ。
- ubonoti01
- ベストアンサー率20% (43/211)
《以下、先刻ご承知の内容でしたらごめんなさい》 数式をコピーする際、ダブルクリックのオートフィルを利用されていますか? 例えば、A1~A365に数値1~365を入力しておき、B1~X1に入っている式をダブルクリックでオートフィルすれば、一瞬で365行に式がコピーされます。 もう少し具体的に言いますと、 式が入っているB1~X1を選択した状態で、セルX1の右下へマウスカーソルを置き小さな+記号が出たらダブルクリックします。するとA列に数値の入っている行の最後(365列)まで、一瞬に式がコピーされます。 《上記、先刻ご承知の内容でしたらごめんなさい》
お礼
ubonoti01様 アドバイスありがとうございます。 ダブルクリックのオートフィルの方法は、知らなかったので、実験です。 列、行の大きさが異なってもできました。また、列、行ともに、 途中に空(から)のセルがあっても出来ました。 これまた、ビックリ機能です。資料を整理するのに利用出来ますね。 このような使い方というのは、皆さんは解説本で会得されたのでしょうか? 今回お願いした質問への回答を使ったエクセル作業は、順風満帆で快調そのもの、後ろから台風の追い風が来ているみたいなスピードで、楽に、笑いながらよそ見してても仕上がります。実感として今までの3日分作業が3時間終了!!! 別件;今夜、マクロのやり方についての連絡をいただけなかったら、質問を締め切ります。相手様の立場では、1から教えるのは大変なことで疲れだけが残るでしょう。本来は私がマクロをある程度理解してから教えてもらうのがスジであり、基本的な立場を忘れておりました。その方に重荷をかけたことを今恥じております。
- imogasi
- ベストアンサー率27% (4737/17069)
(追報) 1.Test01()は終わったようですね。ただ心配なのは最下行が、41Aまでと書いておられるが、8760行目(=24*365)に365zが入っているはずで そうなっていませんか。 2.Test02()ですが、新規作成のBook1のSheet1のA列のデータに対し、プログラムが加工して、Sheet2のA列からZ列かつ1から365行までに書き出します。これで良いか良く考えてください。 3.OKWebの画面の幅に合わせかたが判らなくて、苦しんでいます。下記の/より/までは行を変えずに打ち込み、かつ/では必ず改行してください。 スペースを入れるところは@マークを入れます。 4.本例ではSheet1のA列の1列をSheet2のAからZ列に並べ替えていますが、Sheet1には何列も有るのではないかと思う。 最大10列に限り(10×24<256<11×24) 増やすようプログラムを改められます。 5.「私の解釈では」と書いておられるところは違います。ブックを新規で作成すると、取りあえずSheet1,Sheet2、・・・が出来ますが それをそのままテストで使うことを前提にして、WorkSheets(”Sheet1”)とかWorkSheets(”Sheet2”)とかとしています。 5.本番のBook(ファイル名)のデータが入っているSheetにおいて、下記の操作をしてください。 Test01()はテストデータ作成用ですので、本番では実行不要。 <本番のVBA Test2()実行操作> ●本番の元データの入っているシートの画面を開く。 ●その画面のメニューバーのツール-マクロ-VisualBasicEditorを順にクリックして、その後メニュバーの挿入-標準モジュールをクリックし、左のプロジェクトエクスプローラー部に「Module1」があらわれるから、それをダブルクリックして右側部分の白紙画面に前記のテストの時のTest02()以下をそのままコピーし貼りつける。 (テストの時のBook1のSheet1のModule1のTest02()からEndSubをコピーし、Book1を閉じても、本番のデータの入っているSheetのModule1に貼りつけることが出来ます。) ●Test02()のEnd subまでの途中ならどこでも良いからカーソルをおき、メニューバーの「実行」をクリックすると実行される。 @は1スペース、/は改行を示す(我流です。またVBEがスペースを自動的に入れる個所がありますが、そのままにまかせて良い。) Sub@test02()/ Worksheets("sheet1").Activate/ For@i@=@1@To@24 * 365/ j@=@i@Mod@24/ If@j@=@0@Then/ j@=@24/ k@=@Int(i/24)/ Else/ j@=@j/ k@=@Int(i/24)@+@1/ End@If/ Worksheets("sheet2").Cells(k,j)@=@Worksheets("sheet1").Cells(i, 1)/ Next@i/ End@Sub/
お礼
imogasi様 先日はマクロの件で、ご指導いただきましてありがとうございます。 それ以来、テストしましたが結果はまだできません。 私がマクロについて基礎的な解説書を読み、一般的な理解ができた後に imogasi様のご回答が分かるはずです。そうします。 または、私の知人でマクロの理解者がおれば、imogasi様の回答書を元に 解説してもらいます。 imogasi様に折角回答をいただきましたが、ご負担をかけたことをお侘びします。 今後も、私に、教えて!問題が起これば投稿する機会があろうと思いますので、 その際は、よろしくお願いします。 ありがとうございました。 (これにて、質問を締め切ります)
補足
imogasi様 今晩は!追記ありがとうございます。 1)sheet1の8760行目は365Zが入って、sheet2への移し変えは 期待したとおり、365行になっています。 2)実際のデータは、A列からF列まであります。 (テストはA列が、sheet2へ移ればよいとの考えですが、 6列とも入れてテストしています。) 3)"私の解釈"は、今回はっきり理解できました。 (行の後ろに引っ付けるというのは、実行した時、そこが赤い色がついたので 理解できました。) 本番の実行で: ご指示のように、進めたつもりですが、、、、 左の枠の上部にVBAProject(Book1)があり、Module1 と Module2が見れます。 その下に、VBAProject(本番データのタイトル)とModule1があり、Module1が 反転しています。 右に入っているプログラムの中で、Worksheets("sheet1").Activateの1行に 黄色に色がついてます。(なぜがは分かりませんが) "sheet1"を本番データのシートの名前”data”をいれても同じ結果でした。 実行すると、 『実行時エラー'9' インデックスが 有効範囲にありません』とメッセージが出ます。 最初からやり直して、何回か実行してみましたが、その都度 同じメッセージです。 私の操作ミスがどこにあるのか判断していただけませんか?
- ubonoti01
- ベストアンサー率20% (43/211)
aboukaさん、大変なお仕事、同情します。わたしも興味ありましたので回答を逐次拝見していました。 すでに解決されておられると思いますが、まだ締めきっていないので、立ち寄らせていただきます。 わたしは#1-nishi6さんの回答で出来ました。 aboukaさんの「#印が目いっぱいに広がってます」と言うのは、単にセル幅が狭かったためではないんですか? 因みに、Sheet1のA列、A1~A9999に数値1~9999を入力し、あらかじめSheet2のセル幅を狭くしておいてからnishi6さんの式を入れると、「#印が目いっぱい」になります。これらのセル幅を広げてやると、数値がバッチリ表示されました。テスト済みです。 #1-nishi6さんの回答が一番判りやすく簡単と思います。
お礼
ubonoti01様 ご心配かけましたが、昨夜、回答番号12の xxsadayanxx様の方法で 解決しました。 すぐ、nishi6さんの、#1-の指示どおりにセットすると、解決しました。 この原因は、私の操作ミスです。 10年間パソコンを触っていましたが、初めて『値の変更シート』が出てきて、恐ろしいので常にキャンセルしていたのでした。 (1週間前にエクセル2002に変えたからかな?と思いますが) 昨夜、nishi6様にはお詫びのご連絡をしました。(#11の回答欄 参照) まだ、締め切りしていない理由は、今夜マクロのことで、#8と#13-回答者imogasi様のご指示でマクロをテストします。 初めてマクロに触るので、何が飛び出すか、不安と興味でいっぱいです。 今回もそうですが、新しい数式(INDIRECT、OFFSET、加えてマクロ)などを 教えてもらえるこのgoo教えてシステムには感謝、感謝です。
- imogasi
- ベストアンサー率27% (4737/17069)
朝6時30分補足を見ました。出勤時間まで時間がなく、解答を入れられません。本日昼に解答を考え、夜解答を 入れさせていただきます。悪しからず。 コピーは使いません。Sheet1は貴殿の原データであり、 Sheet2は自動的にできあがるシートの名を指します。 WorkSheets(”●”)の●の部分のSheet1やSheet2に 本番では、原データシート名と結果シートのシート名を プロウラム中に置き換えて入れるのです。
No.5の回答をしたxxsadayanxxです Sheet2のA1に式を入力してその式をA1~X365にコピーと言うのは A1~X365の"全てのセル"に式をコピーして下さいと言う意味なのですが・・ どうも、返信の内容では、A1に式を入力して、1行目を2~10行目に コピーされているのではないでしょうか?? (B~X列に式が入力されていない) 式のコピーは色々な方法が有りますが 以下の手順通りに試して見てください 1)Sheet2のA1に下の式を入力(返信に記載された式でOKです) =OFFSET(Sheet1!$A$1,(ROW()-1)*24+COLUMN()-1,0,1,1) 2)A1を右クリックして"コピー"を選択 3)X365をShiftキーを押しながらクリック 4)Enterキーで式がコピーされます
お礼
xxsadayanxx 様 ご回答ありがとうございます。 コピーの方法およびOFFSETの数式を教えていただき、 指示どおりにしました。 煙草に火をつける時間も無く、なんと簡単に、 数学的に、エクセレントに、エクセルの機能はすばらしいのでしょう!! 多量のデータを瞬時に入れ込むことができました。 xxsadayanxx様は一般人と表示されておりますが、 高度のエクセルを日常的にお使いになっていらしゃると 思われます。 もし、一般人とすれば、私は無知人となり、明日パソコンを 中古屋に出し、枝ぶりの良い樹を探した方が 世のためかも知れないと思われます。 今回作業で現在初めてマクロの世界に触れてます。 こちらの結論と、もう1つの方法を教えていただいた後で 締めきりますので、少し時間をください。 驚いた夜でした。今夜はゆっくり休めます。
- nishi6
- ベストアンサー率67% (869/1280)
編集モードはF2を押すことの意味で使いました。 〔第1段階〕 まず、Sheet2は全部クリアしてください。A列から24列の削除でかまいません。 〔第2段階〕 クリアしたら、Sheet2のA1を選択して、 = を入力、 Sheet1タブをクリック Sheet1のA1を選択 Enter これで、Sheet2のA1には 2.66と表示され、算式は『=Sheet1!A1』となっているはずです。 これがうまくいっていなければ、Sheet1に問題があります。 〔第3段階〕 うまく2.66がでれば、この算式を修正して =INDIRECT("Sheet1!A"&(ROW()-1)*24+COLUMN()) にして下さい。面倒かもしれませんが入力してみてください。『Sheet1』が大文字、小文字の違いがあるかもしれません。 〔第4段階〕 算式を修正して2.66がでれば下、右にコピーします。 〔第1段階〕~〔第4段階〕まで行って、補足をして下さい。
補足
nishi6様 〔第1段階〕〔第2段階〕はご指示どおりに出てきます。 〔第3段階〕で、式入力を何回か試みました。 手入力を数回やコピーでもやりました。 入れた式です =INDIRECT("sheet1!A"&(ROW()-1)*24+COLUMN()) 〔第3段階〕の式の入力では私はミスしていないと思います。 しかし、〔第4段階〕では 結果;sheet2のA1セルに #REF! が現れ、2.66の数値が出てきません。 このsheetには、sheet1、sheet2、しか入れてありません。
- nishi6
- ベストアンサー率67% (869/1280)
>=INDIRECT("Sheet1!A"&(ROW()-1)*24+COLUMN())が、{ }で囲まれて・・・ { }は意図していません。 =INDIRECT("Sheet1!A"&(ROW()-1)*24+COLUMN())を登録する時、Ctrl+Shift+Enterで配列数式になっているようです。 普通の算式なので登録する時は普通にEnterです。 Sheet2のA1を選択状態にして、ファンクションキーF2を押して編集モードにして、Enterとします。2.66が表示されればOKです。下、右にコピーします。これでもダメかな?? 前の質問の回答が尾を引いてた? ちなみに >※ 実際の作業は、sheet1のC2がデータのトップで下方向、 >sheet2ではB8がデータのトップで右方向に24個です。 このままの状態で算式をセットすれば、Sheet2のB8は =INDIRECT("Sheet1!C"&(ROW()-8)*24+COLUMN()) となるはずです。うまくいってから確かめられてはどうでしょうか。
補足
nishi6様へ 今度の数式は普通の算式として正しく入れました。 Sheet2のA1を選択状態にして、ファンクションキーF2を押して編集モードにして、Enterとしますが、数値の2.66は出てきません。 F2を押して、Enter してますが、F2を押しながら、どこかで編集モードにするのであれば、その操作はしておりません。 素人考えですが; テストは2日分であるため、数式内のどこかに変更箇所があるような 気がしますが、 =INDIRECT("Sheet1!A"&(ROW()-1)*24+COLUMN()) の中にはありそうもないですね。
- imogasi
- ベストアンサー率27% (4737/17069)
なんか悲惨な様子が伝わってきましたので、解答する気になりました。ただVBA(俗に言うマクロ)なので、判らないといわれるかもしれないですが、まあ考えてそっくり真似することを検討してください。 他の方の関数作成、式のコピー方式も結構複雑なようで 下記の法が簡単かも。 下記Test2()は10秒以内に終わります。Test1()も10秒以内です。 もし下記を使われるなら、まずTest1()を実行して、sheet1のテストデータを良く見て、私の理解が、実情と違っていないか考えて、良ければTest2()を実行して下さい。 データは特徴をモデル化してあるつもりですので、。 そしてsheet2を良く見て貴殿が考えている通りのパターンに並べ替えられたか良く考えてください。 それから本番のデータにTest2()を実行してください。 '--------<テストデータの作成> Sub test01() b = "abcdefghijklmnopqrstuvwxyz" For i = 1 To 24 * 365 j = i Mod 24 If j = 0 Then j = 24 k = Int(i / 24) Else j = j k = Int(i / 24) + 1 End If Worksheets("sheet1").Cells(i, 1) = k & Mid(b, j, 1) Next i End Sub (Next iの上の行「1)」はWorksheets("sheet1")の行の後に引っ付けてください。横幅制約の為に無理に改行されていますのでご注意。この()の部分はプログラムでないのでプログラムの打ち込みの時は省くこと。) '-----<行と列の日別に入れ替え> Sub test02() Worksheets("sheet1").Activate For i = 1 To 24 * 365 j = i Mod 24 If j = 0 Then j = 24 k = Int(i / 24) Else j = j k = Int(i / 24) + 1 End If Worksheets("sheet2").Cells(k, j) = Worksheets ("sheet1").Cells(i, 1) Next i End Sub (Next iの上の行はWorksheets("sheet2")の行の後に 引っ付けてください。横幅制約の為に無理に改行されて いますのでご注意。この()の部分はプログラムでないのでプログラムの打ち込みの時は省くこと。) '---<VBAの実行のし方> ●エクセルでのメニュバーのファイル-新規作成をクリックしsheet1の画面を開く。 ●メニュバーのツール-マクロ-VisualBasicEditorを順にクリックして、その後メニュバーの挿入-標準モジュールをクリックし、左のプロジェクトエクスプローラー部に「Module1」があらわれるからそれをダブルクリックして右側部分の白紙画面に上記のTest1()以下とTest2()以下をそのまま入力する。 ●し終わったら、Test1()のEnd subまでの途中ならどこでも良いからカーソルをおき、メニュバーの「実行」をクリックすると実行される。 ●出来たsheet1を良く見てください。 ●Test2()のEnd subまでの途中ならどこでも良いからカーソルをおき、メニュバーの「実行」をクリックすると実行される。 ●出来たsheet2を良く見てください。 ●Test2()でプログラムのやっている理屈や内容が知りたければ、補足に表明していただければ説明文を作ります。 ●私の方法に関わらず、いかなる方法でやるにせよ、実本番データは別にバックアップを取って置いて実行すること。
補足
imogasi様 ご返事が遅くなり失礼しました。 マクロ以外の方法をテストしてきましたが、まだ最終まで到達できません。 imogasi様より教えていただきました方法でマクロの世界に入ります。 ご指示どおりに●1、●2、●3、●4、まで進めてできたsheetを 見ております。 sheet1の、A列にA1から下方向に、1a,1b,1c,と1が24行並び、 25行目から2a,2b,2c,が 最終の 41a まで見れます。 しかし、私のデータと、それをペーストするsheetはまだ入れてありません。 以下、私の不明な点の質問となります。 1)sheet3、にデータを入れ、sheet4にペースト先のものを入れるのでしょうか? 2)以下の文章の内容指示ですが、これをどこに貼り付けるのしょうか? を 指 示してください。 ※ Next iの上の行はWorksheets("sheet1")の行の後引っ付けてください。 → 私の解釈; マクロ-テスト-1とシートに名をつけておりますが、 下側にあるsheet表示欄のsheet1のタイトルの後ろに スペースを空けずに、Cells(i, 1) = k & Mid(b, j, 1) と つけるのでしょうか? ご指示の後方に("sheet2")につけることも書かれております。 そうなると、データなどはsheet3以降に入れるのでしょうか? 夜分遅くなり、ご連絡が遅く失礼します。 私ごとですが、まだ、2時間位この作業を進める道を探しますので 起きております。
- nishi6
- ベストアンサー率67% (869/1280)
>#印が目いっぱいに広がってます Sheet1のA列に入力されている値は何でしょうか? 算式はうまくいってて、表示形式で『#####』が表示されている可能性があります。 Sheet1のA列とSheet2のセルの書式設定の表示形式を一致させることと、セル幅を広くしてみてください。 Sheet1のA列に縦に並んだ数値を、Sheet2の365行×24列に配置しなおしているだけですよね。
補足
nishi6様へ 1)Sheet1のA列に入力されている値は何でしょうか? ただの数値です。最初のセル:A1 は2.66という数値です。 2)Sheet1のA列とSheet2のセルの書式設定の表示形式を一致させること。 どちらも、表示形式は標準となってます。 3)セル幅を広くしてみてください。 広くすると、#REF! となっており、セルの窓に、数式の =INDIRECT("Sheet1!A"&(ROW()-1)*24+COLUMN())が、{ }で囲まれて います。 4)Sheet1のA列に縦に並んだ数値を、Sheet2の365行×24列に配置しなおしてい るだけですよね。 作業はそのとおりですが、今テストの段階で1ヶ月分31日だけで テストしてます。 頭の悪い生徒を持った先生の立場が、お分かりになりましたか? 理解が悪くて、ごめんなさいね。
- 1
- 2
お礼
nishi6様 誠に申し訳ないことが分かりました。 今まで、数式を入れて数式欄が表示されている左横のチェックで 入れておりました。 そうすると、値の更新シートがでてきますが、意味が分からず 恐ろしくてキャンセルしておりました。 たまたま OK をクリックしましたら、数値が正常に出てくる ことに気がつきました。 すると、その間何回もわずらわしいことを、nishi6様に考えていただき、 大変申し訳ありません。 教えていただいた、#1の回答で、すべてができた訳です。 本当に、ごめんなさい。 私の無知のため、時間を取らせたことをお侘びします。 この質問でマクロに手をつけたので、その結果が確認できてから 締め切りします。 ありがとうございました。 追伸;明日はちょっとでなく、ピノキオで鼻高々です。 いい忘れたこと:エクセル2002を使ってます。