gpt4 book ai didi

excel - 在 excel vba 中,将最后一个字符视为数字,对字符串进行排序的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-02 21:27:21 37 4
gpt4 key购买 nike

我有一个包含字符串值的数组,我想知道对其进行排序的最佳方法,但我需要将最后一个字符视为数字。

这是一个例子:如果我将值 IRF2BP2K10、IRF2BP2K1 和 IRF2BP2K2 作为数组中的第一个、第二个和第三个元素,我该如何对它们进行排序,以便我的数组可以排列为 {IRF2BP2K1, IRF2BP2K2, IRF2BP2K10} 而不是 {IRF2BP2K1, IRF2BP2K10, IRF2BP2K2} ?

我尝试了下面的基本代码,但最终得到了第二种情况,其中 IRF2BP2K10 在 IRF2BP2K2 之前排序,因为该算法仅考虑字符串:

For currentitem = 1 To lastitem

For nextitem = currentitem + 1 To lastitem

If Array(currentitem) > Array(nextitem) Then

Temp = Array(currentitem)
Array(currentitem) = Array(nextitem)
Array(nextitem) = Temp

End If

Next nextitem

Next currentitem

有人问我,所以这里有更多信息:并非所有项目在数字前都以“K”结尾。

这里是示例的一些其他值,我没有将它们写在数组中,因此更容易可视化:

(this list is the result using my code)
IRF2BP2KICMVCRE1
IRF2BP2KICMVCRE10
IRF2BP2KICMVCRE2
IRF2BP2KIERT2CRE1
IRF2BP2KIERT2CRE10
IRF2BP2KIERT2CRE11
IRF2BP2KIERT2CRE2
IRF2BP2KO1
IRF2BP2KO2


this is what i was trying to get:
IRF2BP2KICMVCRE1
IRF2BP2KICMVCRE2
IRF2BP2KICMVCRE10
IRF2BP2KIERT2CRE1
IRF2BP2KIERT2CRE2
IRF2BP2KIERT2CRE10
IRF2BP2KIERT2CRE11
IRF2BP2KO1
IRF2BP2KO2

我是否需要一种算法来将数组“currentitem”的每个字符串位置与数组“nextitem”的相同位置进行比较?并且,如果它们都相等,则将长度较大的项目放在长度较小的项目之后? [这样我就可以将 IRF2BP2K2 排序在 IRF2BP2K10 之前的位置,因为它们都共享相同的初始字符串“IRF2BP2K”,并且仅在最后一个字符串上有所不同(一个有“2”,另一个有“10”)]

提前致谢!

最佳答案

编辑 GetFormattedArray() 函数以“正确”格式化数组元素最后一位数字

我认为你必须首先正确格式化你的数组元素,然后进行排序

例如,您可以使用以下函数返回一个格式正确的数组

Function GetFormattedArray(originalArray() As String)
ReDim formattedArray(LBound(originalArray) To UBound(originalArray)) As String
ReDim ipos(LBound(originalArray) To UBound(originalArray)) As Long
Dim ielem As Long, iChar As Long, maxChar As Long
Dim strng As String
Const zeros As String = "0000000000"


For ielem = LBound(originalArray) To UBound(originalArray)
strng = originalArray(ielem)
iChar = 1
Do While IsNumeric(Mid(strng, Len(strng) - iChar, 1))
iChar = iChar + 1
Loop
ipos(ielem) = iChar
If iChar > maxChar Then maxChar = iChar
Next


For ielem = LBound(originalArray) To UBound(originalArray)
strng = originalArray(ielem)
formattedArray(ielem) = Left(strng, Len(strng) - ipos(ielem)) & Format(Right(strng, ipos(ielem)), Left(zeros, maxChar))
Next

GetFormattedArray = formattedArray
End Function

你的“main”可以利用如下:

Sub main()
Dim myArray(1 To 3) As String, myFormattedArray() As String
Dim currentItem As Long, nextItem As Long, lastItem As Long
Dim tempStrng As String

myArray(1) = "IRF2BP2K10"
myArray(2) = "IRF2BP2K1"
myArray(3) = "IRF2BP2K2"

myFormattedArray = GetFormattedArray(myArray)

lastItem = UBound(myFormattedArray)
For currentItem = LBound(myArray) To lastItem

For nextItem = currentItem + 1 To lastItem

If myFormattedArray(currentItem) > myFormattedArray(nextItem) Then

tempStrng = myFormattedArray(currentItem)
myFormattedArray(currentItem) = myFormattedArray(nextItem)
myFormattedArray(nextItem) = tempStrng

End If

Next nextItem
Next currentItem

End Sub

关于excel - 在 excel vba 中,将最后一个字符视为数字,对字符串进行排序的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578801/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com