【问题标题】:Adding to a string array alphabetically按字母顺序添加到字符串数组
【发布时间】:2015-07-29 00:07:49
【问题描述】:

我正在寻找一种按字母顺序将字符串(来自单元格)添加到字符串数组的方法。

例如:

string array = {"apple", "banana", "orange"}

添加"cherry":

string array = {"apple", "banana", "cherry", "orange"}

因此,如果我执行sheets(1).range("A1").value = new string array,整个数组将在一个单元格中。

我在网上找到了一个按字母顺序对选定单元格进行排序的功能,但不确定它是否对我有帮助。

Function Alphabetize(vStrings As Variant, separator As String) As String

    Dim v As Variant, vSorted As Variant
    Dim i As Long, j As Long, n As Long
    Dim bDone As Boolean

    For Each v In vStrings
        n = n + 1
    Next
    ReDim vSorted(1 To n)
    ReDim pos(1 To n)
    For Each v In vStrings
         i = i + 1
         vSorted(i) = v
    Next
    For j = 2 To n
         bDone = True
         For i = 2 To n
             If vSorted(i) < vSorted(i - 1) Then
                 v = vSorted(i - 1)
                 vSorted(i - 1) = vSorted(i)
                 vSorted(i) = v
                 bDone = False
             End If
         Next
         If bDone Then Exit For
    Next
    For i = 1 To n
         If vSorted(i) <> "" Then
             If i = 1 Then
                 Alphabetize = separator & vSorted(i)
             Else
                 If vSorted(i) <> vSorted(i - 1) Then Alphabetize = Alphabetize & separator & vSorted(i)
             End If
         End If
    Next
    Alphabetize = Mid$(Alphabetize, 2)
End Function

【问题讨论】:

  • 您从哪里开始填充 vStrings 以及您从哪里获得要添加到其中的 'cherry' 值?

标签: arrays vba excel sorting


【解决方案1】:

如果需要,您可以使用 .NET 库中的 System.Collections.SortedList 类。那就不用担心排序了。

Dim objList As Object
Set objList = CreateObject("System.Collections.SortedList")
objList.Add "apple",  ""
objList.Add "banana", ""
objList.Add "orange", ""
objList.Add "cherry", ""

Dim i As Long
For i = 0 To objList.Count - 1
    Debug.Print objList.GetKey(i)
Next

打印:

apple
banana
cherry
orange

如果您想将这些值组合成一个字符串,只需在循环这些值时将它们连接起来,或者您可以转移到一个数组并使用Join 创建字符串:

ReDim a(objList.Count - 1) As String
Dim i As Long

For i = 0 To objList.Count - 1
    a(i) = objList.GetKey(i)
Next

' Combine strings into the format: {"string1", "string2", "stringN"}
Sheet1.Range("A1").Value = "{""" & Join(a, """, """) & """}"

【讨论】:

  • 这是一个很好的答案。我已经阅读了一些关于使用 .Net 类的信息,并且想了解更多信息,例如哪些是可用的,通常在任何给定的计算机上。你有什么资源可以推荐。
  • @DougGlancy 有一个article on The Scripting Guys blog 可以帮助您入门。我不确定是否有包含 COM 包装器的 .NET 类的完整列表,但该文章应该为您提供一些入门提示。
【解决方案2】:

不清楚 vStrings'cherry' 的声明或赋值在哪里,但这里有一个子调用函数,该函数附加数组并返回一个分隔列表(单个文本值) 到 Sheet1 的 A1。

Sub main()
    Dim string_array As Variant, new_string As String

    string_array = Array("apple", "banana", "orange")
    new_string = "cherry"

    Sheets(1).Range("A1").Value = add_and_alphabetize(string_array, new_string, sDELIM:=Chr(44))

End Sub

Function add_and_alphabetize(vSTR As Variant, sSTR As String, _
         Optional sDELIM As String = ";", Optional bDESC As Boolean = False)
    Dim i As Long, j As Long, vTMP As Variant

    If CBool(Len(sSTR)) Then
        ReDim Preserve vSTR(LBound(vSTR) To UBound(vSTR) + 1)
        vSTR(UBound(vSTR)) = sSTR
    End If

    For i = LBound(vSTR) To UBound(vSTR) - 1
        For j = i To UBound(vSTR)
            If (vSTR(i) < vSTR(j) And bDESC) Or (vSTR(i) > vSTR(j) And Not bDESC) Then
                vTMP = vSTR(j)
                vSTR(j) = vSTR(i)
                vSTR(i) = vTMP
            End If
        Next j
    Next i

    add_and_alphabetize = Join(vSTR, sDELIM)
End Function

我添加了指定分隔符(默认为分号)和更改排序顺序的选项。

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 2013-02-03
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多