在 table 列中查找值并返回 table 行号 - VBA
Finding value in table column and returning table row number - VBA
背景资料:
我试图在 Table 列中找到一个值,并将其设为 return table 的行号。
table 名称是“Type_K”并且在“DATA”sheet 上,它看起来像这样:
根据用户输入,我想在第二列中找到相同的值,然后在 return table 行中找到相同的值。这将用于“管道成本计算”sheet。
这是用户填写的 table:
Material 列有一个包含 4 个选项的下拉列表,根据该输入,Type 列更改其下拉列表,Wall 和 Size 列也是如此。
对于这个例子,用户选择了:
Material = 铜
类型 = K 型
墙(本例中为N/A)
尺寸 = 1/4
Size 列中的值是我想在 DATA Table(第一个图像的第二列)中找到的值
目前代码检查类型是什么以及return正确的table名称
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 成为 table 行号,然后用它来填充
的最后一行
Worksheets("Pipe Costing").Range("H" & ThisRow).Value = Worksheets("DATA").ListObjects(Copper_Type_ref).DataBodyRange(RowNum, 4).Value
感谢任何帮助!
将输入 sheet 中的当前行作为 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
背景资料:
我试图在 Table 列中找到一个值,并将其设为 return table 的行号。
table 名称是“Type_K”并且在“DATA”sheet 上,它看起来像这样:
根据用户输入,我想在第二列中找到相同的值,然后在 return table 行中找到相同的值。这将用于“管道成本计算”sheet。
这是用户填写的 table:
对于这个例子,用户选择了:
Material = 铜
类型 = K 型
墙(本例中为N/A)
尺寸 = 1/4
Size 列中的值是我想在 DATA Table(第一个图像的第二列)中找到的值
目前代码检查类型是什么以及return正确的table名称
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 成为 table 行号,然后用它来填充
的最后一行Worksheets("Pipe Costing").Range("H" & ThisRow).Value = Worksheets("DATA").ListObjects(Copper_Type_ref).DataBodyRange(RowNum, 4).Value
感谢任何帮助!
将输入 sheet 中的当前行作为 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