Как отсортировать массив в Range - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть массив чисел в таблице Excel, которые я пытаюсь отсортировать (все числа> 60), используя пользовательскую функцию vba, и я хочу вернуть результат в виде диапазона в том же листе Excel.

Я получаю ошибку значения, когда запускаю эту функцию в Excel. Я не совсем уверен, откуда эта ошибка, поскольку я новичок в VBA. Буду очень признателен за некоторые рекомендации по решению этой проблемы.

Массив Excel

Column A
200
50
23
789

Function trial(number As Range)
    Dim cell As Range
    Dim savearray() As Variant
    Dim d As Long

    For Each cell In Range("a3:a6").Cells
        If cell.Value > 60 Then
            d = d + 1
            ReDim Preserve savearray(1 To d)
            savearray(1, d) = cell.Value
            trial = savearray
        End If
    Next cell
End Function

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Я чувствую, что вы, возможно, захотите вместо того, чтобы вернуть отсортированный массив , и только затем приведите результаты к Range


  1. Сначала мы создадимFunction для сортировки нашего массива

    Private Function BubbleSort(ByRef from() As Variant) As Variant()
    
       Dim i As Integer, j As Integer
       Dim temp As Variant
    
       For i = LBound(from) To UBound(from) - 1
           For j = i + 1 To UBound(from)
               If from(i) < from(j) Then
                   temp = from(j)
                   from(j) = from(i)
                   from(i) = temp
               End If
           Next j
       Next i
    
       BubbleSort = from ' returns sorted array
    
    End Function
    
  2. Затем мы создаем простую процедуру "Range replacer"

    Private Sub replace_with_sorted(ByVal which As Range)
    
       Dim arr() As Variant
       arr = Application.Transpose(which)
       arr = BubbleSort(arr)
    
       which = Application.Transpose(arr)
    
    End Sub
    
  3. Таким образом, вызов будет выглядеть следующим образом:

    Private Sub test()
        replace_with_sorted Range("A1:A4")
    End Sub
    

Это, конечно, дает ожидаемый результат:

enter image description here


EDIT : только что заметил, что вы хотите отсортировать только значения больше 60. В этом случае просто заполните массив значениями больше 60 и используйте то же приложение.

Private Sub test()
  Dim arr() as Variant: arr = Application.Transpose(Range("A1:A4"))
  Dim above60() as Variant
  Dim i as Integer, j as Integer: j = 0

  For i = LBound(arr) To UBound(arr)
         If arr(i) > 60 Then
            ReDim Preserve above60(j)
            above60(j) = arr(i)
            j = j + 1
         End If
  Next i

  ReDim arr()
  arr = BubbleSort(above60) 
  ' returns sorted array, do whatever u want with it _
   (place it in whatever range u want, not defined in ur question)


End Sub
0 голосов
/ 08 апреля 2019

На вашем Sub есть немного работы.Однако, чтобы помочь вам, ниже приведен способ динамического построения массива:

d = 0
For Each cell In Range("A3:A1000")
    If cell.Value > 60 Then
        If d = 0 Then
            ReDim savearray(0 To 0)
        Else
            ReDim Preserve savearray(0 To UBound(savearray) + 1)
        End If
        savearray(d) = cell.Value
        d = d + 1
    End If
Next cell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...