【问题标题】:Populate one dimensional array without looping填充一维数组而不循环
【发布时间】:2016-09-15 18:34:29
【问题描述】:

以下代码行将分配一个数组作为一维sortedArr = WorksheetFunction.Transpose(lstIssues1.List)。这行代码将数组分配为二维arrIssues = Table.ListColumns(Table.ListColumns(strNumber).Range.column).DataBodyRange

对于上面的每一行,我称之为冒泡排序函数。但它在一个或另一个错误取决于我是否放了

If Arr(i) > Arr(j) Then ...

或者

If Arr(i, 1) > Arr(j, 1) Then ...

我可以循环填充arrIssues。但我想知道是否可以将其填充为一维数组而无需循环。

更新

这是我遇到问题的代码

Private Sub cmdRemove_Click()
Dim SortedArr() As Variant
    With lstPrevious
        If .ListIndex = -1 Then Exit Sub
        For i = .ListCount - 1 To 0 Step -1
            If .Selected(i) = True Then
                lstAdditional.AddItem .List(i)
                .RemoveItem (i)
            End If
        Next i
    End With
ReDim SortedArr(lstAdditional.ListCount - 1)
    SortedArr = Application.Transpose(lstAdditional.List) 'ERROR Type Mismatch
    Call BubbleSort(SortedArr)
    Me.lstAdditional.List = SortedArr
    txtFocus.SetFocus
End Sub

Public Sub BubbleSort(Arr)
Dim strTemp As String
Dim lngMin As Long
Dim lngMax As Long
    lngMin = LBound(Arr)
    lngMax = UBound(Arr)
    For i = lngMin To lngMax
        For j = i + 1 To lngMax
            If Arr(i) > Arr(j) Then
                strTemp = Arr(i)
                Arr(i) = Arr(j)
                Arr(j) = strTemp
            End If
        Next j
    Next i
End Sub

奇怪的是,我在另一个用户窗体中使用了相同的逻辑并且它可以工作。抱歉,不清楚。

【问题讨论】:

  • 也许这就是您要找的东西? VBA (Excel) Initialize Entire Array without Looping
  • 谢谢,但我需要从一个范围内输入不同的值。只是想在没有循环的情况下做到这一点。但我可能最终会循环。
  • 循环不是坏事 ;-)
  • 两种可能的解决方案,如果我理解正确的话。 1:转置二维数组(如果数组不大于转置的上限,具体取决于您的 Excel 版本)。或2:检查数组中有多少维,然后应用适当的排序公式。
  • 人们有什么反对突然循环的?输入For foo = 1 to bar 真的比在 SO 上写一个问题需要更长的时间吗?

标签: arrays excel vba


【解决方案1】:

对于上述每一行,我都调用了冒泡排序函数。但它的错误取决于我是否放 If Arr(i) > Arr(j) Then ... 或 If Arr(i, 1) > Arr(j, 1) Then ...

ij 的值不正确,因此会出错。我猜你会收到Subscript out of range error

这是重现您遇到的错误的简单方法。

Sub Sample()
    Dim i As Long, j As Long, k As Integer
    Dim MyAr As Variant

    MyAr = Range("A1:A5").Value

    For i = LBound(MyAr) To UBound(MyAr)
        For j = LBound(MyAr) To UBound(MyAr)
            If MyAr(j, 1) > MyAr(j + 1, 1) Then
                k = MyAr(j, 1)
                MyAr(j, 1) = MyAr(j + 1, 1)
                MyAr(j + 1, 1) = k
            End If
        Next
    Next
End Sub

正确的方法是循环到UBound(MyAr) - 1

Sub Sample()
    Dim i As Long, j As Long, k As Integer
    Dim MyAr As Variant

    MyAr = Range("A1:A5").Value

    For i = LBound(MyAr) To (UBound(MyAr) - 1)
        For j = LBound(MyAr) To (UBound(MyAr) - 1)
            If MyAr(j, 1) > MyAr(j + 1, 1) Then
                k = MyAr(j, 1)
                MyAr(j, 1) = MyAr(j + 1, 1)
                MyAr(j + 1, 1) = k
            End If
        Next
    Next
End Sub

【讨论】:

  • 感谢您的回复。我为我的问题添加了更新。
  • 您的编辑没有意义..您在哪里使用If Arr(i) > Arr(j) Then ...If Arr(i, 1) > Arr(j, 1) Then ... 我的回答是基于此
  • 我在一个名为 BubbleSort 的子例程中的单独模块中使用它。我试图将列表框的内容放入一个数组中,然后将该数组传递给BubbleSort 子例程。我在上面添加了排序例程。
  • lngMin = LBound(Arr) 更改为 lngMin = LBound(Arr) - 1 和类似的 lngMax = UBound(Arr)-1
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2022-01-06
  • 1970-01-01
  • 2020-09-11
  • 2021-04-21
相关资源
最近更新 更多