按字母顺序将字符串添加到字符串数组中

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在寻找一种方法,将单元格中的字符串按字母顺序添加到一个字符串数组中。

例如:

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

1
你在哪里首先填充vStrings,并且你从哪里获取“cherry”值以添加到其中? - user4039065
2个回答

3

如果你想要,可以使用.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类的内容,并且想要了解更多,比如哪些类通常在任何给定的计算机上可用。您有什么资源可以推荐吗? - Doug Glancy
@DougGlancy 在 The Scripting Guys 博客上有一篇文章可以帮助你入门。我不确定是否有一个包含 COM 包装器的 .NET 类的全面列表,但那篇文章应该会给你一些入门的提示。 - Bond

0

目前还不清楚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

我已添加选项以指定分隔符字符(默认为分号)并更改排序顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接