2015-02-12 78 views
1

我使用片2拉出的数据片的1Excel中排序的动态列表或使用VBA然后排序

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))) 

(这个看起来在列A Sheet 2上然后查找的日期,Min和Max Sheet 1上,以确定一个特定的项目几岁)

C9具有此式:

=SUMIF(sheet1!$G$9:$G$7000,A9,sheet1!$B$9:$B$7000) 

(这在片2的外观由于塔A和参考SHEET1添加up hours)

问题是,如果我对sheet2上的列C进行排序没有任何变化。我认为,因为当它试图过滤它时,动态公式将它重新排序回到表1上的内容。基本上无论你如何尝试和过滤它,列表都与基于sheet1的列表保持一致。我甚至尝试对表1中的列进行排序以查看表2是否会更改,但是由于表2中C列中的数据实际上不存在于表1中,因此无法工作。

如何过滤列C或甚至B以及其他已有的动态公式?

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

我也搜索过一个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可排序与来自数据被衍生于片材1列A没有重复和空白?有没有办法对动态公式进行排序和使用,还是应该使用VBA来完成?

回答

1

这个版本的发布你的代码将包括唯一列表空白:

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 
+0

这部分的伟大工程,谢谢。现在我只需要弄清楚排序的一部分:)似乎与我在列C中的方程式,当我排序它留下一堆“空白”在顶端...... – DA69 2015-02-13 03:59:43

+0

你是按宏排序? – 2015-02-13 04:00:49

+0

清理列C1中的公式: = IF(A9 =“”,“”,SUMIF(Sheet1!$ G $ 9:$ G $ 7000,A9,Sheet1!$ B $ 9:$ B $ 7000)) 在工作表2上它从C9到C500。如果我手动排序A到Z,它可以正常工作,但如果我将Z排序到A,结果会在底部留下空白处。我正在尝试创建一个动态范围,它只包含可见的数字,但还没有正常工作。然后我想将它变成一个VBA。 – DA69 2015-02-13 04:24:32