• ベストアンサー

エクセルのマクロで、こまっています。

エクセル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)、フィルタをかけた後、ヒットした件数を取得する関数。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

(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関数を使えば、出来そうですがどうでしょうか。

bakuretsu
質問者

お礼

ありがとうございました。なんとか目処がたちました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

期末、期初の日の求め方。 質問の一部で済みません。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行ぐらいなら即時結果が出ますよ。

bakuretsu
質問者

お礼

ありがとうございました。仕様の追加があり、半期別&月別&通年での集計も入ったので、 フラグを増やして対応することにしたので、助かりました。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

すみません。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"))