Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Excel在计数/删除重复项时复制/排序数据_Sorting_Excel_Duplicates_Vba - Fatal编程技术网

Sorting Excel在计数/删除重复项时复制/排序数据

Sorting Excel在计数/删除重复项时复制/排序数据,sorting,excel,duplicates,vba,Sorting,Excel,Duplicates,Vba,好吧,我已经找了又找,找不到我要找的东西 我有一个工作簿,我基本上想做的是从某些范围(表1-E4:E12、E14:E20、I4:I7、I9:I12、I14:I17和I19:I21)中提取条目,并将它们放在表2中的单独列表中。然后,我希望Sheet2上的新列表按条目在Sheet1上出现的次数排序,并显示金额 很明显,从我上面列出的范围可以看出,这个示例的lol要小得多,只是在试图找出如何描述所有内容时遇到了困难,并且认为一个图像会有所帮助 基本上,我尝试使用VBA(通过点击按钮初始化更新)从Sh

好吧,我已经找了又找,找不到我要找的东西

我有一个工作簿,我基本上想做的是从某些范围(表1-E4:E12、E14:E20、I4:I7、I9:I12、I14:I17和I19:I21)中提取条目,并将它们放在表2中的单独列表中。然后,我希望Sheet2上的新列表按条目在Sheet1上出现的次数排序,并显示金额

很明显,从我上面列出的范围可以看出,这个示例的lol要小得多,只是在试图找出如何描述所有内容时遇到了困难,并且认为一个图像会有所帮助

基本上,我尝试使用VBA(通过点击按钮初始化更新)从Sheet1复制数据,并将所有范围放入Sheet2中的一个列表中,该列表按它在Sheet1上出现的次数排序,然后按字母顺序排序

如果需要更好的描述,请发表评论并让我知道,我总是很讨厌描述像这样的东西

提前谢谢


另一个细节:我不能让它搜索特定的东西,因为表1范围内的数据可能会改变。一切都必须是动态的。

这里有一个可能的解决方案,我已经为您准备好了。你要求做的事情变得相当复杂。以下是我到目前为止的情况: 选项显式

Sub test()
    Dim items() As String
    Dim itemCount() As String
    Dim currCell As Range
    Dim currString As String
    Dim inArr As Boolean
    Dim arrLength As Integer
    Dim iterator As Integer
    Dim x As Integer
    Dim fullRange As Range
    Set fullRange = Range("E1:E15")
    iterator = 0

    For Each cell In fullRange 'cycle through the range that has the values
        inArr = False
        For Each currString In items 'cycle through all values in array, if
        'values is found in array, then inArr is set to true
            If currCell.Value = currString Then 'if the value in the cell we
            'are currently checking is in the array, then set inArr to true
                inArr = True
            End If
        Next
        If inArr = False Then 'if we did not find the value in the array
            arrLength = arrLength + 1
            ReDim Preserve items(arrLength) 'resize the array to fit the new values
            items(iterator) = currCell.Value 'add the value to the array
            iterator = iterator + 1
        End If
    Next
    'This where it gets tricky. Now that you have all unique values in the array,
    'you will need to count how many times each value is in the range.
    'You can either make another array to hold those values or you can
    'put those counts on the sheet somewhere to store them and access them later.
    'This is tough stuff! It is not easy what you need to be done.
    For x = 1 To UBound(items)

    Next

End Sub

到目前为止,这所做的只是将唯一值放入数组中,以便您可以计算每个值在该范围内的次数。

我从这些数据开始

并使用以下代码将其读入数组,对数组进行排序,计算重复值,然后将结果输出到sheet2

Sub Example()
    Dim vCell As Range
    Dim vRng() As Variant
    Dim i As Integer

    ReDim vRng(0 To 0) As Variant

    Sheets("Sheet2").Cells.Delete
    Sheets("Sheet1").Select

    For Each vCell In ActiveSheet.UsedRange
        If vCell.Value <> "" Then
            ReDim Preserve vRng(0 To i) As Variant
            vRng(i) = vCell.Value
            i = i + 1
        End If
    Next

    vRng = CountDuplicates(vRng)

    Sheets("Sheet2").Select
    Range(Cells(1, 1), Cells(UBound(vRng), UBound(vRng, 2))) = vRng
    Rows(1).Insert
    Range("A1:B1") = Array("Entry", "Times Entered")
    ActiveSheet.UsedRange.Sort Range("B1"), xlDescending
End Sub

Function CountDuplicates(List() As Variant) As Variant()
    Dim CurVal As String
    Dim NxtVal As String
    Dim DupCnt As Integer
    Dim Result() As Variant
    Dim i As Integer
    Dim x As Integer
    ReDim Result(1 To 2, 0 To 0) As Variant

    List = SortAZ(List)

    For i = 0 To UBound(List)
        CurVal = List(i)

        If i = UBound(List) Then
            NxtVal = ""
        Else
            NxtVal = List(i + 1)
        End If

        If CurVal = NxtVal Then
            DupCnt = DupCnt + 1
        Else
            DupCnt = DupCnt + 1
            ReDim Preserve Result(1 To 2, 0 To x) As Variant

            Result(1, x) = CurVal
            Result(2, x) = DupCnt

            x = x + 1
            DupCnt = 0
        End If
    Next
    Result = WorksheetFunction.Transpose(Result)
    CountDuplicates = Result
