如何解决在表列中查找值并返回表行号 - VBA
背景信息:
我试图在 Table 列中找到一个值并让它返回该表的行号。
表名是“Type_K”,在“DATA”表上,看起来像这样:
从用户输入中,我想在第二列中找到相同的值,然后返回表行。这将用于“管道成本计算”表。 这是用户正在填写的表格: Material 列有一个包含 4 个选项的下拉列表,根据输入,Type 列会更改其下拉列表,Wall 和 Size 列也是如此。
对于这个例子,用户选择了:
材料 = 铜
类型 = K 类型
墙(在这种情况下不适用)
尺寸 = 1/4"
大小列中的值是我想在数据表中找到的值(第一张图片的第二列)
当前代码检查类型并返回正确的表名
If Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type K" Then
copper_Type_ref = "Type_K"
ElseIf Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type L" Then
copper_Type_ref = "Type_L"
ElseIf Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type M" Then
copper_Type_ref = "Type_M"
ElseIf Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type DWV" Then
copper_Type_ref = "Type_DWV"
End If
“ThisRow”只是用户输入的行号(即他们正在更改第 4 行中的某些内容,因此 ThisRow=4)。
完整代码为:
Private Sub copper_Data_Fill(ThisRow)
Dim copper_Type_ref As String
Dim RowNum As Long
If Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type K" Then
copper_Type_ref = "Type_K"
ElseIf Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type L" Then
copper_Type_ref = "Type_L"
ElseIf Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type M" Then
copper_Type_ref = "Type_M"
ElseIf Worksheets("Pipe Costing").Range("D" & ThisRow).Value = "Type DWV" Then
copper_Type_ref = "Type_DWV"
End If
'RowNum = Application.Match("F" & ThisRow,Worksheets("DATA").ListObjects(copper_Type_ref).ListColumns(2).DataBodyRange,False).Row
'RowNum = Worksheets("DATA").ListObjects(copper_Type_ref).ListColumns(2).DataBodyRange.Find("F" & ThisRow,xlValues).Row
RowNum = Worksheets("DATA").ListObjects(copper_Type_ref).ListColumn(2).DataBodyRange.Find("F" & ThisRow,xlValues).Index
Worksheets("Pipe Costing").Range("H" & ThisRow).Value = Worksheets("DATA").ListObjects(copper_Type_ref).DataBodyRange(RowNum,4).Value
End Sub
我希望让 RowNum 成为表格行号,然后用它来填充
的最后一行Worksheets("Pipe Costing").Range("H" & ThisRow).Value = Worksheets("DATA").ListObjects(copper_Type_ref).DataBodyRange(RowNum,4).Value
感谢任何帮助!
解决方法
将输入表中的当前行作为 Range
参数传递给您的子程序会更容易:
Private Sub Copper_Data_Fill(ThisRow As Range)
Dim dVal,f As Range,tbl as range
dVal = ThisRow.Columns("D").Value
Select Case dVal
Case "Type K","Type L","Type M","Type DWV"
'get the corresponding listobject data range
Set tbl = Worksheets("DATA").ListObjects(Replace(dVal," ","_")).DataBodyRange
Case Else
Exit Sub 'nothing to do (clear H?)
End Select
Set f = tbl.Columns(2).Find(ThisRow.Columns("F").Value,_
lookat:=xlWhole,LookIn:=xlValues)
If Not f Is Nothing Then
ThisRow.Columns("H").Value = f.Offset(0,2).Value 'col4
Else
ThisRow.Columns("H").Value = "not found"
End If
End Sub
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。