1

私は、次のことを行うことを目的とした比較的簡単な手順を作成しました。

  • スプレッドシートにはBとCの2つの列があります。どちらのデータセットも26行目から始まります。
  • Bにはプロジェクト(プロジェクト1など)の番号が含まれ、Cには各ラインアイテムの識別子が含まれているため、複数のサービスをプロジェクトに割り当てることができます。両方の変数の組み合わせにより、各ラインアイテムの一意のIDが形成されます(たとえば、プロジェクト1の3番目のアイテムの1/3)。
  • 列Bに新しいプロジェクトIDが入力されるたびに、列Cは1から再開する必要があります。
  • プロジェクトのリストが終了すると、ループは停止するはずです(最初のif-condition)
  • 別の手順を使用して、プロジェクト番号、次に別の基準でデータセットを並べ替えます。つまり、その後、毎回列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 に答える