我正在尝试修改此链接上此站点上找到的代码。
Return multiple rows of data in vba
我需要查看A和B列中的信息,然后从C列到H提取基于A和B的匹配记录。
由于工作在多个日期进行,因此将有多个匹配项。
要学习和理解正在发生的事情,我试图一次构建一列代码。到目前为止,我没有错误,但是我收到的只是J2中的值1000。我没有收到4172633414。而且,我不知道J2是否具有来自单元格A2或C2的值。仅给出一个1000的值,而不是遍历A和B列中的所有条目。在现实生活中,A和B列具有124条记录,C列至H列有8,673个条目可供选择。
我希望我与编码尝试的距离不会太远。发布电子表格信息是一个挑战,因此我希望它是可读的。预先谢谢你。
列A和C具有标题CNumber。 B和D是JobNumber。通过H分别是小时,单位,日期,分支。这是我必须使用的东西的简短缩写。
import pyspark.sql.functions as f
correctNegativeDiff = f.udf(lambda diff: 0 if diff < 0 else diff, LongType())
df = df.withColumn('time_diff_1', correctNegativeDiff(df.time_diff_1))\
.withColumn('time_diff_2', correctNegativeDiff(df.time_diff_2))\
.withColumn('time_diff_3', correctNegativeDiff(df.time_diff_3))
以下是我正在寻找的非常简短的结果。由于CNumber 1000在A和B列中的JobNumber 4172633414以上。他在C和D中具有2个匹配的条目,以及下面的相关信息。 CNumber 1002的JobNumber为1463149151,下面有3个匹配的条目。
CNumber JobNumber CNumber JobNumber Hours Units Date Branch
1000 4172633414 1000 1955126105 575 100 7/19/2018 3
1002 1463149151 1000 1955126105 600 144 7/20/2018 3
1004 1955126105 1000 1955126105 200 2.5 6/25/2018 3
1005 90999997 1000 4172633414 575 675 7/9/2018 3
1007 3965310303 1000 4172633414 100 5 7/10/2018 3
1008 1463149151 1002 381134312 300 46 6/29/2018 3
1011 3163689368 1002 382309308 575 88 8/22/2018 3
1012 3965310303 1002 1013397112 600 139 9/21/2018 3
1013 1955126105 1002 1463149151 300 71 6/29/2018 3
1016 1463149151 1002 1463149151 575 60 7/2/2018 3
1017 1463149151 1002 1463149151 375 77 7/5/2018 3
1018 1463149151 1004 1955126105 575 7.25 6/25/2018 3
CNumber JobNumber Hours Units Date Branch
1000 4172633414 575 675 7/9/2018 3
1000 4172633414 100 5 7/10/2018 3
1002 1463149151 300 71 6/29/2018 3
1002 1463149151 575 60 7/2/2018 3
1002 1463149151 375 77 7/5/2018 3
1004 1955126105 575 7.25 6/25/2018 3
1004 1955126105 575 5 6/26/2018 3
1005 90999997 575 6/25/2018 3
1005 90999997 250 6/26/2018 3
答案 0 :(得分:0)
您错过了一个循环。另外,我更喜欢获取数据并在内存中使用它,而不是来回地传递到工作表中。试试看:
显式选项
Sub MultiLookup()
将arrClientJob设置为变体 Dim arrJobInfo作为变体 变暗arrResult作为变体
Dim lngLastRow如长 Dim intClient为整数 Dim intJobInfo为整数 将Dim intCol转换为整数
一切都在一张纸上
On Error Resume Next
lngLastRow = Sheets("TestJobs").Range("A:A").Find( _
What:="*", After:=Sheets("TestJobs").Range("A1"), _
MatchCase:=False, _
LookAt:=xlPart, LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Row
If Err <> 0 Then
lngLastRow = 0
Err.Clear
End If
If lngLastRow > 1 Then
arrClientJob = Sheets("TestJobs").Range("A2").Resize(lngLastRow - 1, 2).Value
Else
MsgBox "No client data, exiting", vbOKOnly
End If
lngLastRow = Sheets("TestJobs").Range("C:C").Find( _
What:="*", After:=Sheets("TestJobs").Range("C1"), _
MatchCase:=False, _
LookAt:=xlPart, LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Row
If Err <> 0 Then
lngLastRow = 0
Err.Clear
End If
If lngLastRow > 1 Then
arrJobInfo = Sheets("TestJobs").Range("C2").Resize(lngLastRow - 1, 6).Value
Else
MsgBox "No ClientJob info found, exiting", vbOKOnly
End If
ReDim arrResult(LBound(arrJobInfo, 2) To UBound(arrJobInfo, 2), 1 To 1)
For intClient = LBound(arrClientJob, 1) To UBound(arrClientJob, 1)
For intJobInfo = LBound(arrJobInfo, 1) To UBound(arrJobInfo, 1)
If arrClientJob(intClient, 1) = arrJobInfo(intJobInfo, 1) _
And arrClientJob(intClient, 2) = arrJobInfo(intJobInfo, 2) Then
If arrResult(LBound(arrResult, 1), LBound(arrResult, 2)) > "" Then
ReDim Preserve arrResult(LBound(arrResult, 1) To UBound(arrResult, 1), _
LBound(arrResult, 2) To UBound(arrResult, 2) + 1)
End If
For intCol = LBound(arrJobInfo, 2) To UBound(arrJobInfo, 2)
arrResult(intCol, UBound(arrResult, 2)) = arrJobInfo(intJobInfo, intCol)
Next intCol
End If
Next intJobInfo
Next intClient
Sheets("TestJobs").Range("J1").Resize(UBound(arrResult, 2) - LBound(arrResult, 2) + 1, _
UBound(arrResult, 1) - LBound(arrResult, 1) + 1).Value = WorksheetFunction.Transpose(arrResult)
结束子