【问题标题】:Comparing Cells in a variable number of Columns比较可变数量列中的单元格
【发布时间】:2017-07-25 17:53:16
【问题描述】:

所以我被要求比较图表中的数据,其中列数可以是可变的,目前最多 20,但我被告知可能会改变,所以我希望尽可能保持动态。

目标是确保一行中的所有单元格都包含完全相同的字符串,或者是空白的。因此,如果有五列,其中三列的数据为“Good”,而另外两列为空白,那就没问题了。

图表将始终从左上角开始,并且始终具有标题行和行名称。

我以为我会将每个单元格与每行中的第一个单元格进行比较,但我似乎无法弄清楚如何比较可变单元格。

我对使用 VBA 很陌生,完全是自学的,所以我可能在这里走错了路。

这是我的示例代码,我知道我需要做几个 Do 循环才能让它工作,但我想先让这部分工作。

Sub Row_Checker()

    Dim Col_Count As Integer
    Dim I As Integer


    Range("a1").Select
    Range(Selection, Selection.End(xlToRight)).Select


    Col_Count = Application.WorksheetFunction.CountA(Selection)


    Selection.End(xlToRight).Select
    ActiveCell.Offset(1, 1).Range("A1").Select

    For I = 2 To Col_Count
        If ("B" & (ActiveCell.Row)) = ("B" & (ActiveCell.Row).Offset(0, I) then


End Sub

【问题讨论】:

  • 当出现不匹配时您希望它做什么/当同一行中的所有列都有空白或相同时您希望它做什么?
  • 另外,您从第 2 列开始 - 您想忽略 A 列吗?每一行都应该是一个特定的值吗?就像A1 中的值应该与第 1 行中的所有其他值一样?还是它们都可以是随机值,只需要每行的值相同?
  • 另外,第一行是没有空格的标题行吗?如果不是,如果第一行中有空格,您的 col_count 变量可能具有不正确的值。我认为这是因为您开始在第 2 行进行迭代,但只是想仔细检查。
  • 我希望只标记行,或者通过添加带有某种标签的另一列,或者只是突出显示给定的行以便可以查看它们。我将忽略 A 列,因为那将是该行的标签。它们可能是每行不同的值,但每一行都应该具有相同的值。第 1 行是 Haader 行,不会有空格。
  • 我将更新我的答案,让它突出显示不匹配的行。如果下面的答案对您有帮助,请告诉我。

标签: excel vba multiple-columns


【解决方案1】:

我将针对更高效的代码提出一些建议。我还将帮助您编写循环。

首先,始终尽可能避免使用select。它效率低下,使代码更难阅读,更容易出错。在这里,我没有选择,而是将行的第一列的值放入名为 val1 的变量中,然后循环遍历其他列,将它们的值放入名为 valn 的变量中。

由于可能缺少数据,我使用 find 函数查找填充的最低行,然后将其分配给变量 lRow

对于下一部分,您必须在循环中执行循环。在外部循环中,您将遍历行,在内部循环中,您将遍历列。因此,您将转到一行,遍历所有列,然后转到下一行并执行相同的操作。

您可以使用cells(I,J) 在循环中的不同单元格中移动。这是循环的强大部分。

如果单元格值匹配或为空白,您可以填写您想要发生的事情,以及如果它们不匹配,您想要它做什么。

另外,请确保将任何 sheet1 更改为您正在使用的实际工作表名称。

见以下代码:

Sub row_checker()

    Dim Col_Count As Integer
    Dim lRow As Integer
    Dim I As Integer
    Dim J As Integer
    Dim val1 As String
    Dim valn As String
    Dim output As String



    Col_Count = Application.WorksheetFunction.CountA(Rows(1))

    lRow = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row

        For I = 2 To lRow
            For J = 2 To Col_Count
            val1 = Cells(I, 1).Value
            valn = Cells(I, J).Value
                If val1 = valn Or valn = Empty Then
                Else: Cells(I, J).Interior.Color = 65535
                End If
            Next J
        Next I

End Sub

恭喜你自学成才。我也是 100% 自学 VBA 和编程。我不是专家,但在此过程中我学到了很多东西。我分享的是一些我花了很长时间才学会的东西。祝您好运,如果您还有其他问题,请告诉我。

【讨论】:

  • 这似乎正是我想要的,感谢您的建议!
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2014-11-28
  • 2016-02-02
相关资源
最近更新 更多