excel - 查找具有 2 个条件的单元格行
问题描述
是否可以找到具有 2 个条件的行?我正在将调查 anwsers 导入工作表,现在我想找到指定人员的答案,
我需要在工作表 (ImportLimesurvey)中找到具有 2 个指定单元格值的行:
在那一行:
- C 单元格的值必须是该列中的最大值之一(我使用了函数
Application.WorksheetFunction.Max(rng)
)
该值表示填写了多少调查。最高值位于多个答案行中。每次调查的最高值都不同。(例如,如果一项调查有 7 页并且参与者填写了所有页面:该人的最高值为 7,但如果该人未完成该调查,则该值可能是例如 3),所以过滤器最高值是参与者是否完成了整个调查。
- L 单元格的值必须与单元格相同(Worksheets("Dataimport").Range("M2")
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 的新手,所以我试图尽可能具体,但如果您需要任何其他信息,请询问;)
解决方案
首先,Visual Basic 概念性主题是帮助编写“更好”代码的好书。我最鼓励的是使用有意义的变量名。
HighestCount
当您使用诸如or之类的变量名称TargetSheet
而不是诸如a
or之类的名称时,更容易理解您的代码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。
子可以分解如下;
- 使用 with 语句有助于减少两次定义工作表的代码混乱。
- sub 唯一要做的就是为单元格 A7 赋值。为了获取值,它调用函数并将参数分配
TargetAccountNumber
为单元格 M2 中的值。
该功能可以分解为以下步骤;
- 声明所有变量并设置函数的目标工作表。
LastRow
找到 L 列的 来建立我们的 Array 的最大长度和搜索范围。- 循环从第 1 行到第 1 行搜索
LastRow
并比较 L 列的值。如果它与TargetAccountNumber
参数匹配,则 C 列的值和行号存储到数组中。 - 循环完成后,将运行另一个循环以查找最高数字。第一次迭代将始终存储第一行的数据。之后的每次迭代都将存储在 中的值
SurveyCountArray
与当前值进行比较ResultArray(1)
,如果值更大,ResultArray(1)
则使用该值ResultArray(2)
进行更新,并使用行号进行更新。 - 完成第二个循环后,将 Row in
ResultArray(2)
分配给 Sub 写入工作表的函数。
它肯定可以被改进和改进以更快、更有效地工作,特别是如果你有一个非常大的数据集,但这应该有助于你思考如何使用循环和数组来查找数据。
注意:结果可能有重复的行(例如,用户以相同的答案提交了 3 次相同的调查),我没有对此进行测试 - 我认为此代码将返回与所需条件匹配的最高行号,但可以调整以抛出错误或消息,甚至将所有行号写入工作表。
推荐阅读
- python-3.x - 如何允许使用 xlsxwriter 编辑受保护的单元格
- powershell - PowerShell - Slack API - 房间历史记录 - 带有 x-www-form-urlencoded 参数的发布方法
- android - 减小 APK 大小 - 仅为特定平台构建 so 文件
- matlab - 如何将实验数据拟合到 ODE(michaelis-menten)方程以获得常数?
- c++ - 结构尚未写入 C++ 中的二进制文件
- arduino - 如何编辑库以与 Arduino DUE 一起使用?
- php - 使用 LinkedIn API 发布文章时如何修复 Unknown dereferenced type ARRAY
- angular - 有没有办法在 Angular 5 中为文件上传创建拖放输入?
- ajax - 沙箱中 createCustomerProfile 端点的 Accept.js AJAX POST 失败
- macos - microk8s 不受信任的仪表板 - 如何验证证书