1

我编写了一个相对简单的程序,旨在执行以下操作:

  • 我的电子表格中有两列,B 和 C。两个数据集都从第 26 行开始
  • B 包含一个项目的编号(例如项目 1),C 包含每个行项目的标识符,以便可以将多个服务分配给一个项目。然后,这两个变量的组合将形成每个行项目的唯一 ID(例如,项目 1 中第三个项目的 1/3)
  • 每次在 B 列中输入新的项目 ID 时,C 列应重新从 1 开始
  • 一旦项目列表完成,循环应该停止(第一个 if 条件)
  • 我使用另一个过程按项目编号和另一个标准对数据集进行排序,这意味着我每次之后还必须重写 C 列
  • 为了使代码更易于阅读,我创建ThisRowLastRow

我的代码不会产生错误消息,但也不会返回所需的结果:单元格 C27 的值应该为 2,但它返回 1,并且同一列中下面的所有单元格都是空白的。这看起来很奇怪,因为在即时窗口中它们都得到了 1 的值(这仍然不正确,但与它打印到电子表格的不同)。

我已经尝试了一段时间来修复它,但我不知道错误可能出在哪里。非常感谢您的帮助!下面的代码:

Sub DataSort()

Dim i As Object, ThisRow As Integer , LastRow As Integer

Range("C26").Value = 1
Range("C27").Activate    
ThisRow = ActiveCell.Offset(0, -1).Value

LastRow = ActiveCell.Offset(-1, -1).Value


    For Each i In Range("ProcessID")
        If ThisRow = 0 Then
            Exit Sub
        ElseIf ThisRow > LastRow Then
            ActiveCell.Value = ActiveCell.Offset(0, -1).Value + 1
        Else
            ActiveCell.Value = 1
        End If
        Debug.Print ActiveCell.Value
    Next i
End Sub

>更新: 这是电子表格的截图;希望这会有所帮助: 截屏

4

1 回答 1

2

您正在循环同一组单元格,因为您永远不会更改循环中的活动单元格。您还需要为每一行重新计算 ThisRow 和 LastRow 的值,因此需要将其包含在循环中。

Sub DataSort()

Dim i As Range, ThisRow As Integer , LastRow As Integer

' Set the initial active cell and first process number
Range("C26").Value = 1
Range("C27").Activate    

   ' Loop through each cell in the Process column  
    For Each i In Range("ProcessID")
        ' Load the value of this row and the last row
        ThisRow = ActiveCell.Offset(0, -1).Value
        LastRow = ActiveCell.Offset(-1, -1).Value

        ' Check if we are at the change of a project - update process number
        If ThisRow = 0 Then
            Exit Sub              
        ElseIf ThisRow > LastRow Then
            ActiveCell.Value = 1
        Else
            ActiveCell.Value = ActiveCell.Offset(0, -1).Value + 1
        End If
        ' Move the active cell down one row
        ActiveCell.Offset(1,0).Activate
    Next i
End Sub

注意:我没有测试过这段代码。

但是,您的代码不会靠近i变量。使用它,我们不需要使用ActiveCell

Sub DataSort()

Dim i As Range, ThisRow As Integer , LastRow As Variant



   ' Loop through each cell in the Process column  
    For Each i In Range("ProcessID")
        ' Load the value of this row and the last row
        ThisRow = i.Offset(0, -1).Value
        LastRow = i.Offset(-1, -1).Value

        ' Check if we are at the change of a project - update process number
        If ThisRow = 0 Then
            Exit Sub
        ' First Row of Data
        ElseIf LastRow = "Project ID" Then
            i.Value = 1
        'Change of Project - reset Process ID
        ElseIf ThisRow > LastRow Then
            i.Value = 1
        'Same Project so increase the Process ID
        Else
            i.Value = i.Offset(-1, 0).Value + 1
        End If
        ' Move the active cell down one row
    Next i
End Sub

我认为您在检查 ThisRow 是否大于 Last 行时也可能已经交换了逻辑 - 这应该意味着项目发生了变化,因此请重置进程 ID 号。

于 2013-01-03T00:21:37.933 回答