【问题标题】:Creating new columns for values that are repeating more than once so that all the column values will be converted to a row through EXCEL VBA为重复多次的值创建新列,以便通过 EXCEL VBA 将所有列值转换为一行
【发布时间】:2012-09-01 06:29:50
【问题描述】:

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

DEFECT_ID LOG_TIME STATUS

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 测试就绪

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 关闭

上述格式是我的“源”数据。会有数百个这样的缺陷。如您所见,上述所有日志日期和状态都属于一个 Defect_ID(1001)。我的实际工作是我必须将上述数据复制到一张新表格中,格式可以帮助我计算状态之间的时间差。请注意,有“八”种缺陷状态:Open、Pending、Review、TestReady、Fixed、Retest、Reopen、Closed。这些缺陷状态可以在一个缺陷中出现多次(如上例所示,' Pending' 出现两次。但 open 和 closed 只会出现一次)。同样,对于一个缺陷,一个状态最多可以重复 6 次。所以我需要这样的输出,其中日志日期将适合相应的状态:

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

请告诉我如何发布图片。如果是这样,我可以向您展示我究竟需要如何通过 VBA 输出。请参考我的另一个问题:'通过 EXCEL VBA 为每个值创建新列,将与 ID 匹配的列中的值复制到新工作表',我所需要的就是,我需要为每个状态添加新列重复。这样我的所有值都将放在一行中。

【问题讨论】:

  • “通过 EXCEL VBA 为每个值创建新列,将与 ID 匹配的列中的值复制到新工作表” - 请参考此问题以获得更好的想法。我所需要的只是当“状态”重复时,然后我需要将该值也填充到“Defect_ID”的行中。我们可以为每个状态分配 5-6 列,并在它们出现时用“LOG”时间填充它们。我说清楚了吗???请帮助我......我真的很难做到这一点。每天我都在手动复制这个并做。
  • 看看使用 COUNTIFS() 在您的状态列旁边添加一个“计数”列。添加第二列连接状态和计数。然后使用该连接列作为列标题创建一个数据透视表,并将 id 作为行标题。如果缺少列标题(例如没有pending6),则添加一个虚拟ID,其中包含您需要的所有必需状态值作为列标题。
  • 谢谢蒂姆。但是有没有可能通过VBA实现它。上一个。问题具有适用于“状态”的一个实例的“VBA”代码。但是,如果您可以将其用于多个实例,那就太好了。我提到的问题是,在“第一条评论”中。

标签: vba excel grouping copying


【解决方案1】:

这里有一些 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

【讨论】:

  • 谢谢理查德。但是你能告诉我,我应该在哪些列中粘贴源值???它向我显示“超出范围”错误。 :(
  • @user1563464 您可能需要从 Richard 的代码中更改工作表名称以匹配您的代码
  • @Enderland:我已经这样做了。我将源数据作为“源”而将另一个纯粹作为“目标”的工作表提供给了工作表。
  • 您还必须设置 iStartRow 和 iEndRow 变量。默认情况下,这些值为 0。在循环开始时,您将寻找不退出的第 0 行。您可以在代码中手动设置行,即 iStartRow = 3 'First row with Data.或者创建一个函数来计算从哪里开始和结束。
  • 哪一行导致类型不匹配?
猜你喜欢
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多