微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在表列中查找值并返回表行号 - VBA

如何解决在表列中查找值并返回表行号 - VBA

背景信息:

我试图在 Table 列中找到一个值并让它返回该表的行号。

表名是“Type_K”,在“DATA”表上,看起来像这样:

enter image description here

用户输入中,我想在第二列中找到相同的值,然后返回表行。这将用于“管道成本计算”表。 这是用户正在填写的表格:

enter image description here

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?