2017-12-11 8 views
0

私は基本的に水平のデータをExcelテーブルのように変換しようとしています。ネストされたループを使用する必要がありますが、その方法についてはわかりません。ここで働いているこれまでのコードですが、私は望んでいないどのように:私はそれをしたい Code result選択したクエリのアクセスに基づいて.eofループがネストされていないvba

私のコードは、この返します。

strSQL = "SELECT * FROM tblTimeSheetData WHERE [WorkDate] BETWEEN #" & 
StartDate & "# AND #" & EndDate & "#" _ 
    & "ORDER BY [EmpID], [WorkDate] ;"  

Set rstTime = CurrentDb.OpenRecordset(strSQL) 

Do While Not rstTime.EOF  
    rstTemp.AddNew 
    lngEmpID = rstTime![EmpID] 
    rstTemp![EmpID] = lngEmpID 

    intWeekday = Weekday(rstTime![WorkDate]) 

    Select Case intWeekday 

     Case 2 
      rstTemp![MondayWorkDate] = rstTime![WorkDate] 
      rstTemp![MondayWorkHours] = rstTime![WorkHours] 

     Case 3 
      rstTemp![TuesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![TuesdayWorkHours] = rstTime![WorkHours] 

     Case 4 
      rstTemp![WednesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![WednesdayWorkHours] = rstTime![WorkHours] 

     Case 5 
      rstTemp![ThursdayWorkDate] = rstTime![WorkDate] 
      rstTemp![ThursdayWorkHours] = rstTime![WorkHours] 

     Case 6 
      rstTemp![FridayWorkDate] = rstTime![WorkDate] 
      rstTemp![FridayWorkHours] = rstTime![WorkHours] 

    End Select 

    rstTemp.Update 
    rstTime.MoveNext 
    Loop 

私の選択クエリは、私が欲しいものを正確に返します。返品する: Horizontal view

ありがとうございます。 AG従業員IDが前回と異なる場合にのみ、新しいレコードを追加する必要があります

+0

'rstTemp.AddNew'従業員IDが以前のものと異なる場合にのみこれを実行してください。 –

+0

代わりにクロス集計クエリ(PIVOT)を使用することをお勧めします。これはまさに彼らのためのものです。 – Andre

答えて

0

Dim currEID As Long 'tracks the current employee id 

'... 


currEID = -1 

Do While Not rstTime.EOF 

    lngEmpID = rstTime![EmpID] 

    'new employee? If yes then add a new record 
    If currEID <> lngEmpID Then 
     rstTemp.AddNew 
     rstTemp![EmpID] = lngEmpID 
     currEID = lngEmpID 
    End If 

    intWeekday = Weekday(rstTime![WorkDate]) 

    Select Case intWeekday 

    '....rest of select case here 

    End Select 

    rstTime.MoveNext 
Loop 

rstTemp.UpdateBatch 
+0

ありがとうTim!しかし、それはIf文の中にあるので、新しい考え方がないので、2番目の日付セットに当たるとエラーが発生します。 If文の前にaddnewを置くと、sthは(2行目ではなく5行目に)非常によく似ています。名前が繰り返されないだけです!私はそれが別のループでなければならないと確信していますが、どうですか? – Fusion53

+0

私はあなたのコメントに従うか分からない。しかし、あなたは一般的なアプローチを見ることができるはずです。別の変更は、ループのUpdate outsudeを移動し、最後にUpdateBatchを使用することです。 –

0

私はそれを解決してきました!!ネストされたループが必要でした。 1つのクエリではなく、2つのクエリ(2と3と2)をネストされたループ内で以下のように表示し、そのトリックを行った合計レコード(5)を持って来る。ありがとう。

Set rstTemp = CurrentDb.OpenRecordset("tblTimeSheetDataTemp") 
Set rstTime = CurrentDb.OpenRecordset("tblTimeSheetData") 

'this next query finds two distinct records John and Helen's EmpID 
strSqla = "SELECT DISTINCT tblTimeSheetData.EmpID FROM tblTimeSheetData 
WHERE [WorkDate] BETWEEN #" & StartDate & "# AND #" & EndDate & "#" 

Set rstCts = CurrentDb.OpenRecordset(strSqla, dbOpenDynaset) 

Do While Not rstCts.EOF 

    lngEmpID = rstCts![EmpID] 
    rstTemp.AddNew 

    'This next query finds the number of records with John's (or Helen's) 
    'EmpIDs between Start and End dates 
    strSql = "SELECT * FROM tblTimeSheetData WHERE [EmpID] = " & lngEmpID & " 
AND [WorkDate] BETWEEN #" & StartDate & "# AND #" & EndDate & "#" 
    Set rstTime = CurrentDb.OpenRecordset(strSql, dbOpenDynaset) 

    Do While Not rstTime.EOF 

    rstTemp![EmpID] = lngEmpID 

    intWeekday = Weekday(rstTime![WorkDate]) 

    Select Case intWeekday 

     Case 2 
      rstTemp![MondayWorkDate] = rstTime![WorkDate] 
      rstTemp![MondayWorkHours] = rstTime![WorkHours] 

     Case 3 
      rstTemp![TuesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![TuesdayWorkHours] = rstTime![WorkHours] 

     Case 4 
      rstTemp![WednesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![WednesdayWorkHours] = rstTime![WorkHours] 

     Case 5 
      rstTemp![ThursdayWorkDate] = rstTime![WorkDate] 
      rstTemp![ThursdayWorkHours] = rstTime![WorkHours] 

     Case 6 
      rstTemp![FridayWorkDate] = rstTime![WorkDate] 
      rstTemp![FridayWorkHours] = rstTime![WorkHours] 

    End Select 
    rstTime.MoveNext 
    Loop 

rstTemp.Update 
rstCts.MoveNext 

Loop 
関連する問題