Mes données est cette CSI [40%], CSEL [50%], LDN [10%] dans une cellule séparée par une virgule. Quelqu'un peut-il m'aider avec Excel VBA code qui triera des pourcentages dans l'ordre décroissant et fournira-moi de la production comme suit: CSEL [50%], CSI [40%], LDN [10%]. P>
3 Réponses :
Je pense que le moyen le plus simple est de créer une colonne d'assistance où vous extrayez la valeur numérique. En supposant que vos données commencent dans A1, écrivez une formule dans la colonne B comme avec ceci, vous pouvez facilement trier les données. P> P>
Cela le fera pour vous.
Ajoutez le code ci-dessous dans un nouveau module dans VBA, puis appelez la formule dans une cellule adjacente à votre cellule avec les valeurs. p>
donc dans l'exemple Ci-dessous, vos valeurs d'origine sont dans la colonne Public Function SortByInternalNumber(ByVal strText As String, ByVal strDelimiter As String)
Dim arrValues() As String, strValue As String, i As Long, lngNumber As Long, arrNumbers() As String
Dim strNumber As String, lngMaxNumber As Long, lngMaxIndex As Long, strResult As String
Dim bFound As Boolean, arrMaxValues() As Long, lngIndex As Long, strMaxValue As String
Dim strThisValue As String
Application.Volatile
' Split up the initial string with all of the values.
arrValues = Split(strText, strDelimiter)
For i = 0 To UBound(arrValues)
strValue = Trim(arrValues(i))
strNumber = Replace(Replace(Split(strValue, "[")(1), "%", ""), "]", "")
ReDim Preserve arrNumbers(i)
arrNumbers(i) = strNumber
Next
' Now process all of the numbers in the descending order.
Do While 1 = 1
lngMaxNumber = -1
bFound = False
For i = 0 To UBound(arrNumbers)
If arrNumbers(i) <> "" Then
lngNumber = CLng(arrNumbers(i))
If lngMaxNumber < lngNumber Then
lngMaxNumber = lngNumber
lngMaxIndex = i
End If
bFound = True
End If
Next
If Not bFound Then Exit Do
lngIndex = -1
' Retrieve all of the values that are of the same value as the current max.
For i = 0 To UBound(arrNumbers)
If arrNumbers(i) <> "" Then
If CLng(arrNumbers(i)) = lngMaxNumber Then
lngIndex = lngIndex + 1
ReDim Preserve arrMaxValues(lngIndex)
arrMaxValues(lngIndex) = i
End If
End If
Next
strMaxValue = ""
' Now do the same thing as above but instead of descending, do ascending.
For i = 0 To UBound(arrMaxValues)
strThisValue = Trim(arrValues(arrMaxValues(i)))
If strMaxValue > strThisValue Or strMaxValue = "" Then
strMaxValue = strThisValue
lngMaxIndex = arrMaxValues(i)
End If
Next
strResult = strResult & ", " & strMaxValue
arrNumbers(lngMaxIndex) = ""
Loop
If strResult <> "" Then
strResult = Mid(strResult, 3)
End If
SortByInternalNumber = Trim(strResult)
End Function
peut essayer une autre alternative
Sub testsort() Dim txt As String, txt2 As String, Arr As Variant Dim Nums() As Long, NumSort() As Long, i As Integer, k As Integer txt = "CSI [40%], CSSEl [50%], LDN [10%], ABC [40%],ZXH[30%]" Arr = Split(txt, ",") ReDim Nums(LBound(Arr) To UBound(Arr)) ReDim NumSort(LBound(Arr) To UBound(Arr)) For i = LBound(Arr) To UBound(Arr) Spos = InStr(1, Arr(i), "[") Epos = InStr(1, Arr(i), "%") If Spos > 0 And Epos > Spos Then Nums(i) = Val(Mid(Arr(i), Spos + 1, Epos - Spos - 1)) Else Nums(i) = 0 End If Next i For i = LBound(Arr) To UBound(Arr) NumSort(i) = LBound(Arr) For k = LBound(Arr) To UBound(Arr) If Nums(i) < Nums(k) Or (Nums(i) = Nums(k) And k < i) Then NumSort(i) = NumSort(i) + 1 End If Next Debug.Print Arr(i), Nums(i), NumSort(i) Next For i = LBound(Arr) To UBound(Arr) ' rank For k = LBound(Arr) To UBound(Arr) If NumSort(k) = i Then txt2 = txt2 & Arr(k) & "," Exit For End If Next k Next i If Len(txt2) > 0 Then txt2 = Left(txt2, Len(txt2) - 1) 'delete last comma Debug.Print txt2 End Sub
Nous urgent i> besoin de voir votre tentative de codage.
Merci pour votre réponse rapide. Malheureusement, je ne sais pas comment aborder cela d'où ma demande si quelqu'un peut m'aider à coder cela
Bien que je sache comment trier les nombres en ordre décroissant, mais quand il est préfixé avec ce nom, je ne sais pas comment gérer cela.
@MickMackusa Merci pour votre réponse rapide. Malheureusement, je ne sais pas comment aborder cette demande si quelqu'un peut m'aider à coder cela.Bien que je sache comment trier les nombres en ordre décroissant, mais quand il est préfixé avec ce nom, je ne sais pas comment gérer cela ... Je suis au milieu d'un projet qui nécessite cela .. des chances que vous pourriez m'aider monsieur?
Combien de colonnes y a-t-il en outre la colonne avec le texte et les percents?
@ user11060139 Il n'y a pas de colonnes en dehors de cette colonne, mais je veux appliquer cette opération sur plusieurs rangées avec chaque cellule ayant un maximum de 7 valeurs. Donc, par exemple. La CSEL [40%], CSSEL [50%], LDN [10%]. La 2e rangée au sein d'une donnée cellulaire peut être des données que csel [20%], CSEL [50%], LDN [10%], ABC [20%] et un ... donc ma dernière sortie dans une colonne supplémentaire suivante à Orginal aura toutes ces valeurs triés par pourcentage dans l'ordre de descente ainsi que le texte apposé avec eux
@ user11060139 Dans certains cas, les valeurs peuvent être CSI [0%], CSEL [100%] ---> La sortie requise est CSSEL [100%], CSI [0%]