【问题标题】:How to sort an array in Excel-VBA?如何在 Excel-VBA 中对数组进行排序?
【发布时间】:2021-05-07 03:08:41
【问题描述】:

我想按降序对声明为 double 的值数组进行排序。

array.Sortarray.Reverse 命令不起作用。

请注意,我想使用嵌入的 VBA 函数对数组进行排序,而不是通过我自己编写的排序算法。

Sub sortiereMesswerte()
  Dim werte(15) As Double
  Dim i As Integer

  Sheets("Eingabe").Select

  'initliaze array
  For i = 0 To 15
    werte(i) = Cells(i + 2, 2)
  Next i

  'Sort Array
  werte.Sort
  werte.Reverse

  Sheets("Ausgabe").Select

  'print array
  For i = 0 To 15
    Cells(i + 2, 2) = werte(i)
  Next i
End Sub

【问题讨论】:

  • 看起来您正在尝试使用 VBA 中不存在的 VB.NET 方法 - 请确保您正在阅读您正在使用的语言的正确文档(当您只需查看 sn-ps,但 MS 文档非常清楚您正在阅读的是哪一个...)
  • 根据这个article你可以使用VBA数组列表但是你必须安装.Net Framework 3.5

标签: excel vba


【解决方案1】:

新的排序功能似乎有效。我尝试了以下代码:

Sub testsort()
    Dim arr1, arr2
    Dim index
    
    ReDim arr1(1 To 10)
    
    For index = 1 To 10
        arr1(index) = Chr(65 + Int(Rnd() * 25))
    Next index
    
    Debug.Print "arr1:  " + Join(arr1, "-")
    arr2 = Application.WorksheetFunction.Sort(arr1, , , True)
    Debug.Print "sort:  " + Join(arr2, "-")
    
End Sub

一次运行的输出如下所示:

arr1:  L-I-K-G-B-G-Y-B-J-J
sort:  B-B-G-G-I-J-J-K-L-Y

请注意,我必须提供第三个参数 (by_col = True) 才能使其工作。它也适用于数字。

我不知道它的性能如何,但它对我来说已经足够好了,并且可能会帮助那些因为很久以前没有解决这个问题而感到沮丧的人。

【讨论】:

  • @chrisneilsen 感谢您指出这一点。如果我将 by_col 设置为 True 而不是 False,它实际上可以工作! False 是默认值。
【解决方案2】:

根据上面的@Storax 评论,您可以使用 ArrayList 对象,但会受到 .net 框架版本的限制,如果您与他人共享工作簿,这可能会成为问题。然后你可以编写如下代码:

Sub sortiereMesswerte()
  Dim werte As Object
  Dim i As Integer

  Set werte = CreateObject("System.Collections.ArrayList")
  Sheets("Eingabe").Select

  'initliaze array
  For i = 0 To 15
    werte.Add Cells(i + 2, 2).Value
  Next i

  'Sort Array
  werte.Sort
  werte.Reverse

  Sheets("Ausgabe").Select

  'print array
  For i = 0 To 15
    Cells(i + 2, 2) = werte(i)
  Next i

End Sub

【讨论】:

    【解决方案3】:

    如果您的 Excel 版本包含新的动态数组,则可以使用新的 SORT 函数

    Sub Demo()
        Dim rng As Range
        Dim v
    
        ' Get Data reference
        Set r = Worksheets("Eingabe").Range("B2:B17")
    
        ' Sort data
        v = Application.WorksheetFunction.Sort(r.Value)
    
        'Return to a sheet
        Worksheets("Ausgabe").Range("B2:B17") = v
    End Sub
    

    也就是说,您也可以直接在工作表上执行此操作。在工作表Ausgabe 单元格B2

    =SORT(Eingabe!"B2:B17")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-25
      • 2018-04-10
      • 2015-06-03
      • 1970-01-01
      • 2020-09-11
      • 2011-06-19
      • 2010-09-15
      相关资源
      最近更新 更多