End Function

Function SortAZ(MyArray() As Variant) As Variant()
    Dim First As Integer
    Dim Last As Integer
    Dim i As Integer
    Dim x As Integer
    Dim Temp As String

    First = LBound(MyArray)
    Last = UBound(MyArray)

    For i = First To Last - 1
        For x = i + 1 To Last
            If MyArray(i) > MyArray(x) Then
                Temp = MyArray(x)
                MyArray(x) = MyArray(i)
                MyArray(i) = Temp
            End If
        Next
    Next

    SortAZ = MyArray
End Function
子示例()
调暗vCell作为范围
Dim vRng()作为变量
作为整数的Dim i
ReDim vRng(0到0)作为变量
表(“表2”)。单元格。删除
图纸(“图纸1”)。选择
对于ActiveSheet.UsedRange中的每个vCell
如果vCell.Value为“”,则
ReDim将vRng(0到i)保留为变量
vRng(i)=vCell.值
i=i+1
如果结束
下一个
vRng=重复计数(vRng)
图纸(“图纸2”)。选择
范围(单元格(1,1),单元格(UBound(vRng),UBound(vRng,2))=vRng
第(1)行。插入
范围(“A1:B1”)=数组(“输入”、“输入次数”)
ActiveSheet.UsedRange.Sort Range(“B1”),xls
端接头
函数CountDuplicates(列表()作为变量)作为变量()
像弦一样暗淡的曲线
作为字符串的Dim NxtVal
Dim DupCnt作为整数
Dim Result()作为变量
作为整数的Dim i
作为整数的Dim x
重拨结果(1到2,0到0)作为变量
列表=索塔兹(列表)
对于i=0到UBound(列表)
曲线=列表(i)
如果i=UBound(列表),则
NxtVal=“”
其他的
NxtVal=列表(i+1)
如果结束
如果CurVal=NxtVal,则
DupCnt=DupCnt+1
其他的
DupCnt=DupCnt+1
ReDim保留结果(1到2,0到x)作为变量
结果(1,x)=曲线
结果(2,x)=DupCnt
x=x+1
DupCnt=0
如果结束
下一个
结果=工作表函数。转置(结果)
countreplices=结果
端函数
函数SortAZ(MyArray()作为变量)作为变量()
首先将Dim设置为整数
最后变暗为整数
作为整数的Dim i
作为整数的Dim x
作为字符串的Dim Temp
First=LBound(MyArray)
Last=UBound(MyArray)
对于i=从第一个到最后一个-1
对于x=i+1到最后
如果MyArray(i)>MyArray(x),那么
Temp=MyArray(x)
MyArray(x)=MyArray(i)
MyArray(i)=温度
如果结束
下一个
下一个
SortAZ=MyArray
端函数
最终结果:


好的,午饭后我会看一下,看能不能从那里拿到。感谢您的快速回复午餐前一小时哈哈,brainfart,您可以使用Dim itemcount(),但永远不要使用它。。。这是为空循环中需要的内容做准备吗?是的,我想做一些事情,对每个元素进行计数并将计数粘贴到数组中,但保持两个数组同步,就像另一个数组中的值的键变为粘滞一样。这就是为什么我认为您可以使用字典或将计数粘贴在工作表的某个位置来保持它的整洁。excels VBA可以使用多维数组吗?如果可以的话,这似乎会更容易。(即,在主循环中,如果不在数组中,则向数组添加条目;如果在数组中,则存储增量num,则类似于项(x,y)其中x是条目,y是计数。是的,这叫做字典。我对它们不太熟悉,它们可能很难处理,但这里有一个到MSDN的例子,关于它们,这里有一个使用一个的例子:太棒了,谢谢。我会做一些小的调整,让它把信息准确地放在我想要的地方做我需要的!谢谢,我没有对最终结果进行排序或添加列标题。添加应该很容易。如果您对任何代码正在做什么有疑问,我很乐意解释它或返回并添加注释。我没有对此进行任何测试,但如果您有大量不同的数据要输出到r,可能会更快ange并让excel对其排序,然后将其读入。SortAZ代码只是执行一个冒泡排序,速度并不那么快。它不做的一件事是首先按数量对数据进行排序。(使用示例,它会先对B列进行排序,然后在数量内对a列进行排序,即在最终结果图像中,a列的顺序为c、d、a、B、e)如果这是可能的(这不是一个问题,我可以处理,只是把评论放在那里,如果其他人用这个答案作为例子,他们意识到)再次感谢,现在一切都完成了,你的代码做了劳动,然后我添加了代码来移动排序的数据,并将其拆分为两个偶数列,填充颜色和边框等。