【问题标题】:Stop increment value in cell according another value in another cell根据另一个单元格中的另一个值停止单元格中的增量值
【发布时间】:2019-05-24 16:22:34
【问题描述】:

根据my precedent post

我需要停止增量,但我没有发现...

我的代码:

Range("A2").Value = "1"
Set derlign = Range("B" & Rows.count).End(xlUp)
'MsgBox ("Dernière ligne " & derlign & " !")
Set r1 = Range("A2:A100")
Set r2 = Range("B2:B100")
For N = 2 To r2.Rows.count
    If r2.Cells(N - 1, 1) = r2.Cells(N, 1) Then
       r1.Cells(N, 1) = r1.Cells(N - 1, 1)
    Else
       r1.Cells(N, 1) = r1.Cells(N - 1, 1) + 1
    End If
Next N
End Sub`

但这给了我:

N°  REF
1   305-77-871
2   402-88-920
2   402-88-920
3   406-55-585
3   406-55-585
3   406-55-585
4   404-11-885
4   404-11-885
4
4
4
...

你能帮我停止增量吗?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您的增量自动停止在r2.Rows.count,因此您需要将范围限制为您拥有的数据量(而不是硬编码100)。

    如果你告诉 VBA 范围是 100,那么循环当然会运行到 100。只需使用 derlign 将您的范围限制为 B 列中的数据量即可。

        Set derlign = Range("B" & Rows.count).End(xlUp)
        'MsgBox ("Dernière ligne " & derlign & " !")
        Set r1 = Range("A2:A" & derlign.Row)
        Set r2 = Range("B2:B" & derlign.Row)
        For N = 2 To r2.Rows.count
            If r2.Cells(N - 1, 1) = r2.Cells(N, 1) Then
               r1.Cells(N, 1) = r1.Cells(N - 1, 1)
            Else
               r1.Cells(N, 1) = r1.Cells(N - 1, 1) + 1
            End If
        Next N
    End Sub
    

    其实我会改成

    Option Explicit
    
    Sub WriteNumbering()
        Dim ws As Worksheet
        Set ws = ThisWorkbook.Worksheets("Sheet1")
    
        Dim LastRow As Long
        LastRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
    
        Dim RefData As Variant 'read REF into array
        RefData = ws.Range("B2:B" & LastRow).Value
    
        Dim NumData As Variant 'read Num into array
        NumData = ws.Range("A2:A" & LastRow).Value
    
        NumData(1, 1) = 1 'start number
    
        Dim iRow As Long
        For iRow = LBound(RefData) + 1 To UBound(RefData) 'loop through array
            If RefData(iRow, 1) = RefData(iRow - 1, 1) Then
                NumData(iRow, 1) = NumData(iRow - 1, 1)
            Else
                NumData(iRow, 1) = NumData(iRow - 1, 1) + 1
            End If
        Next iRow
    
        'write the array back to the cells
        ws.Range("A2:A" & LastRow).Value = NumData
    End Sub
    

    【讨论】:

    • derlign 是一个范围,您需要获取它的行号。
    • @VincentG 好收获!错过了……并修复了!谢谢。
    • 对不起...相同的结果...我忘记了第一行: Range("A2").Value = "1"
    • @Ant00x 查看我的编辑。那应该行得通。我在您的示例数据上对其进行了测试。
    • @Pᴇʜ:感谢您的帮助,但它不起作用......我不明白为什么......如果我在 end sub 之前添加这行给我 100 :MsgBox(“Last行 " & LastRow & " !") 。但在这种情况下是 41
    【解决方案2】:

    要提前退出循环,您可以使用指令“退出”

    If [condition] Then Exit For
    

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2012-05-15
      • 2018-01-16
      相关资源
      最近更新 更多