首页 > 解决方案 > 查找具有 2 个条件的单元格行

问题描述

是否可以找到具有 2 个条件的行?我正在将调查 anwsers 导入工作表,现在我想找到指定人员的答案,
我需要在工作表 (ImportLimesurvey)中找到具有 2 个指定单元格值的行:

在那一行:

该值表示填写了多少调查。最高值位于多个答案行中。每次调查的最高值都不同。(例如,如果一项调查有 7 页并且参与者填写了所有页面:该人的最高值为 7,但如果该人未完成该调查,则该值可能是例如 3),所以过滤器最高值是参与者是否完成了整个调查。

M2=我需要回答的人的账号

必须将正确的行粘贴到 (Worksheets("Dataimport").Range("A7")

这是我当前的代码:

Dim g As Range
Dim rng As Range
Set rng = Worksheets("ImportLimesurvey").Range("C:C")

d = Application.WorksheetFunction.Max(rng)

With Worksheets("ImportLimesurvey").Range("L:L")
    Set g = .Find(Worksheets("Dataimport").Range("M2"), LookIn:=xlValues)
    g.Activate
End With
e = Range("C" & (ActiveCell.Row))
If e = d Then
ActiveCell.EntireRow.Copy _
Destination:=Worksheets("Dataimport").Range("A7")
End If

这里的问题是他找到了具有正确帐号的行,但 C 值的答案并不总是最高的。它(逻辑上)只选择具有该帐号的第一行。那么我怎样才能找到符合这两个条件的行呢?

提前致谢

PS 我是 VBA 的新手,所以我试图尽可能具体,但如果您需要任何其他信息,请询问;)

标签: excelvbafindcriteria

解决方案


首先,Visual Basic 概念性主题是帮助编写“更好”代码的好书。我最鼓励的是使用有意义的变量名。

HighestCount当您使用诸如or之类的变量名称TargetSheet而不是诸如aor之类的名称时,更容易理解您的代码b


你的问题的答案是肯定的。

我会写这样的东西:

Option Explicit

Public Function HighestSurveyRow(ByVal TargetAccountNumber As Long) As Long

    Dim ImportLimeSurveySheet As Worksheet
    Set ImportLimeSurveySheet = ThisWorkbook.Sheets("ImportLimeSurvey")
    
    Dim LastRow As Long
    Dim TargetRow As Long
    Dim SurveyCountArray As Variant
    Dim ArrayCounter As Long
    
    With ImportLimeSurveySheet
        ArrayCounter = 1
        LastRow = .Cells(.Rows.Count, 12).End(xlUp).Row
        ReDim SurveyCountArray(1 To LastRow, 1 To 2)
        For TargetRow = 1 To LastRow
            If .Cells(TargetRow, 12).Value = TargetAccountNumber Then
                SurveyCountArray(ArrayCounter, 2) = TargetRow
                SurveyCountArray(ArrayCounter, 1) = .Cells(TargetRow, 3).Value
                ArrayCounter = ArrayCounter + 1
            End If
        Next TargetRow
    End With
    
    Dim ResultArray(1 To 2) As Variant
    Dim ArrayElement As Long
    
    For ArrayElement = 1 To UBound(SurveyCountArray, 1)
        If SurveyCountArray(ArrayElement, 1) > ResultArray(1) Then
            ResultArray(1) = SurveyCountArray(ArrayElement, 1)
            ResultArray(2) = SurveyCountArray(ArrayElement, 2)
        End If
    Next ArrayElement
    
    HighestSurveyRow = ResultArray(1)

End Function

Sub FindRowForSurveyResults()
 
    With ThisWorkbook.Sheets("DataImport")
        .Range("A7").Value = HighestSurveyRow(.Range("M2").Value)
    End With

End Sub

它分为 aFunction和 a Subroutine。该函数执行大部分代码并返回行号。Sub 调用此函数并将此返回值写入“DataImport”上的单元格 A7。

子可以分解如下;

  1. 使用 with 语句有助于减少两次定义工作表的代码混乱。
  2. sub 唯一要做的就是为单元格 A7 赋值。为了获取值,它调用函数并将参数分配TargetAccountNumber为单元格 M2 中的值。

该功能可以分解为以下步骤;

  1. 声明所有变量并设置函数的目标工作表。
  2. LastRow找到 L 列的 来建立我们的 Array 的最大长度和搜索范围。
  3. 循环从第 1 行到第 1 行搜索LastRow并比较 L 列的值。如果它与TargetAccountNumber参数匹配,则 C 列的值和行号存储到数组中。
  4. 循环完成后,将运行另一个循环以查找最高数字。第一次迭代将始终存储第一行的数据。之后的每次迭代都将存储在 中的值SurveyCountArray与当前值进行比较ResultArray(1),如果值更大,ResultArray(1)则使用该值ResultArray(2)进行更新,并使用行号进行更新。
  5. 完成第二个循环后,将 Row inResultArray(2)分配给 Sub 写入工作表的函数。

它肯定可以被改进和改进以更快、更有效地工作,特别是如果你有一个非常大的数据集,但这应该有助于你思考如何使用循环和数组来查找数据。

注意:结果可能有重复的行(例如,用户以相同的答案提交了 3 次相同的调查),我没有对此进行测试 - 我认为此代码将返回与所需条件匹配的最高行号,但可以调整以抛出错误或消息,甚至将所有行号写入工作表。


推荐阅读