- ベストアンサー
エクセルの並べ替えについて
列に日付・品名・数量 行にそのデータを入れています。 このデータを元に列に日付を入れて 行に日付のデータを入れ替える方法があるのでしょうか? 3/10 AA 500 3/10 BB 500 3/11 AA 10 3/11 CC 500というデータを 3/10 3/11 AA 500 AA 10 BB 500 CC 500こんな具合に出来ませんかね。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#2&3です。 セルの色塗りと結合はできましたか。 できていたら,以下は長いので無視してください。 >> 色づけをしたいと思っています。(これは自動マクロで試してみたので… 書いた骨子を理解いただけて大変嬉しいです。 実務などで使うマクロというのは,結局,手作業の自動化という物が多いです。 だから,自動マクロ(マクロの自動機録)というのは初心者が使う物ではなく, ずっと使い続けられる便利機能だと思います。 色づけするマクロも当然自動機録を使えば, 調べる必要もなくなりますし,VBAコードもわかりますから, そのコードを手がかりに他のコードも調べることができますよね。 >> 出来ればこの思案中の件もよろしくってか???? と言われましても, データの形がだんだん見えなくなってきましたよ。 >> 日付に曜日を入れる(これは出来ました) これは,関数を使う方法ではなくて, セルの書式設定のユーザー定義で「m/d(aaa)」にしたということでしょうか。 勝手にそういうことと決めて,作り足してみました。 あと, >> (これは自動マクロで試してみたので >> そのどの部分を当てはめればいいのかを思案中?) と書かれていますが,中に入れると頭の中がごちゃごちゃしますので, 「データ作成」は「データ作成」, 「文書体裁」は「文書体裁」。 と別々に分けて付け足した方がいいと思います。 VBAは完全なオブジェクト指向プログラムではありませんが, 基本は「オブジェクト指向」で「イベント駆動型」のプログラム言語です。 難しいことを言っていても始まりませんので,簡単に言うと, 色々なことを1回のルーチン(プロシージャ)でするのではなく, ルーチン(プロシージャ)は小分けにして, それを次々に呼び出すしくみにしておけば頭の中もこんがらがりません。 また,プロシージャ単位で分けると複数人で1つのプログラムを作るのもすごく楽になります。 アクティブなシートのデータが次のようであったとします。 A B C 1 3/10(金) AA 500 2 3/10(金) BB 500 3 3/11(土) AA 10 4 3/11(土) CC 500 5 3/12(日) AA 250 6 3/12(日) BB 30 … … … その場合の,コードは次のようにすれば良いのではないかという例です。 /////////////////////////////////////////////////////////////// Sub エクセルの並べ替え() 'アクティブシートの記録 Set ASheet = ActiveSheet ' r は行数の変数,cは列数の変数 r = 0 c = -1 ' NewDataというシート名シートが無ければ ' NewDataというシート名のシートを作成 On Error Resume Next Sheets("NewData").Select If Err.Number <> 0 Then Err = 0 Sheets.Add.Name = "NewData" End If ' ii に ASheetシート最終行番号を代入 ii = ASheet.Range("A65536").End(xlUp).Row ' NewDataシート に並べ替え For i = 1 To ii With Sheets("NewData") ' 日付が上のセルと違ったとき If ASheet.Cells(i, 1).Value <> ASheet.Cells(i - 1, 1).Value Then r = 1 c = c + 2 .Cells(r, c).NumberFormatLocal = "m/d(aaa)" '←★ココ変更 .Cells(r, c).Value = ASheet.Cells(i, 1).Value .Cells(r + 1, c).Value = ASheet.Cells(i, 2).Value .Cells(r + 1, c + 1).Value = ASheet.Cells(i, 3).Value ' 日付が上のセルと同じとき Else r = r + 1 .Cells(r + 1, c).Value = ASheet.Cells(i, 2).Value .Cells(r + 1, c + 1).Value = ASheet.Cells(i, 3).Value End If End With Next i '「セルの結合着色」関数の呼び出し Application.Run ("セルの結合着色") '←★ココ追加 End Sub '---------------------------------------------- Sub セルの結合着色() ' ↓単独で実行させる場合は必要かも 'Sheets("NewData").Select ' ii にNewDataシート最終列番号を代入 ii = Sheets("NewData").Range("IV1").End(xlToLeft).Column ' セルの結合・センタリング・着色 For i = 1 To ii Step 2 With Sheets("NewData").Range(Cells(1, i), Cells(1, i + 1)) .MergeCells = True .HorizontalAlignment = xlCenter .Interior.ColorIndex = 8 ' ←※水色 End With Next i End Sub /////////////////////////////////////////////////////////////// 「エクセルの並べ替え()」プロシージャと,「セルの結合着色()」プロシージャに分けてみました。 実際に実行させるのは「エクセルの並べ替え()」だけです。 「セルの結合着色()」は自動で実行されます。 「エクセルの並べ替え()」の方はほとんど変えていません。 #2で書いたほとんどそのままで, .Cells(r, c).NumberFormatLocal = "m/d(aaa)" '←★ココ変更 Application.Run ("セルの結合着色") '←★ココ追加 この2箇所をさわったくらいです。 「エクセルの並べ替え()」が終了すると Application.Run ("セルの結合着色") で,「セルの結合着色()」を呼び出しています。 その「セルの結合着色()」プロシージャ内で, セルの結合と着色をしています。 「マクロの自動機録」でできるようなことを,For文の中に入れてループさせているだけです。 こうすれば楽でしょう。 日にちを変えてプログラミングする場合も, いちいち「エクセルの並べ替え()」 のことを思い出す必要もなく, 付け足し付け足しで,プログラミングできます。 私事ですが, 1つのプロシージャ内を大きくし過ぎて,コンパイルエラーになったことがあるのです。 苦労してやっとできた長大なマクロを実行させようとしたら, 「プロシージャが大きすぎます」 とメッセージボックスが出てきて,ガーーーーーン です。 ヘルプで調べると > プロシージャをコンパイルするとき、 > そのコードは 64K を超えることはできません。 とか…・・・ (実際は50KB以下でも「プロシージャが大きすぎます」が出ることがあります。) 作ったプロシージャ内は,もつれにもつれてましたからね。 結局そのもつれたものをほどいて,別プロシージャに分解することができず, また1から考え直しました。 そういう失敗が教訓となって, それ以降, なるべく1つのプロシージャは#2で書いたくらいか, せいぜいあの2倍くらいの長さに押さえるようにしています。 また, 1つのマクロ内で同じプロシージャを使い回すまわすこともあるので, その点も小分けした方が便利です。 >> ちょい乗りすぎでしょうか・・・(^_^; 乗りすぎというか,本来の質問とだいぶんずれてきましたのでこの辺でご勘弁を…。 私より詳しい方はこのコミュニティ内にもたくさんいらっしゃいます。 最後に, 上のセルの色の参考URLですが。 ColorIndex色見本 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_030_120.html ~引用~ > 良い悪いは別として、ColorIndexがいくつまであるか > 判らないことを前提として、実行時エラーが発生するまでi > ntIndexを加算しながら塗りつぶしを行なう繰り返し処理を > 作成して見ました。 ということらしいです。これはちょっと笑えました。 最終行を求めず,わざと無限ループでエラー出して終了させる… こんな方法もあるのですね。 質問者様がおっしゃっているようにやっぱり「結果オーライ」でしょう。
その他の回答 (3)
#2です。 > コンパイルエラーなど出てお手上げかと思ったら > 出来た。結果オーライか? 結果オーライでしょう。 ここのサイト,字下げ(インデント)に半角空白文字やTabを使うと, それらが全部消えて,コードが左詰になってしまうのです, だから VBA コードの各行の前に,わざと全角空白文字を入れて字下げしたのです。 本当は,コードの前に全角空白はあってはならないと思うので, 最初コンパイルエラーが出たのではないかと思います。 でも,ExcelのVBE(VBエディタ)は,そういうエラーを自動で修正する機能があるので, コピペしたコードを何か触ったときに,全角空白文字が半角空白文字などに自動修正されたので, コンパイル出来たのだと思います。 > マクロの初歩でいいサイトなどありますか? 私は専門家ではないので,良いサイトなどもよくわかりませんが。 ココ↓は結構参考にしています。 ☆ Excelでお仕事!(Excel全般の解説サイト) ☆ http://www.asahi-net.or.jp/~ef2o-inue/top01.html しかし,Excel の場合ヘルプがすごく充実しているので, どっちかというとヘルプの方をよく利用しています。 私事ですが, 私は最初,マクロの自動記録機能を使って マクロを作り,それを修正することから,少しずつ覚えました。 http://kiyopon.sakura.ne.jp/vba/index.htm その後の For文 や IF文 などは, どの言語にでも,ほとんど同じ書き方で出てくるので, 先に他言語で使い慣れていたので,元から書けていたという感じです。 あまり参考にならない回答だと思いますが,以上です。
お礼
またまた ご返事ありがとうございます。 やはり 結果オーライですよね。 今回のマクロを少しいじってみようと思っています。 一つは 日付に曜日を入れる(これは出来ました) 次に 日付の右横が空欄となっているのでセルの結合をして 色づけをしたいと思っています。(これは自動マクロで試してみたので そのどの部分を当てはめればいいのかを思案中?)こんな具合です。 ご紹介いただいたサイトのぞいてみることにします。 と言うことで 出来ればこの思案中の件もよろしくってか????ちょい乗りすぎでしょうか・・・(^_^;
マクロですがこんなのはどうでしょう。 データのあるシートをアクティブにした状態(見ている状態)にして, 下のマクロを実行させれば, 「NewData」というシートが作成されて,そこに並び替えられたデータが作成されます。 --------------------------------- Sub エクセルの並べ替え() 'アクティブシートの記録 Set ASheet = ActiveSheet r = 0 c = -1 ' NewDataというシート名シートが無ければ ' NewDataというシート名のシートを作成 On Error Resume Next Sheets("NewData").Select If Err.Number <> 0 Then Err = 0 Sheets.Add.Name = "NewData" End If 'On Error GoTo 0 ' ii は ASheetのA列の最終行 ii = ASheet.Range("A65536").End(xlUp).Row ' NewDataシート に並べ替え For i = 1 To ii If ASheet.Cells(i, 1).Value <> ASheet.Cells(i - 1, 1).Value Then r = 1 c = c + 2 Sheets("NewData").Cells(r, c).NumberFormatLocal = "m/d" Sheets("NewData").Cells(r, c).Value = ASheet.Cells(i, 1).Value Sheets("NewData").Cells(r + 1, c).Value = ASheet.Cells(i, 2).Value Sheets("NewData").Cells(r + 1, c + 1).Value = ASheet.Cells(i, 3).Value Else c = c r = r + 1 Sheets("NewData").Cells(r + 1, c).Value = ASheet.Cells(i, 2).Value Sheets("NewData").Cells(r + 1, c + 1).Value = ASheet.Cells(i, 3).Value End If Next i End Sub ----------------------------------- 最初のデータが A1 セルから始まっている時のみ, 上のマクロは使えます。 A B C 1 3/10 AA 500 2 3/10 BB 500 3 3/11 AA 10 4 3/11 CC 500 もしタイトル行が上にある場合, A B C 日付 品名 数量 1 3/10 AA 500 2 3/10 BB 500 3 3/11 AA 10 4 3/11 CC 500 つまりこんな場合↑は ' NewDataシート に並べ替え For i = 1 To ii の For文の 1 を 2 にしてください。 つまりこうなります↓。 For i = 2 To ii 他の場合のカスタマイズはちょっと難しいと思います。 ////////////////////////////////////////////////////////////////////// マクロの登録方法や使用方法がわからないかもしれないので, 念のため書いておきます。 ~~マクロの作成方法~~ [ツール] メニュー→ [マクロ]→[マクロ]でマクロダイアログボックスを出します。 [マクロ名] ボックスに、「実行するマクロの名前」 (つまり エクセルの並べ替え )を入力し,「作成」をクリック Visual Basicエディタが開くと,Module1に ---------------------- Sub エクセルの並べ替え() End Sub ---------------------- がすでに用意されていると思います。ここを ---------------------- Sub エクセルの並べ替え() 'アクティブシートの記録 Set ASheet = ActiveSheet … … … ~ 省略 ~ End Sub ---------------------- のように書きかえ,一旦Visual Basicエディタを閉じます。 これでマクロの作成は終わりです。 ~マクロの実行方法~ 方法1 ショートカットから実行 再び[ツール] メニュー→ [マクロ]→[マクロ]でマクロダイアログボックスを出します。 [マクロ名] ボックスの下にある大きなボックスから 「実行するマクロの名前」を選択し「オプション」を選択し, マクロオプションダイアログボックスから ショートカットキー 「Ctrl」+「任意のキー」でショートカットを登録すれば, 次回からこのショートカットキーでマクロが実行されます。 「任意のキー」は P A C Z など日頃自分が使われているキーは避けた方が良いです。 方法2 画像から実行 自分で書いた絵やネット上のボタン画像や写真もマクロ実行のボタンとして使用できます。 ボタンにしたい画像を右クリック→「マクロの登録」で 「実行するマクロの名前」を選択→「OK」で マクロ実行ボタンの完成です。 その他,ツールバーのフォームから ボタンを作って,そのボタンにマクロを登録するなど, 色々な方法があります。
お礼
丁寧な回答ありがとうございます。 早速 マクロ部分をコピーしてやってみました。 思ったものに近いものが出来ました。 あと少し手を加えたいのですが マクロが今ひとつわからなくて・・・。(^_^; はじめ このマクロもコピーして言われていると折りしたはずなのに コンパイルエラーなど出てお手上げかと思ったら 出来た。結果オーライか? 少し勉強したいと思いますが・・・。 なんか マクロの初歩でいいサイトなどありますか? ご紹介いただければありがたいのですが。
- aco_michy
- ベストアンサー率25% (70/277)
対象部分をコピーして貼り付ける段階で 右クリックし「形式を選択して貼り付け」を選び 下の方にある「行列を入れ替える」にチェックを入れて貼り付ければ、近いことができます。
お礼
回答ありがとうございます。 残念ながらこの方法はやってみましたが ただ行と列を入れ替えるだけで 同じ日付でも列が変わってしまって思っているような形にはなりませんでした。 ほかに方法がありますか?
お礼
本当にご親切な回答ありがとうございます。 今ざっと読ませていただいて お礼を書かせていただいております。 ご指摘の通り曜日は(ddd)を入れて表示させました。 色つけと結合はちょっと後回しになっていたので これを参考にさせていただきつつ 自分で行った自動マクロと照らし合わせてお勉強させて貰おうと思ってます。 並び替えと 結合・色つけを別に別けるという発想大切にしたいと思います。 一緒でいいじゃんと思っていたので。 そして マクロの注釈文(?)も大事ですね。 あとから見直してもわかるように気を配ること!! 最後に本来の質問から発展させていただき それにもお答えいただきまして 心より御礼申し上げます。 またの機会がありましたら どうぞよろしく!!