- ベストアンサー
エクセルのマクロで、こまっています。
エクセル2000のマクロで、こんな作業をしたいのですが、 基本設定:「シート1」 グラフ(上半期)と、その元になる表(上半期)がある。 表は、月ごとの(シート3の)フラグ別で集計されている。 「シート2」 シート1と同じ内容で、下半期分がある。 「シート3」 シート1、2の元になる表があり、A列に日付、B列以降にフラグが数個あり、 コメントが続く。 希望動作:マクロを実行すると、シート3の表を、 実行日の年度の上半期、下半期、B列以降のフラグで、 フィルタをかけ、ヒットする件数をシート1、2に送る。 これだけのことなんですが、解らないことがあって止まっています。 (1)、今日の日付を取得し、その年度の上半期(4/1~9/30) 下半期(10/1~3/31)を取得する。 A列の日付は、(2002/11/15 18:45)という形式です。 (2)、フィルタをかけた後、ヒットした件数を取得する関数。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(1) 上半期(始)=DATE(YEAR(A2)-(MONTH(A2)<4),4,1) 上半期(終)=DATE(YEAR(A2)-(MONTH(A2)<4),9,30) 下半期(始)=DATE(YEAR(A2)-(MONTH(A2)<4),10,1) 下半期(終)=DATE(YEAR(A2)+(MONTH(A2)>3),3,31) (2) SUBTOTAL関数を使えば、出来そうですがどうでしょうか。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
期末、期初の日の求め方。 質問の一部で済みません。VBAと書いてなくて、マクロとなっていますので、なるべく関数式で考えました。回答の1例。 VlookupのTrueを使う。 (データ) A1に日付けを入れる。 (テーブル)E1:G10に下記を作る。 最初2行を作るとあとは+を引っ張って、複写で自動で作れます。 別シートに作ることも出来ます。何年かに一度追加削除が 必要ですが。 2002/10/1 2002/10/1 2003/3/31 2003/4/1 2003/4/1 2003/9/30 2003/10/1 2003/10/1 2004/3/31 2004/4/1 2004/4/1 2004/9/30 2004/10/1 2004/10/1 2005/3/31 2005/4/1 2005/4/1 2005/9/30 2005/10/1 2005/10/1 2006/3/31 2006/4/1 2006/4/1 2006/9/30 2006/10/1 2006/10/1 2007/3/31 2007/4/1 2007/4/1 2007/9/30 (期初日はB列、期末日はC列、に求めます) B1に関数式=VLOOKUP(A1,$E$1:$G$13,2,TRUE) 以下複写します。 C1に関数式=VLOOKUP(A1,$E$1:$G$13,3,TRUE) 以下複写します。 (テスト結果)A,B,C列 2003/5/21 2003/4/1 2003/9/30 2003/6/12 2003/4/1 2003/9/30 2003/7/5 2003/4/1 2003/9/30 2003/8/25 2003/4/1 2003/9/30 2003/9/30 2003/4/1 2003/9/30 2003/10/1 2003/10/1 2004/3/31 2003/11/20 2003/10/1 2004/3/31 2003/12/12 2003/10/1 2004/3/31 2004/1/31 2003/10/1 2004/3/31 2004/2/28 2003/10/1 2004/3/31 2004/3/31 2003/10/1 2004/3/31 2004/4/1 2004/4/1 2004/9/30 ●VBAのコーディングでやると10行程度のコーディングで済むが。 (期初の例) Function kisho(d) m = Month(d) Select Case m Case Is < 4 kisho = DateSerial(Year(d) - 1, 10, 1) Case Is > 9 kisho = DateSerial(Year(d), 10, 1) Case Else kisho = DateSerial(Year(d), 4, 1) End Select End Function 例えばD列にD1に=kisho(A1)といれ、下に複写します。 期末の場合にどう変えるかはお判りになると思う。 ●最後にフィルタと言うエクセル機能に頼るつもりらしいが、全行をループで総なめして、選び出してはどうですか。1000行ぐらいなら即時結果が出ますよ。
お礼
ありがとうございました。仕様の追加があり、半期別&月別&通年での集計も入ったので、 フラグを増やして対応することにしたので、助かりました。
- ja7awu
- ベストアンサー率62% (292/464)
すみません。VBAでしたね。 (1) Sub Kikan() Dim Kami_S As Date Dim Kami_E As Date Dim Shimo_S As Date Dim Shimo_E As Date Dim D As Date D = Range("A2").Value Kami_S = DateSerial(Year(D) + (Month(D) < 4), 4, 1) ' 上半期(始) Kami_E = DateSerial(Year(D) + (Month(D) < 4), 9, 30) ' 上半期(終) Shimo_S = DateSerial(Year(D) + (Month(D) < 4), 10, 1) ' 下半期(始) Shimo_E = DateSerial(Year(D) - (Month(D) > 3), 3, 31) ' 下半期(終) End Sub (2)例: Dim a As Integer a = Application.WorksheetFunction.Subtotal(2, Range("A2:A100"))
お礼
ありがとうございました。なんとか目処がたちました。