【问题标题】:'Do-until' in a table row by row until the first colored cell found in VBA?在表格中逐行“直到”直到在VBA中找到第一个彩色单元格?
【发布时间】:2019-12-07 22:25:49
【问题描述】:

我有一个 7 列的 excel 表格,用户可以放置他们的输入。放置输入后,他们有一个验证宏要运行,它将具有无效值的单元格着色为红色。我想在使用 VBA 宏着色后创建一个关于这些错误的摘要表,但前提是表中有任何彩色单元格。 如果表格范围内的某处至少有一个红色单元格,则应创建此摘要表,否则应弹出一个 MsgBox,告知没有错误。我想创建最简单的方法来做到这一点,如下所示: 问题是我收到了“发现验证错误,请检查错误表”消息,即使我没有红色单元格。

Sub errorListCreation(Sheet1 As Worksheet)
Dim isColored As Boolean
isColored = False
    For Each Acell In Sheet1.Range("A2", Range("K" & Sheet1.usedRange.Rows.Count))
        With Acell
            If Acell.DisplayFormat.Interior.Color = RGB(255, 0, 0) Then
                isColored = True
                Exit For
            End If
        End With
    Next Acell

    If isColored = True Then
        MsgBox "Validation errors found, please check the Errors sheet. "
        For Each errorList In Worksheets
            If errorList.Name = "Errors" Then
                Application.DisplayAlerts = False
                Sheets("Errors").Delete
                Application.DisplayAlerts = True
            End If
        Next
        Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Errors"
    Else: MsgBox "Validation complete, please check the reconciliation sheet."
    End If
End Sub

【问题讨论】:

  • 有什么问题?你的问题到底是什么?
  • 问题是有没有其他方法可以做到这一点?因为我的解决方案不起作用。
  • “不工作”不是有用的错误描述。你能说出你得到哪个错误以及在哪一行?或者您的代码与您的预期相比是什么?那会帮助我们。表格的屏幕截图也可以帮助理解实际问题。
  • 使用阴影等格式为单元格分配第二个值是一种反模式。相反,创建另一个包含该值的列并使用条件格式来反映它。

标签: excel vba for-loop do-while


【解决方案1】:

我建议这样:

Option Explicit

Public Function IsColored(ByVal Rng As Range) As Boolean
    IsColored = (Rng.Interior.Color = RGB(255, 0, 0))
End Function

Public Sub ColorFinder(ByVal ws As Worksheet)
    Dim ErrorFound As Boolean

    Dim InputTable As ListObject
    Set InputTable = ws.ListObjects("Table4") 'probably no good idea to hard code the table name (at least use a meaningful name)

    With InputTable.DataBodyRange
        Dim iRow As Long, iCol As Long
        For iRow = .Rows.Count To 1 Step -1
            For iCol = .Columns.Count To 1 Step -1
                If IsColored(.Cells(iRow, iCol)) Then
                    ErrorFound = True
                    Exit For
                End If
            Next iCol
            If ErrorFound Then Exit For
        Next iRow
    End With

    If ErrorFound Then
        MsgBox "Errors found", vbCritical
    Else
        MsgBox "No errors found", vbInformation
    End If
End Sub

Sub test()
    ColorFinder Worksheets("Sheet1")
End Sub

在下一张纸上

图 1:假设上面的工作表“Sheet1”带有一个 ListObject“Table4”。

你会得到

“发现错误”

【讨论】:

  • 是的,但我没有完整的红色行,只有某些行中的一些单元格。
  • 您能在我下面的帖子中提供建议吗?
  • @Looz 请编辑您的原始问题并显示屏幕截图。
  • 谢谢,请在修改后的问题中找到截图链接
  • 我有一个带有红色单元格的隐藏列 :D 非常感谢您的帮助!
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2022-07-02
  • 1970-01-01
相关资源
最近更新 更多