- ベストアンサー
Excelの行の抽出について質問です。
Excelの行の抽出について質問です。 シート1にA列に受付番号、B列に会社名、C列に建築確認月と項目をつくり建築月は「2010年7月」と いうようにそれぞれの月を入力します。 シート2にはA列に「当月確認」「当月以降確認」「当月以前で未確認」の項目の表をつくり、 「2010年7月」とういうリスト形式でセルに入力し、月がかわるごとにこのセルに関連して1発で行ごと仕分けする方法はありませんか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
すみません、#3の続きはコレです。 '-------------------------------------------------------------- r = 2 Do While Cells(r, 1).Value <> "" If Ws1.Cells(r, 3).Value < Tsuki Then LstRow = Ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1 Ws2.Cells(LstRow, 1).Value = "当月以前で未確認" Ws2.Cells(LstRow, 2).Value = Ws1.Cells(r, 2).Value Ws2.Cells(LstRow, 3).Value = Ws1.Cells(r, 3).Value End If r = r + 1 Loop EdRow = LstRow + 1 Set Rng = Range(Cells(StRow, 1), Cells(EdRow, 3)) Rng.Sort _ Key1:=Cells(StRow, 3), _ Order1:=xlDescending, _ Key2:=Cells(StRow, 2), _ Order2:=xlAscending, _ Header:=xlNo, _ OrderCustom:=1, _ MatchCase:=1, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin Set Rng = Nothing Set Ws1 = Nothing Set Ws2 = Nothing End Sub '-------------------------------------------------------------- ご意向にそぐえてますか、一度新規ブックにてお試しください。
その他の回答 (4)
- soixante
- ベストアンサー率32% (401/1245)
そうですか、私のところでは問題なく作動することを確認したんですがね、すみません。 データの内容は配置などについて私が何か見えてないものがあるのかもしれませんね。 マクロのコード自体はちっとも複雑ではありませんので、ご確認のために内容をざっくりだけ書いておきます。 やってることは超シンプルです。 シート1のデータを上から一番下まで順番に見ていく、これを3周しています。(Do Loopが3回ありますよね) 1周目は、当月のものだったらシート2へコピペ、を繰り返し。 2周目は、当月以降のものだったらシート2へコピペ、を繰り返し。 3周目は、当月以前のものだったらシート2へコピペ、を繰り返し。 つまり、すごーくベタな作業をしています。段取りの悪い新入社員がやりそうな作業です。 マクロはこういう繰り返し作業を定型化するのにはもってこいです。うっかりミスもしませんから。 そういうわけで、以下にコードの構成をざっくり書いておきます。診断してみてください。 Sub AAA 各種変数の宣言とセット シート2の並び替えた結果を消去(2回目以降のため) **************************************************** シート1に入ってるデータを上から順に見ていく シート1のC列の値が、シート2のE1 と同じならば、そのシート1のデータをシート2の一番下にコピペ。シート2のA列には「当月確認」と入れる 繰り返し ******************************************************* シート1に入ってるデータを上から順に見ていく シート1のC列の値が、シート2のE1 よりも大きい(=翌月以降)ならば、そのシート1のデータをシート2の一番下にコピペ。シート2のA列には「当月以降確認」と入れる 繰り返し 当月以降確認部分だけを並び替え。確認月の昇順、社名は昇順。 ********************************************************** シート1に入ってるデータを上から順に見ていく シート1のC列の値が、シート2のE1 よりも小さい(=前月以前)ならば、そのシート1のデータをシート2の一番下にコピペ。シート2のA列には「当月以降で未確認」と入れる 繰り返し 当月以降で未確認部分だけを並び替え。確認月の降順、社名の昇順。 ************************************************************ 変数開放 終了 End Sub
- soixante
- ベストアンサー率32% (401/1245)
#2です。以下がコードです。 分量の関係で2回に分けますが、点線の間部分を貼ってください。 '------------------------------------------------------------------- Sub AAA() Dim r As Integer, c As Integer Dim Ws1 As Worksheet, Ws2 As Worksheet Dim Tsuki As Long, LstRow As Long, StRow As Long, EdRow As Long Dim Rng As Range Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Tsuki = Ws2.Cells(1, 5).Value Ws2.Select Set Rng = Range(Cells(2, 1), Cells(2, 1).End(xlDown)) Set Rng = Range(Rng, Rng.End(xlToRight)) Rng.ClearContents Columns.NumberFormatLocal = "yyyy/m" r = 2 Do While Ws1.Cells(r, 1).Value <> "" If Ws1.Cells(r, 3).Value = Tsuki Then LstRow = Ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1 Ws2.Cells(LstRow, 1).Value = "当月確認" Ws2.Cells(LstRow, 2).Value = Ws1.Cells(r, 2).Value Ws2.Cells(LstRow, 3).Value = Tsuki End If r = r + 1 Loop StRow = LstRow + 1 r = 2 Do While Cells(r, 1).Value <> "" If Ws1.Cells(r, 3).Value > Tsuki Then LstRow = Ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1 Ws2.Cells(LstRow, 1).Value = "当月以降確認" Ws2.Cells(LstRow, 2).Value = Ws1.Cells(r, 2).Value Ws2.Cells(LstRow, 3).Value = Ws1.Cells(r, 3).Value End If r = r + 1 Loop EdRow = LstRow + 1 Set Rng = Range(Cells(StRow, 1), Cells(EdRow, 3)) Rng.Sort _ Key1:=Cells(StRow, 3), _ Order1:=xlAscending, _ Key2:=Cells(StRow, 2), _ Order2:=xlAscending, _ Header:=xlNo, _ OrderCustom:=1, _ MatchCase:=1, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin StRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 '-------------------------------------------------------------------
- soixante
- ベストアンサー率32% (401/1245)
#1の者です。補足説明有難うございます。 やはりマクロを使うべきでしょう。 新規ブックで試してください。 【1】Sheet1 A1「受付番号」、B1「会社名」、C1「建築確認月」と入力し、2行目以降にデータを貼り付け 【2】Sheet2 A1「状況」、B1「会社名」、C1「建築確認月」と入力。検索対象にする月の入力場所は、E1とします。E1に、「2010/7/1」と入力 【3】 Alt+F11。VisualBasicの画面が開きます。Alt+I、M とすると、真っ白な画面が開きます。 【4】 この真っ白画面に、のちほどご提示するコードをコピペ。VisualBasic画面を閉じる。 【5】 エクセル画面に戻り、Alt+F8 【6】 マクロ名「AAA」を実行。すると、7月を当月としたデータとなるでしょう。 【7】 そのまま翌月分を試して見ましょう。Sheet2 の E1セルに、「2010/8/1」と入れる。 【8】 【5】~【6】 をやる。 8月を当月としたデータになってるはずです。 コードは分量の関係で次の回答に書きます。
お礼
soixante様 ご回答ありがとうございました。 残念ながら実行してみましたが上手くいきません。 シート2に「当月確認」「当月以降確認」・・・・・項目が無いような・・・ ただ、私のような素人の頭では考えられる内容ではないようですね。 貴重な時間ありがとうございました。 マクロの本をみて勉強してみようと思います。
- soixante
- ベストアンサー率32% (401/1245)
シート2の部分の記述がいまいちよく分かりません。 >A列に「当月確認」「当月以降確認」「当月以前で未確認」の項目の表 ・・・具体的な構成が不明。A列以外の構成要素は? >「2010年7月」とういうリスト形式でセルに入力し ・・・どこのセルに入力? >セルに関連して1発で行ごと仕分けする方法 ・・・「仕分け」の意味するところ。 >当月以前で未確認 ・・・シート1において、確認できてない案件はどうなってるのでしょう?空欄? 内容にもよるのですが、マクロを使用する形になった場合、あなたに知識はありますか。 上記のようなことを詳しく書くと、回答が付くと思います。
補足
質問いただきありがとうございます。 シート2はA列に「当月確認」「当月以降確認」「当月以前で未確認」の項目。 B列にその項目に該当する会社名、C列に建築確認日といったように行ごと シート1から抽出したいのです。 例えば、 「2010年7月」であれば 当月確認 A社 2010年7月 F社 2010年7月 当月以降確認 B社 2010年8月 C社 2010年9月 当月以前で未確認 D社 2010年5月 E社 2010年4月 「2010年8月」 に変更すればこれが自動的に各項目を移動する感じです。 建築確認が終了したものはシート1からデータを削除します。 マクロはあまり詳しくないです。 難しい場合はシート1を月順に並び替えVLOOKUP関数で受付番号で入力 して手動でやるしかないかなって考えてます。 よろしくお願い致します。
お礼
soixante様 大変お手数をおかけしております。 再度チャレンジしてみたら、「当月確認」と「当月以前で未確認」 は表示できますが「当月以降確認」がどうしても表示されませんでした。 何か私のやり方が悪いと思います。 私の職場の職員は関数もろくに使えない人ばかりなので 自動で表示させるには「マクロ」の知識が必要ということで 説明することにします。私はちょっと面白そうなので勉強してみます。 ありがとうございました。