【问题标题】:Runtime Error on a 2D Bubblesort in Excel VBA arrayExcel VBA数组中二维冒泡排序的运行时错误
【发布时间】:2015-01-14 16:53:11
【问题描述】:

我一直在努力(以及其他一些 Excel 编程网站上的其他人)在 Userform 中获得一个 Combobox,以便按 alpha 顺序对行(来自源电子表格中的两列)进行排序。

理想情况下,我想要一个二维排序,但在这一点上,我会满足于一个可行的。

目前,当下拉组合框时,会读取部分内容(减去不显示且不需要的项目符号):

  • 放大 MRKPayoutPlan
  • 查克 PSERSFuture
  • 查克 PSERS 当前

我想要的是:

  • 查克 PSERS 当前
  • 查克 PSERSFuture
  • 放大 MRKPayoutPlan

第一个顺序源自行在源工作表中出现的顺序。

此时,我收到运行时错误“13”,类型不匹配错误。两个字段都是文本字段(一个是姓氏,另一个是分类代码-我想先按名称排序)。

以下是 VBA 代码的两个相关部分。如果有人能帮我解决这个问题,我会至少买一轮虚拟啤酒。 Excel VBA 不是我最舒服的领域——我可以在其他应用程序中完成此操作,但客户端规范是这一切都必须单独在 Excel 中运行。提前致谢。

Private Sub UserForm_Initialize()
   fPath = ThisWorkbook.Path & "\"
   currentRow = 4

   sheetName = Sheet5.Name
   lastRow = Sheets(sheetName).Range("C" & Rows.Count).End(xlUp).Row


    Dim rngUID As Range
    Dim vList

    Set rngUID = Range("vUID")

    With rngUID
        vList = Application.Index(.Cells, .Parent.Evaluate("ROW(" & .Address & ")"), Array(7, 1))
    End With
   vList = BubbleSort2D(vList, 2, 1)

    With ComboBox1
        .ColumnCount = 2
        .ColumnWidths = "100;100"
        .List = vList
    End With

   PopulateControls
End Sub

Public Function BubbleSort2D(Strings, ParamArray SortColumns())
    Dim tempItem
    Dim a                     As Long
    Dim e                     As Long
    Dim f                     As Long
    Dim g                     As Long
    Dim i                     As String
    Dim j                     As String
    Dim m()                   As String
    Dim n
    Dim x As Long
    Dim y As Long
    Dim lngColumn As Long


    e = 1
    n = Strings
    Do While e <> -1

        For a = LBound(Strings) To UBound(Strings) - 1
            For y = LBound(SortColumns) To UBound(SortColumns)
                lngColumn = SortColumns(y)
                i = n(a, lngColumn)
                j = n(a + 1, lngColumn)
                f = StrComp(i, j)
                If f < 0 Then
                    Exit For
                ElseIf f > 0 Then
                    For x = LBound(Strings, 2) To UBound(Strings, 2)
                        tempItem = n(a, x)
                        n(a, x) = n(a + 1, x)
                        n(a + 1, x) = tempItem
                    Next x
                    g = 1
                    Exit For
                End If
            Next y
        Next a
        If g = 1 Then
            e = 1
        Else
            e = -1
        End If

        g = 0
    Loop
    BubbleSort2D = n
End Function

【问题讨论】:

  • 第二维应该如何排序?所有数据都会保留在它的子向量中吗?
  • 姓氏然后分类(例如 Smith A101、Smith A201、Thompson C100)。尽管由于一个名称最多只能有 4-5 个分类,因此只需对名称进行排序即可 - 只是试图将所有松散的末端捆绑起来,因为 Combobox 需要显示这两个字段。当我使用 UNsorted 数组填充时,一切正常,但大约有 2000 行,这无法满足我们的需要。
  • 您能否编辑您的问题以提供未排序二维数组和已排序二维数组的示例?只是一个 3x3 的小方块?
  • 问题已相应编辑。如前所述,Combobox 已经按照行在工作表中出现的顺序显示了数组。

标签: excel vba multidimensional-array bubble-sort


【解决方案1】:

这是 VBA 中的冒泡排序source

Public Sub BubbleSort(ByRef sequence As Variant, _
        ByVal lower As Long, ByVal upper As Long)

    Dim upperIt As Long
    For upperIt = upper To lower + 1 Step -1

        Dim hasSwapped As Boolean
        hasSwapped = False

        Dim bubble As Long
        For bubble = lower To upperIt - 1

            If sequence(bubble) > sequence(bubble + 1) Then

                Dim t as Variant
                t = sequence(bubble)

                sequence(bubble) = sequence(bubble + 1)
                sequence(bubble + 1) = t
                hasSwapped = True

            End If

        Next bubble

        If Not hasSwapped Then Exit Sub

    Next upperIt

End Sub

请注意,使用变量名来指定它们是什么和做什么而不是单个字母会更容易阅读。

至于 2D 排序。别。分别对每个数组进行排序,然后使用相同的方法对数组数组进行排序。您将需要提供一个抽象来比较列。不要尝试同时对它们进行排序。我想不出这是一个好主意的场景。如果由于某种原因元素可以在 2D 数组中更改其子数组,则将其展平为 1 个数组,对其进行排序并将其拆分回 2D 数组。

老实说,根据我对您具体问题的理解。您正在从一维序列转到一维序列,所以我认为二维数组是不必要的复杂化。

改为使用带有比较语句的修改冒泡排序例程,

 If sequence(bubble) > sequence(bubble +1) Then '...

替换为自定义比较函数

ComboBoxItemCompare(sequence(bubble), sequence(bubble + 1))

如果第一个参数应该与第二个交换,这将返回True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2020-09-13
    • 2010-12-23
    • 1970-01-01
    • 2014-06-10
    • 2021-10-31
    相关资源
    最近更新 更多