如何将更改推送到已获取和筛选的Excel表

如何将更改推送到已获取和筛选的Excel表,excel,vba,search,filtering,Excel,Vba,Search,Filtering,作为参考,我有一个类似的设置: 基本上我有三张工作表。这是一张原始数据表,里面有一张表格,你知道原始数据。然后是主表,其中包含要过滤的条件,然后是一个过滤表,它利用这两个条件创建一个下拉列表,以便您可以在表上选择要过滤的内容,并将其拉到过滤表以供查看 因此,我的问题是:如果有人对过滤表进行了更改,然后将其推送到原始数据表,我会朝哪个方向看?我在想一些关于 On worksheet change if target is not in row 1, 2, or 3, Sea

作为参考,我有一个类似的设置:

基本上我有三张工作表。这是一张原始数据表,里面有一张表格,你知道原始数据。然后是主表,其中包含要过滤的条件,然后是一个过滤表,它利用这两个条件创建一个下拉列表,以便您可以在表上选择要过滤的内容,并将其拉到过滤表以供查看

因此,我的问题是:如果有人对过滤表进行了更改,然后将其推送到原始数据表,我会朝哪个方向看?我在想一些关于

On worksheet change
    if target is not in row 1, 2, or 3,
        Search rawdata 'This is where I dont know exactly what I'd be doing 
        copy target row to rawdata row

下面是几个不同方法的示例。当然,您需要更改它如何知道数据范围是什么以及要搜索的键等

一旦确定了相关行,就可以根据需要对数据进行更改

以下是基于A1:B12中的一些随机字母,需要匹配A和B的组合

'---Using Range.Find---
'The simplest method is to create a new column in Excel
'The column should use a formula to combine the different columns you want to match on together into a key
'An example would be, to match on column A and B: =A1 & "|" & B1
'You can then use Range.Search to find the match
Sub Example1()
    Dim searchRange As Range, matchedCell As Range

    Set searchRange = Worksheets("Sheet1").Columns("C")

    Set matchedCell = searchRange.Find( _
        what:="c" & "|" & "e", _
        LookIn:=XlFindLookIn.xlValues, _
        lookat:=XlLookAt.xlWhole, _
        MatchCase:=True)

    Debug.Print matchedCell.Address

End Sub

'---Using a keyed collection---
'This method is faster if you need to do the lookups a lot
'It does not need pre-generated keys in a column (unlike method 1)
'Though if you have pre-generated keys it can be optimised a bit by only loading
'the column of Keys into the array rather than all the data
Sub Example2()
    Dim dataRange As Range
    Dim arr
    Dim hashTable As Collection
    Dim i As Long

    Set dataRange = Worksheets("Sheet1").Range("A1:B12")
    arr = dataRange.Value 'load the data into an array

    Set hashTable = New Collection

    For i = LBound(arr, 1) To UBound(arr, 1)
        hashTable.Add i, arr(i, 1) & "|" & arr(i, 2) 'add the row index as the value, and the key as the lookup conditions joined together
        'arr(i,1) etc will need to change depending on how you know which columns are the columns to match on
        'if datatype matters (i.e. "1" <> 1 for your lookup) then do something like
        'Vartype(arr(i,1)) & arr(i,1) & "|" & Vartype(arr(i,2)) & arr(i,2)
    Next i

    'Now for each match you need to do, you can just find the row within dataRange by looking up in the lookupCollection
    'e.g. to find "c|e":
    Debug.Print dataRange.Rows(hashTable("c" & "|" & "e")).Address

End Sub
”---使用Range.Find---
'最简单的方法是在Excel中创建新列
'列应使用公式将要匹配的不同列组合到一个键中
'例如,要匹配A列和B列:=A1&“|”&B1
'然后可以使用Range.Search查找匹配项
子示例1()
Dim searchRange作为范围,matchedCell作为范围
设置搜索范围=工作表(“Sheet1”)。列(“C”)
Set matchedCell=searchRange.Find(_
什么:=“c”&“e”_
LookIn:=XlFindLookIn.xlValues_
lookat:=XlLookAt.xlWhole_
匹配案例:=真)
调试。打印匹配的单元格。地址
端接头
“---使用键控集合---
“如果需要经常查找,这种方法会更快
'它不需要在列中预先生成键(与方法1不同)
“不过,如果您有预生成的密钥,只需加载即可对其进行优化
'数组中的键列,而不是所有数据
子示例2()
变暗数据范围作为范围
暗淡的边缘
Dim哈希表作为集合
我想我会坚持多久
设置数据范围=工作表(“表1”)。范围(“A1:B12”)
arr=dataRange.Value'将数据加载到数组中
Set hashTable=新集合
对于i=LBound(arr,1)到UBound(arr,1)
hashTable.addi,arr(i,1)&“|”&arr(i,2)’将行索引作为值,键作为连接在一起的查找条件
'arr(i,1)等需要根据您如何知道哪些列是要匹配的列而进行更改
'如果数据类型很重要(即查找时使用“1”1),则执行以下操作
'Vartype(arr(i,1))&arr(i,1)&“|”&Vartype(arr(i,2))&arr(i,2)
接下来我
'现在,对于需要进行的每个匹配,只需在lookupCollection中查找数据范围内的行即可
例如,要找到“c | e”:
Debug.Print dataRange.Rows(哈希表(“c”和“|”和“e”))。地址
端接头

我不建议根据事件推动更改。用户可以随意玩东西,而不希望它真的去任何地方。我建议基于按钮点击或其他方式进行更改,因此用户必须积极地将更改提交到基础数据。但我不知道你的模型,所以举办一次活动可能没问题。无论如何,要回答您的问题:您需要有一种方法将过滤器页上更改的行链接回原始行。怎么用?唯一的身份证?请回复更多详细信息,因为目前推荐的方法有点过于笼统。另外,顺便说一句,我从来没有真正理解像chandoo.org链接到的方法那样(尽管如此有效)的必要性。使用内置的过滤数据功能就地过滤数据有什么错?因此,撇开你的不说,这是针对非技术人员的。这样,他们可以做一个简单的排序,并得到他们所需要的信息,因为电子表格本身是巨大的。这纯粹是为了简单。所以我要说的是,用户会选择他们想要的操作系统和应用程序,然后它会为他们过滤掉。(在工作表中,两组数据都在一列中,并且过滤器滚动非常小。)因此,对于如何设置它,有一个节列和一个小节列(分别是列a和列b),这是唯一的,可以搜索。好的,这是有意义的。要提交更改,您需要将唯一标识目标工作表中的行所需的数据加载到内存中,然后在其中搜索以找到目标(如果已排序,则使用二进制搜索)。或者,您可以加载并构造哈希表(键控集合或字典对象)。或者,您可以迭代筛选行并使用Excel Range.Search查找目标行。这对于少量行的更改速度更快,但对于大量行的更改速度较慢。好的,我将开始查看最后一行(Excel Range.Search)。如果在我报告之前你已经准备好了,你可以发布一个搜索sheet1的示例,其中a列与$Target匹配。行$column(1)和b列与$Target匹配。行$column(2)?谢谢你,伙计。我得调整一下以确保它,但这似乎正是我想要的。谢谢!