Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3358 / 13646 ツリー ←次へ | 前へ→

【62745】条件と一致するセルをカウントして件数を表示したい エクセル初心者 09/8/27(木) 5:25 質問[未読]
【62747】Re:条件と一致するセルをカウントして件数... Hirofumi 09/8/27(木) 7:40 回答[未読]
【62748】Re:条件と一致するセルをカウントして件数... kanabun 09/8/27(木) 9:31 発言[未読]

【62745】条件と一致するセルをカウントして件数を...
質問  エクセル初心者  - 09/8/27(木) 5:25 -

引用なし
パスワード
   エクセルのマクロを使用して、表Aの開始日と終了日をカウントして、基準日に
該当する件数を累計で書き出す表を作りたいのですが、累計をどのようにしたら
いいのか分かりません。
サイトをいろいろ調べたのですが、参考になる関数やコードが見つからず
質問させていただきました。
どなたかご教授お願いします。

表A
開始日    終了日
--------------------
2009/9/1  2009/9/2
2009/9/2  2009/9/5
2009/9/2  2009/9/3

表B
基準日 9/1 9/2 9/3 9/4 9/5
開始日  1  3   3  3  3
終了日  0  1   2  2  3

【62747】Re:条件と一致するセルをカウントして件...
回答  Hirofumi  - 09/8/27(木) 7:40 -

引用なし
パスワード
   こなのでは?

表Aは、「開始日」がA列、「終了日」がB列で1行目に列見出しが有とします
表Bは、A列1行目に「基準日」の行見出しが有る物とします
集計用テーブル(ハッシュテーブル)を作成して集計します
(ハッシュテーブル = 日付と配列の添え字を関連付けた配列変数)

Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim rngResult As Range
  Dim vntData As Variant
  Dim vntMax As Variant
  Dim vntMin As Variant
  Dim vntTable As Variant
  Dim lngDay As Long
  Dim strProm As String

  '◆Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
  Set rngList = Worksheets("表A").Cells(1, "A")

  '◆結果出力の先頭セル位置を基準とする(先頭列の列見出しのセル位置)
  Set rngResult = Worksheets("表B").Cells(1, "A")
  
  With rngList
    '行数の取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
    If lngRows <= 0 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    '「開始日」A列、「終了日」B列データを配列に取得
    vntData = .Offset(1).Resize(lngRows, 2).Value
    '「開始日」列、「終了日」列から最小最大の日付を取得
    vntMax = Application.WorksheetFunction.Max(.Offset(1).Resize(lngRows, 2))
    vntMin = Application.WorksheetFunction.Min(.Offset(1).Resize(lngRows, 2))
  End With
  
  '集計用テーブルを作成
  ReDim vntTable(1, vntMax - vntMin)
  
  '日付を上から下に繰り返し
  For i = 1 To lngRows
    '「開始日」が空白で無いなら
    If vntData(i, 1) <> "" Then
      'ハッシュ値を計算
      lngDay = vntData(i, 1) - vntMin
      'ハッシュの位置に集計
      vntTable(0, lngDay) = vntTable(0, lngDay) + 1
    End If
    '「終了日」が空白で無いなら
    If vntData(i, 2) <> "" Then
      'ハッシュ値を計算
      lngDay = vntData(i, 2) - vntMin
      'ハッシュの位置に集計
      vntTable(1, lngDay) = vntTable(1, lngDay) + 1
    End If
  Next i
  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  '結果を出力
  With rngResult
    'データをクリア
    .Parent.UsedRange.ClearContents
    '結果を出力
    .Offset(1, 1).Resize(2, UBound(vntTable, 2) + 1).Value = vntTable
    '行見出しを出力
    For i = 1 To 3
      .Offset(i - 1).Value = Choose(i, "基準日", "開始日", "終了日")
    Next i
    '基準日を出力
    ReDim vntTable(vntMax - vntMin)
    For i = 0 To vntMax - vntMin
      vntTable(i) = vntMin + i
    Next i
    With .Offset(, 1).Resize(, UBound(vntTable) + 1)
      .NumberFormat = "m/d"
      .Value = vntTable
    End With
  End With
    
  strProm = "処理が完了しました"
   
Wayout:

  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set rngList = Nothing
  Set rngResult = Nothing
   
  MsgBox strProm, vbInformation
     
End Sub

【62748】Re:条件と一致するセルをカウントして件...
発言  kanabun  - 09/8/27(木) 9:31 -

引用なし
パスワード
   ▼エクセル初心者 さん:
>マクロを使用して、表Aの開始日と終了日をカウントして、基準日に
>該当する件数を累計で書き出す表を作りたいのですが、

マクロということですが、数式でできるのでは?
>表A
>開始日    終了日
>--------------------
>2009/9/1  2009/9/2
>2009/9/2  2009/9/5
>2009/9/2  2009/9/3

表A.から 開始日ごとの出現回数を求めるということなら
表A.A列データ範囲に「開始日」と名前を付けておいて、

基準日  9/1   9/2    9/3   ... ... ....
開始日数 =COUNTIF(開始日,B$1)    ... ... ....

[B2]セル以右に 1行目の日付で条件付きカウントする数式を
上のように埋め込め込んでおけば済むと思いますが?
終了日の数も 同様にして。

かんちがいなら、スルー願います。

3358 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free