使用VBA排列值列表(最大到最小)

问题描述 投票:0回答:1

我有一个VBA代码,用于返回完成作业的船员ID,船员完成的工作总数,船员工作的天数,然后返回每天的平均工作数。它们没有特定的顺序,并且所有这些类别在Excel电子表格中彼此相邻。在这些其他类别旁边的列中,我想编写一个VBA代码,根据每天拥有最多工作数的人为每一行分配一个值(1到10,因为有10个工作人员)。

我已经查看了其他代码和建议,但我能找到的只是排序。我不想对它们进行排序,因为我可以在Excel中轻松地对它进行排序,如果我在VBA中为该特定列排序值,它们将不会与其他有关它们的信息对齐。有关如何根据每天平均工作人数最高的人员在相邻列中打印数字1到10来“排名”这些列的任何建议吗?

感谢大家的帮助!

excel vba sorting ranking
1个回答
1
投票

我将此代码从会计应计中删除 - 开票真实的Excel应用程序,它是数据“字段”中的众多种类之一。

你可以做类似的事情。为了使您更清楚地应用:wsBuild是一个命名工作表(在开发人员中,无论工作表名称或位置如何,您都可以直接调用它)。 “twb”只是表明它正在使用本工作簿,因为我正在整合来自多个工作簿的数据(数据导出,在这种情况下为3)。

twbNameCol是在不同函数中找到的供应商名称的列号

twbJobNumberCol是在不同函数中找到的销售订单的列号

twbTot1Col是在不同函数中找到的销售额的列号

如果你想要动态地找到标题,只需选择一个比你的导入模板更高的数字,这个数字可以容纳2个总列标题,一个用于应计,一个用于发票,你可能不需要做这样的事情,因为我从一个系统导出我知道标题名称,或者你可以创建自己的,diff accrual是我想找到位置的最后一列,所以我在那一点打破了循环:

twbTot1Col = 0
twbTot2Col = 0
'First let's define the column positions
    For j = 1 To 50
        If InStr(wsBuild.Cells(1, j), "Totals") > 0 And twbTot1Col = twbTot2Col Then
            'It is the first time
            twbTot1Col = j
        ElseIf InStr(wsBuild.Cells(1, j), "Totals") > 0 And twbTot1Col <> twbTot2Col Then
            twbTot2Col = j
        ElseIf InStr(wsBuild.Cells(1, j), "JobNumber") > 0 Then
            twbJobNumCol = j
        ElseIf InStr(wsBuild.Cells(1, j), "New VAP") > 0 Then
            twbNewVAPCol = j
        ElseIf InStr(wsBuild.Cells(1, j), "New AP") > 0 Then
            twbNewAPCol = j
        ElseIf InStr(wsBuild.Cells(1, j), "Name") > 0 Then
            twbNameCol = j
        ElseIf InStr(wsBuild.Cells(1, j), "Diff Accrual") > 0 Then
            twbDiffCol = j
            j = 100 'Break loop
        Else
            'Do nothing
        End If
    Next j

twbLastRow是数据范围中的最后一行(数据范围是2到LastRow)

它是这样的:

twbLastRow = wsBuild.Cells(Rows.Count, 1).End(xlUp).Row

这是一个排序代码的例子,在这个1,2,3之前有一些列插入步骤,所以我只复制了排序

With wsBuild
'4) Perform 3 line sort
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=.Range(.Cells(2, twbNameCol), .Cells(twbLastRow, twbNameCol)), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

        .Sort.SortFields.Add Key:=.Range(.Cells(2, twbJobNumCol), .Cells(twbLastRow, twbJobNumCol)), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

        .Sort.SortFields.Add Key:=.Range(.Cells(2, twbTot1Col), .Cells(twbLastRow, twbTot1Col)), _
            SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal


         .Sort.SetRange .Range(.Cells(1, 1), .Cells(twbLastRow, twbDiffCol + 2))
         .Sort.Header = xlYes
         .Sort.MatchCase = False
         .Sort.Orientation = xlTopToBottom
         .Sort.SortMethod = xlPinYin
         .Sort.Apply
    End With

如果你看一下这个,你可以按照你想要的方式“排列”你的数据。这种类型是1.供应商然后2.工作号然后3.应计金额然后乐趣开始匹配发票导入与应计。如果您正确定义了排序范围,则不会丢失或隐藏相邻列中的任何数据。我想我正在游说你使用排序。

如果您提供一些代码,答案实际上可能是您的数据类型,插入一个排名列,将排名放入,然后将数据分类回原来的样式。而不是根据特定属性运行一个“排名”的功能(更长......但可行)。干杯,WWC

© www.soinside.com 2019 - 2024. All rights reserved.