- 締切済み
エクセルのマクロを知りたい
エクセルで,たくさんのデータが入力された【シートa】があります。 新しく【シートb】を作成して,そこに空白の表(1)~(10)までを作成します。 (ちなみに表(1)は1行から始まり100行まで,表(2)は101行から始まり200行まで・・・・といった感じです) 【シートb】の表(1)には,【シートa】でA列に「1」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。同様に,表(2)には,【シートa】でA列に「2」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。・・・というのを表(10)まで続けます。 上記のような命令をボタン一つで操作できるようなマクロを教えて欲しいのです。 お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ham_kamo
- ベストアンサー率55% (659/1197)
No.3です。お礼欄を拝見しました。 oonots様がお書きになったような動作をするようにマクロは作ったつもりなのですが、うまく動いていないのでしょうか。 具体的にマクロで何をやっているかというと、 (1)ワーク用のシートを一時的に追加(作業中は見えなくしています) (2)シートaのA列で値が1の行を抽出し、ワーク用のシートにコピー (3)ワーク用のシートをB列をキーに並び替え (4)ワーク用シートの1行目から100行目をシートbにコピー (5)ワーク用シートを削除 の流れて、(2)の「1の行をコピー」から(4)までのところをループで1から10までまわしています。そして(4)のシートbにコピーのところは、 1のとき、シートbの1~100行目にコピー 2のとき、シートbの101~200行目にコピー 3のとき、シートbの201~300行目にコピー : : というように、シートbは100行ごとの10個の表になるようにしています。ワーク用シートは都度クリアしていますので、シートaのA列で1の値が30個あるときはワーク用シートは30行までの表になり、それ1行目から100行目までコピーするので、シートbは31行目から100行目までは空になります。その次のシートaのA列が2の場合は、シートbの101行目にコピーされるので、お書きになったような動作になるはずなのですが、もし意図した通りにマクロが動作してないのであれば、具体的にどういう不具合があるか、補足していただけますか?
- ham_kamo
- ベストアンサー率55% (659/1197)
単純にシートaをシートbにコピーし、第1キーをA列に、第2キーをB列にソートするのではだめなのでしょうか。 それぞれの表が100行ずつ、ということでこのような質問になったのでしょうね。 ご質問通りのマクロを作ってみました。 シートaにボタンを配置し、以下のマクロを実行するようにしてみてください。 なお、シート内で出てくる"シートb"は、実際のシート名に書き換えてください。 Private Sub CommandButton1_Click() Dim WS1 As Worksheet, WS2 As Worksheet, TmpWS As Worksheet Dim i As Integer, j As Integer, k As Integer Dim EndCol As Integer Set WS1 = ActiveSheet Set WS2 = Worksheets("シートb") '抽出先シート名を設定 EndCol = WS1.Cells(1, Columns.Count).End(xlToLeft) Application.ScreenUpdating = False '作業用テンポラリシートを追加 Set TmpWS = Worksheets.Add 'シートbをクリア WS2.Cells.ClearContents For i = 1 To 10 'テンポラリシートをクリア TmpWS.Cells.ClearContents 'シートaからA列がiの行を抽出して転記 j = 1 For k = 1 To WS1.Cells(Rows.Count, 1).End(xlUp).Row If WS1.Cells(k, 1).Value = i Then WS1.Rows(k).Copy TmpWS.Rows(j) j = j + 1 End If Next TmpWS.Cells.Sort Key1:=TmpWS.Range("B1"), Header:=xlNo TmpWS.Rows("1:100").Copy WS2.Rows((i - 1) * 100 + 1 & ":" & i * 100) Next Application.DisplayAlerts = False TmpWS.Delete Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
お礼
ご回答ありがとうございました。 さっそく,このマクロで実行してみました。 しかし,私の説明不足だったようです。すみません。 シートbには,表(1)~(10)として,それぞれ100行ずつの表を作っていますが,シートaの表にある全体のデータの数は,それぞれ100ずつではなく,決まっていないのです。 例えば,A列に「1」が入力されているデータは30個だから,表(1)の30行くらいまではデータが入っていますが,31行から100行までは空白となります。 同様にA列に「2」が入力されているデータは98個もあるため,表(2)は下の2行が空白となります。 しかし,シートaの表にある全データは,何度も編集を行うため,A列に「1」が入力されているデータは,今は30個ですが,変動します。(最大でも100を超えることはありません。) 説明不足で,非常にわかりにくいかもしれませんが,よろしくお願いします。
- SE-TOMMY
- ベストアンサー率77% (17/22)
Excelには「オートフィルタ」という機能があります。 詳しくは下記URLをご参考になさってください。 期待されている内容かどうかはわかりませんが参考にはなると思います。 頑張ってください。
お礼
ありがとうございます。 オートフィルタという機能は使ったことがなかったので さっそく勉強してみます。
- SE-TOMMY
- ベストアンサー率77% (17/22)
Excelには自身の行っている操作をマクロとして記録する事ができますので、まずはご自身でやってみて下さい。 メニューバーより[ツール]→[マクロ]→[新しいマクロの記録]を選択すると、記録が開始されます。 終了時は[ツール]→[マクロ]→[記録終了]または記録中画面に表示されるパネルに四角い停止ボタン(記録終了)で記録を終了します。 そしてマクロを記録して出来上がったVBAのソースを見て下さい。 ([ツール]→[マクロ]→[Visual Basic Editor]または[Alt+F11]) これだけでもかなり勉強になると思います。
お礼
早速のご回答ありがとうございます。 自分でやってみようとは思っているのですが・・・ 【シートa】でA列に「1」が入力されているデータを抽出して・・・ の部分が分かりません。 抽出するにはどうすればよろしいでしょうか? またまた お願いします。
お礼
すみません;;;;; 急に 仕上げなければならない仕事が入ったために PCをさわる時間が なかったために お礼がすっかり遅くなってしまいましたね。 なんとか できました。 ありがとうございました。