为重复多次的值创建新列,以便通过EXCEL VBA将所有列值转换为行

时间:2012-09-01 06:29:51

标签: vba excel-vba grouping copying excel

我正在修改我已发布的问题。我的要求非常简单。

DEFECT_ID LOG_TIME状态

1001 08/22/2012 12:03:34打开

1001 08/22/2012 12:03:35待定

1001 08/23/2012 02:13:46已修复

1001 08/23/2012 22:34:37 TestReady

1001 08/24/2012 12:34:43待定

1001 08/24/2012 19:13:39重新测试

1001 08/25/2012 22:13:40重新开启

1001 08/26/2012 10:03:41重新测试

1001 08/27/2012 11:13:42关闭

上述格式是我的'来源'数据。将有100个这样的缺陷。如您所见,所有上述日志日期和状态属于一个单独的Defect_ID(1001)。我的实际工作是我必须将上述数据复制到新表格中,以帮助我计算状态之间的时差。请注意,有“八种”缺陷状态:打开,待定,复查,测试准备,固定,重新测试,重新打开,关闭。这些缺陷状态可能在一个缺陷中出现多次(如上例所示,'待定'发生两次。但是开启和关闭只会发生一次)。类似地,最多可以有6次状态可以重复一个缺陷。所以我需要一个像这样的输出,其中日志日期将适合相应的状态:

* Defect_ID * Open Pending1 Pending2 ... Pending6 Fixed1 ... Fixed6 TestReady1..Testready6 Review1..Review6 Retest1..Retest6 REopen1..REopen6 Closed

请告诉我如何发布图片。如果是这样,我可以告诉你我是如何通过VBA获得输出的。请参阅我的另一个问题:'通过EXCEL VBA为eeach值创建新列,从一个匹配ID的列复制值到新表',我需要的是,我需要为每个状态添加新列重复。所以我的所有价值观都会分成一行。

1 个答案:

答案 0 :(得分: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