-2

すでに投稿した質問を修正しています。私の要件は非常に単純です。

DEFECT_ID LOG_TIME ステータス

1001 2012/08/22 12:03:34 オープン

1001 2012/08/22 12:03:35 保留中

1001 2012/08/23 02:13:46 固定

1001 2012 年 8 月 23 日 22:34:37 テスト準備完了

1001 2012 年 8 月 24 日 12:34:43 保留中

1001 2012/08/24 19:13:39 再テスト

1001 2012/08/25 22:13:40 再開

1001 2012/08/26 10:03:41 再テスト

1001 2012/08/27 11:13:42 クローズ

上記の形式は、私の「ソース」データです。そのような欠陥が何百もあるでしょう。ご覧のとおり、上記のログの日付とステータスはすべて 1 つの Defect_ID (1001) に属しています。私の実際の作業は、ステータス間の時間差を計算するのに役立つ形式で上記のデータを新しいシートにコピーすることです。注意点として、オープン、保留中、レビュー、テスト準備完了、修正済み、再テスト、再オープン、クローズの 8 つの欠陥ステータスがあります。また、これらの欠陥ステータスは、1 つの欠陥で複数回発生する可能性があります (上記の例に示すように、「 Pending' は 2 回発生しますが、open と closed は 1 回しか発生しません)。同様に、ステータスが欠陥に対して最大 6 回繰り返される可能性があります。そのため、ログの日付が対応するステータスに適合する、次のような出力が必要です。

*Defect_ID* オープン Pending1 Pending2...Pending6 Fixed1...Fixed6 TestReady1..Testready6 Review1..Review6 Retest1..Retest6 REopen1..REopen6 クローズ

写真の掲載方法を教えてください。もしそうなら、VBA を介して出力がどの程度正確に必要かを示すことができます。私の他の質問を参照してください:「EXCEL VBA を使用して各値の新しい列を作成することにより、ID に一致する 1 つの列から新しいシートに値をコピーする」、つまり、必要なのは、ステータスごとに新しい列を追加する必要があるということです。繰り返す。すべての値が 1 つの行になるようにします。

4

1 に答える 1

0

これがあなたが探していることをするいくつかのVBAです。(要件を正しく理解している場合)。少し冗長かもしれませんが、保守は簡単です。これを行うには、おそらくもっと雄弁な方法があります。

Private Sub CreateOutputSheet()

   Dim iLoop, iStartRow, iEndRow As Integer

   Dim iPendingCount As Integer
   Dim iFixedCount   As Integer

   'Base Col Numbers
   Const colPending     As Integer = 3
   Const colColFixed    As Integer = 9
   '.....

   Dim sDefectIdCurrent    As String
   Dim sDefectIdPrevious   As String

   Dim iTargetRow As Integer
   Dim sCurrentStatus As String
   Dim dCurrentTime As Date

   sDefectIdPrevious = Sheets("Soure").Cells(intstartRow, 1)
   sDefectIdCurrent = Sheets("Soure").Cells(intstartRow, 1)

   For iLoop = iStartRow To iEndRow
      sDefectIdCurrent = Sheets("Soure").Cells(iLoop, 1)
      'Check the current problem
      If sDefectIdCurrent <> sDefectIdPrevious Then 'Reset the col counters
         iPendingCount = 0
         iFixedCount = 0
         '....
      End If

      sCurrentStatus = Sheets("Soure").Cells(iLoop, 3)
      dCurrentTime = Sheets("Soure").Cells(iLoop, 2)

      Select Case sCurrentStatus

         Case "Open"
            Sheets("Target").Cells(iTargetRow, 2) = dCurrentTime
         Case "Pending"
            iPendingCount = iPendingCount + 1
            Sheets("Target").Cells(colPending + iPendingCount, 1) = dCurrentTime
         Case "Fixed"
            iFixedCount = iFixedCount + 1
            Sheets("Target").Cells(colColFixed + iFixedCount, 1) = dCurrentTime
         '...
         Case "Closed"
            Sheets("Target").Cells(iTargetRow, colClosedNo) = dCurrentTime
      End Select

      sDefectIdCurrent = Sheets("Soure").Cells(intstartRow, 1)
   Next

End Sub
于 2012-09-01T08:00:13.573 に答える