List Excel排序动态列表或使用VBA然后排序

List Excel排序动态列表或使用VBA然后排序,list,sorting,excel,excel-formula,vba,List,Sorting,Excel,Excel Formula,Vba,我使用表2从表1中提取数据 A9中包含以下公式: =(INDEX(sheet1!$G$9:$G$7000,MATCH(0,INDEX(COUNTIF($A$8:A8,sheet1!$G$9:$G$7000),0,0),0)) (它查看G列并取出重复项和空白项) B9有以下公式: =IF(MAX(IF($A9=sheet1!G:G,sheet1!E:E))=MIN(IF($A9=sheet1!G:G,sheet1!E:E)),"Only 1 Entry",MAX(IF($A9=sheet1!G:

我使用表2从表1中提取数据

A9中包含以下公式:

=(INDEX(sheet1!$G$9:$G$7000,MATCH(0,INDEX(COUNTIF($A$8:A8,sheet1!$G$9:$G$7000),0,0),0))
(它查看G列并取出重复项和空白项)

B9有以下公式:

=IF(MAX(IF($A9=sheet1!G:G,sheet1!E:E))=MIN(IF($A9=sheet1!G:G,sheet1!E:E)),"Only 1 Entry",MAX(IF($A9=sheet1!G:G,sheet1!E:E))-MIN(IF($A9=sheet1!G:G,sheet1!E:E)))
=SUMIF(sheet1!$G$9:$G$7000,A9,sheet1!$B$9:$B$7000)
(此项在表2的A列中查找,然后在表1中查找日期、最小值和最大值,以确定某个项目的使用年限)

C9有以下公式:

=IF(MAX(IF($A9=sheet1!G:G,sheet1!E:E))=MIN(IF($A9=sheet1!G:G,sheet1!E:E)),"Only 1 Entry",MAX(IF($A9=sheet1!G:G,sheet1!E:E))-MIN(IF($A9=sheet1!G:G,sheet1!E:E)))
=SUMIF(sheet1!$G$9:$G$7000,A9,sheet1!$B$9:$B$7000)
(本页为第2页中的A列,参考第1页以计算小时数)

问题是,如果我对sheet2上的C列进行排序,什么都不会改变。我认为,因为当它试图过滤它时,动态公式正在将其重新排序,使其回到第1页上的状态。基本上,无论您如何尝试和过滤,列表都保持不变,因为它基于sheet1。我甚至试着对工作表1上的列进行排序,看看工作表2是否会发生变化,但由于工作表2的C列中的数据实际上不存在于工作表1上,因此也不起作用

如何使用现有的动态公式过滤列C甚至B和其他列

我在网上搜索了一个解决方案,但找不到任何有效的方法。如果我不能使用这个动态列表,我想也许我可以用VBA在第2页的A列中创建列表,并使列表成为静态的

我也搜索过VBA来删除重复和空白,但出于某种原因,我找到了一个空白。我找到了一些可以分开但不能同时分开的

Sub MakeUnique()

    Dim vaData As Variant
    Dim colUnique As Collection
    Dim aOutput() As Variant
    Dim i As Long

    'Put the data in an array
    vaData = Sheet1.Range("A5:A7000").Value

    'Create a new collection
    Set colUnique = New Collection

    'Loop through the data
    For i = LBound(vaData, 1) To UBound(vaData, 1)
        'Collections can't have duplicate keys, so try to
        'add each item to the collection ignoring errors.
        'Only unique items will be added
        On Error Resume Next
            colUnique.Add vaData(i, 1), CStr(vaData(i, 1))
        On Error GoTo 0
    Next i

    'size an array to write out to the sheet
    ReDim aOutput(1 To colUnique.Count, 1 To 1)

    'Loop through the collection and fill the output array
    For i = 1 To colUnique.Count
        aOutput(i, 1) = colUnique.Item(i)
    Next i

    'Write the unique values to column B
    Sheet2.Range("A9").Resize(UBound(aOutput, 1), UBound(aOutput, 2)).Value = aOutput

End Sub
此VBA创建一个没有重复项的列表,但保留空白


那么,如何使第2页上的B列和C列可以排序,而A列是从第1页上的数据推导出来的,没有重复项,也没有空白?是否有一种方法可以排序和使用动态公式,或者应该使用VBA进行排序?

此版本的发布代码将在唯一列表中包含空格:

Sub MakeUnique()

    Dim vaData As Variant
    Dim colUnique As Collection
    Dim aOutput() As Variant
    Dim i As Long

    'Put the data in an array
    vaData = Sheet1.Range("A5:A7000").Value

    'Create a new collection
    Set colUnique = New Collection

    'Loop through the data
    For i = LBound(vaData, 1) To UBound(vaData, 1)
        'Collections can't have duplicate keys, so try to
        'add each item to the collection ignoring errors.
        'Only unique items will be added
        If vaData(i, 1) <> "" Then
            On Error Resume Next
                colUnique.Add vaData(i, 1), CStr(vaData(i, 1))
            On Error GoTo 0
        End If
    Next i

    'size an array to write out to the sheet
    ReDim aOutput(1 To colUnique.Count, 1 To 1)

    'Loop through the collection and fill the output array
    For i = 1 To colUnique.Count
        aOutput(i, 1) = colUnique.Item(i)
    Next i

    'Write the unique values to column B
    Sheet2.Range("A9").Resize(UBound(aOutput, 1), UBound(aOutput, 2)).Value = aOutput

End Sub
Sub-MakeUnique()
作为变量的数据
Dim Colas系列独一无二
Dim AOOUTPUT()作为变量
我想我会坚持多久
'将数据放入数组中
vaData=表1.范围(“A5:A7000”).值
'创建新集合
Set colUnique=新集合
'循环浏览数据
对于i=LBound(vaData,1)到UBound(vaData,1)
'集合不能有重复的键,因此请尝试
'将每个项添加到集合中,忽略错误。
'只会添加唯一的项目
如果vaData(i,1)“,则
出错时继续下一步
添加vaData(i,1),CStr(vaData(i,1))
错误转到0
如果结束
接下来我
'调整要写入工作表的数组大小
ReDim AOUT(1到colUnique.Count,1到1)
'循环遍历集合并填充输出数组
对于i=1到colUnique.Count
A输出(i,1)=colUnique.Item(i)
接下来我
'将唯一值写入B列
表2.范围(“A9”)。调整大小(UBound(aoOutput,1),UBound(aoOutput,2))。值=aoOutput
端接头

这部分很好用,谢谢。现在我只需要弄清楚排序部分:)在我对C列中的方程进行排序时,它似乎在顶部留下了一堆“空白”…你是按宏排序吗?为了清理C列中的方程,我在第2页添加了以下内容:=IF(A9=“”,”,SUMIF(Sheet1!$G$9:$G$7000,A9,Sheet1!$B$9:$B$7000))从C9到C500。如果我手动将A排序到Z,效果很好,但是如果我将Z排序到A,结果将在底部结束,在顶部保留空格。我正在尝试创建一个只包含可见数字的动态范围,但尚未使其工作。。然后我想把它也变成VBA。