|    | 
     データシートはSheet1に在る物とします(ひぃちゃん さんのシート名にして下さい) 
データ出力先はSheet2とします(ひぃちゃん さんのシート名にして下さい) 
データ出力先のB列の値とデータシートのA列の値を比較します 
データ出力先の日付は、C1を先頭として90日間とします 
データ出力先のC1の日付はシリアル値(日付連番)とします 
 
因みに、前回の質問では、 
>Sheet1に A1にタイトル、B1に品目番号、C1に日付、D1個数があります。 
>Sheet2にマスターとしてA列に品目番号、1行目に日付があります。 
と成っていましたの、レイアウトが違う為、上手く動きません 
 
Option Explicit 
 
Public Sub Sample_3() 
 
  Dim i As Long 
  Dim lngRows As Long 
  Dim rngList As Range 
  Dim rngResult As Range 
  Dim vntData As Variant 
  Dim dicIndex As Object 
  Dim vntMax As Variant 
  Dim vntMin As Variant 
  Dim vntResult() As Variant 
  Dim strProm As String 
 
  'Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置) 
  Set rngList = Worksheets("Sheet1").Range("A1") 
 
  '結果出力の先頭セル位置を基準とする(先頭列の列見出しのセル位置) 
  Set rngResult = Worksheets("Sheet2").Range("A1") 
   
  'Dictionaryオブジェクトを取得 
  Set dicIndex = CreateObject("Scripting.Dictionary") 
   
  'Sheet2に就いて 
  With rngResult 
    '行数の取得 
    lngRows = .Offset(Rows.Count - .Row, 1).End(xlUp).Row - .Row 
    If lngRows <= 0 Then 
      strProm = "データが有りません" 
      GoTo Wayout 
    End If 
    '日付先頭、最終を取得 
    vntMin = .Offset(, 2).Value2 
    vntMax = vntMin + 90 - 1 
    'B列データを配列として取得 
    vntData = .Offset(1, 1).Resize(lngRows + 1).Value 
    'B列データをDictionaryに登録 
    For i = 1 To lngRows 
      dicIndex.Item(vntData(i, 1)) = i 
    Next i 
  End With 
   
  '結果出力用配列を確保(2次元目は日付のシリアル値と同じにして置く) 
  ReDim vntResult(1 To lngRows, vntMin To vntMax) 
   
  'Sheet1に就いて 
  With rngList 
    '行数の取得 
    lngRows = .Offset(Rows.Count - .Row, 1).End(xlUp).Row - .Row 
    If lngRows <= 0 Then 
      strProm = "データが有りません" 
      GoTo Wayout 
    End If 
    '4列分データを配列として取得 
    vntData = .Offset(1).Resize(lngRows, 3).Value 
  End With 
   
  'Sheet1先頭〜最終迄繰り返し 
  For i = 1 To lngRows 
    '日付をシリアル値に変換 
    vntData(i, 2) = GetDate(vntData(i, 2)) 
    '日付がSheet2の範囲内で 
    If vntMin <= vntData(i, 2) And vntData(i, 2) <= vntMax Then 
      '品番がSheet2に在るなら 
      If dicIndex.Exists(vntData(i, 1)) Then 
        '個数を出力用配列に加算 
        vntResult(dicIndex.Item(vntData(i, 1)), vntData(i, 2)) _ 
            = vntResult(dicIndex.Item(vntData(i, 1)), vntData(i, 2)) + vntData(i, 3) 
      End If 
    End If 
  Next i 
   
  With rngResult.Offset(1, 2).Resize(UBound(vntResult, 1), vntMax - vntMin + 1) 
    '結果範囲を消去 
    .ClearContents 
    '結果を出力 
    .Value = vntResult 
  End With 
 
  strProm = "処理が完了しました" 
    
Wayout: 
 
  Set dicIndex = Nothing 
  Set rngList = Nothing 
  Set rngResult = Nothing 
   
  MsgBox strProm, vbInformation 
      
End Sub 
 
Private Function GetDate(vntValue As Variant) As Variant 
 
  Dim lngPos1 As Long 
  Dim lngPos2 As Long 
   
  GetDate = -1 
   
  lngPos1 = InStr(1, vntValue, "/", vbBinaryCompare) 
  If lngPos1 = 0 Then 
    Exit Function 
  End If 
  lngPos2 = InStr(lngPos1 + 1, vntValue, "/", vbBinaryCompare) 
  If lngPos2 = 0 Then 
    Exit Function 
  End If 
   
  GetDate = DateSerial(Val(Mid(vntValue, lngPos2 + 1)) + 2000, _ 
            Val(Left(vntValue, lngPos1 - 1)), _ 
            Val(Mid(vntValue, lngPos1 + 1, lngPos2 - lngPos1 - 1))) 
   
End Function 
 
 | 
     
    
   |