【问题标题】:Assigning serial numbers to a specific range in the first column将序列号分配给第一列中的特定范围
【发布时间】:2020-08-28 07:13:57
【问题描述】:

我正在尝试在我的项目中添加一个 vba 部分,它将序列号分配给第一列的彩色范围,但是没有成功。我想出了以下代码:

Private Sub CommandButton1_Click()

    On Error GoTo ErrorHandler
    
    Dim serial, i, EndRow, StartRow As Integer
    Dim row As Range, cell As Range
    
    'Discover the data starting and end rows
    i = 1
    serial = 1
    StartRow = 1
    EndRow = 1

    'Check the first cell of each row for the data-start background colour
    For Each row In ActiveSheet.UsedRange.Rows
        Cells(row.row, 1).Select
        If i < 3 Then
            If Hex(cell.Interior.Color) = "47AD70" And i = 1 Then
                Cells(row.row, 1).Value = Abs(serial)
                StartRow = serial
                serial = serial + 1
                i = 2
            ElseIf Hex(cell.Interior.Color) = "47AD70" And iRow = 2 Then
                Cells(row.row, 1).Value = Abs(serial)
                serial = serial + 1
            ElseIf Hex(cell.Interior.Color) <> "47AD70" And iRow = 2 Then
                EndRow = serial - 1
                i = 3
            End If
        End If
    Next row
    
ErrorHandler:
    If Err.Number <> 0 Then
        Msg = "Error # " & Str(Err.Number) & " was generated by " _
         & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
        MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
    End If
End Sub

变量 i 用作检测颜色范围的标志。

到最后,绿色单元格 A5 到 A22 应该填充数字 1 到 18。变量 StartRow 最终应该被分配值 = 5(彩色范围的起始行),并且 EndRow 应该最终被分配值= 22(彩色范围的结束行。

我的代码生成错误#91,对象变量或未设置块变量。

除了我无法纠正的错误之外,我知道代码本身也不是那么聪明,并且可能有更有效的代码来实现目标。

有人可以提出解决方案甚至更好的代码吗? 非常感谢

【问题讨论】:

    标签: excel vba for-loop


    【解决方案1】:

    我可能不完全理解您要做什么。下面的代码将在 A 列中查找第一个绿色单元格,为该单元格指定序列号 1,然后继续按顺序编号后续绿色单元格。我希望这是你想要的。

    Private Sub CommandButton1_Click()
    
        Const Col       As Long = 4697456           ' = &H47AD70
        
        Dim Ws          As Worksheet
        Dim Rcount      As Long                     ' Row
        Dim R           As Long
        
        Set Ws = ActiveSheet                        ' better = Worksheets("Sheet1")
        With Ws
            Rcount = .UsedRange.Rows.Count
            For R = 2 To Rcount
                ' find the frist occurrence of Col
                If .Cells(R, "A").Interior.Color = Col Then Exit For
            Next R
            
            If R > Rcount Then
                MsgBox "No cells of the specified colour were found.", _
                       vbInformation, "Unuccessful search"
            Else
                Rcount = R - 1
                Do
                    .Cells(R, "A").Value = R - Rcount
                    R = R + 1
                    ' loop until a different cell colour is encountered
                Loop While .Cells(R, "A").Interior.Color = Col
            End If
        End With
    End Sub
    

    请注意,对ActiveSheet 进行更改通常很危险。危险在于用户在错误的工作表处于活动状态时错误地运行代码。因此最好修改上面的代码以通过名称指定预期的工作表。

    【讨论】:

    • 谢谢。第一个答案中的建议解决了它。但是,为了进一步澄清,我希望 A 列中的绿色单元格最终具有序列号 1 到 18;或者绿色单元格在列中持续多长时间;并且最终变量 StartRow 和 EndRow 具有 A 列中第一个和最后一个绿色单元格的行号值。代码在将正确的行号分配给 StartRow 和 EndRow 时存在更多问题。分配行号的行应该是: StartRow = row.row 和 EndRow = row.row - 1 以便它正常工作。
    【解决方案2】:
    1. 请更换
    Cells(row.row, 1).Select
    

    Set cell = cells(row.row, 1)
    cell.Select 'not necessary, but you maybe want seeing what happens during testing...
    

    只选择一个单元格,不会告诉 VBA 这是代码需要的单元格。 :)

    1. 你有一个错字:
    And iRow = 2 Then
    

    它,显然应该是:

    And i = 2 Then
    
    1. 这就是使用EndRow变量的目的。如果它不是为了做某事而使用的。它只在最后接收一个值...

    2. On Error GoTo ErrorHandler 仅当您将On Error Resume Next 放在第一行代码中时才能使用/有意义。否则,将不会捕获任何错误。

    那么,不建议使用rowcell等变量名。它们可能会在调试复杂代码时产生问题...

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2023-01-11
      • 2012-11-06
      • 1970-01-01
      • 2022-11-03
      • 2017-10-22
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多