假设我在excel中有一个两列数组,其中第一列是文本,第二列是数字。我想有一个命令,它将返回一个根据第二列中的值排序的数组。我不想使用自定义排序命令,因为我希望能够更新第二列中的数值并自动更新已排序的数组。
答案 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,您可以将代码“冒泡排序等等”复制并粘贴到其中。
希望这有帮助。