更快的工作流程

时间:2015-10-15 17:27:54

标签: excel vba excel-vba

我有一个表(表1),包含一大堆井数据(版本,MD,HD等),我想创建另一个表(表2),它只显示井的数据感兴趣的。

我已经设置了使用下拉列表选择井的位置。然后,我希望表2中填入表1中显示的每个迭代的四个值....

我尝试使用vlookup但是当一个井有多个版本时遇到了问题。我也尝试使用高级过滤器。

电子表格的屏幕截图

Screenshot of the spreadsheet

3 个答案:

答案 0 :(得分:0)

让我们使用辅助列来解决这个问题。首先,假设列A将用于表的左侧,以显示找到每个列的行号。

A5将具有以下公式:

=MATCH($C$1,K:K,0)

这显示了Well1首次匹配的行号。然后A6和复制下来将具有公式:

=A5+MATCH(B6,OFFSET(K1,A5,0,COUNT(M:M),1),0)

这使用OFFSET创建一个新范围,从紧接上一个Well1匹配的单元格开始,然后使用MATCH查找出现的行。

现在,A列将始终显示从中提取数据的行号。其余的只是使用INDEX函数从您想要的列中提取。例如,列C中的数据从列L中拉出迭代,并且可以通过公式拉出,在单元格C5中并复制到右侧/下方:

=INDEX(L:L,$A5)

答案 1 :(得分:0)

如果您的数据已正确规范化,那么使用数据透视表可能会更好。这将为您提供按Well ID过滤的选项。

答案 2 :(得分:0)

要使用高级过滤器,您需要创建工作表事件。将其放在您想要数据的工作表的代码中。

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2")) Is Nothing Then
    Dim dataRng As Range
    Dim critRng As Range
    Dim CpyToRng As Range
    Dim cpytoarr() As Variant
    With Worksheets("Sheet1")
        Set dataRng = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown).End(xlToRight))
    End With
    With Me
        .Range("CC1") = .Cells(1, 1).Value
        .Range("CC2") = "'=" & .Cells(2, 1).Value
        Set critRng = .Range("CC1:CC2")
        Set CpyToRng = .Range(.Cells(6, 1), .Cells(6, 1).End(xlToRight))
    End With
    Debug.Print dataRng.Address
    Debug.Print critRng.Address
    Debug.Print CpyToRng.Address

    dataRng.AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=critRng, CopyToRange:=CpyToRng, _
    Unique:=False
    critRng.ClearContents
End If

End Sub

这是如何运作的。这假设数据在Sheet1上并以“A1”开始,A列或最后一行没有空格:

enter image description here

在Sheet2上设置如下:

enter image description here

重要的是,sheet2上的标题行名称与sheet1上的标题相同。

现在,每当表2中A2的值发生变化时,您的下拉列表中的必要数据将显示在第6行下方。