根据Excel中的订单返回标签和值

时间:2016-05-24 16:41:44

标签: arrays excel sorting

假设我在excel中有一个两列数组,其中第一列是文本,第二列是数字。我想有一个命令,它将返回一个根据第二列中的值排序的数组。我不想使用自定义排序命令,因为我希望能够更新第二列中的数值并自动更新已排序的数组。

1 个答案:

答案 0 :(得分:0)

自动排序的唯一方法是编程...... MACRO。

您可以创建一个按钮并将宏指定给该按钮 要么 您将它放在选择更改事件中,每次单元格更改时都会运行宏。

由你决定。

在下面的代码中,我为一个按钮做了这个:

            Sub btnSort()
                Dim swapped As Boolean      ' Boolean value to check if the values have been swapped
                Dim boolEmpty As Boolean    ' Boolean value to check if the cell value is empty
                Dim tmp1, tmp2 As Variant   ' Temporary variable,which holds temporary value
                Dim numRows As Integer      ' Number of NON-EMPTY rows
                Dim tempArray1 As Variant   ' Holds values in column 1 with certain values
                Dim tempArray2 As Variant   ' Holds values in column 2 with numerica values

                boolEmpty = False 'Give initial value to variable; Assuming that the first checked cell is NOT EMPTY

                'Count the number of cells with actual values in them
                numRows = 0
                ctr = 1
                Do While (boolEmpty <> True)
                    'If the cell value contains something then increment variable numRows
                    If Sheet6.Cells(ctr, 1).Value > 0 Then
                        numRows = numRows + 1
                        boolEmpty = False
                        ctr = ctr + 1
                    Else
                        'if true then exit while loop
                        boolEmpty = True
                    End If
                Loop

                ReDim tempArray1(numRows) ' Re-dimensionalize the array with the appropriate size
                ReDim tempArray2(numRows) ' Re-dimensionalize the array with the appropriate size

                'Fill tempArray1 & 2 with values
                For i = 0 To numRows - 1
                    tempArray1(i) = Sheet6.Cells(i + 1, 1).Value
                    tempArray2(i) = Sheet6.Cells(i + 1, 2).Value
                Next i

                'Set variables
                swapped = True
                ctr = 0

                'If swapped remains TRUE then continue sorting the array
                Do While (swapped)
                    swapped = False
                    ctr = ctr + 1

                    'BUBBLE SORT
                    'Check if next element in array is bigger than the first one.
                    'If TRUE then swap the elements
                    'If FALSE then continue until looking through teh array until done.
                    For i = 0 To numRows - ctr
                        If tempArray2(i) > tempArray2(i + 1) Then
                            tmp1 = tempArray1(i)
                            tmp2 = tempArray2(i)

                            tempArray1(i) = tempArray1(i + 1)
                            tempArray2(i) = tempArray2(i + 1)

                            tempArray1(i + 1) = tmp1
                            tempArray2(i + 1) = tmp2

                            swapped = True
                        End If
                    Next i
                Loop

                'Redisplay the sorted array in excel sheet
                For i = 0 To UBound(tempArray2)
                    Sheet6.Cells(i + 1, 1).Value = tempArray1(i)
                    Sheet6.Cells(i + 1, 2).Value = tempArray2(i)
                Next i
            End Sub

我为一个按钮做的原因是因为如果你这样做,选择更改事件的方式你的excel每次更换单元格时都会不断刷新。但是,有一个解决方法。

在上面的例子中,我使用了冒泡排序,你可以找到很多关于如何在网上理解它的例子。

如果你想让我的代码工作,你将不得不改变我的sheet6.cells(....

您的工作表编号,具体取决于工作簿中的列表位置。

在“使用实际值计算单元格数...”中 您必须将... Cells(ctr,1)更改为找到列表的行和列索引。

希望我没有混淆你。

这是我之前谈到的另一种方式:

            'If value has changed in column 2 then run macro
            Private Sub Worksheet_Change(ByVal Target As Range)
                If Target.Column > 1 And Target.Column < 3 Then
                    MsgBox Target.Column
                End If
            End Sub

此代码需要位于同一张表中。它会检查您更改的值是否实际上在第2列中(Target.Column&gt; 1和Target.Column&lt; 3)您可以更进一步添加Target.row&lt; 10(这意味着,被修改的单元格是第2列,少于第10行)

您可以在其中看到msgbox,您可以将代码“冒泡排序等等”复制并粘贴到其中。

希望这有帮助。