J'ai une feuille Excel qui contient des chaînes et des nombres. Toutes les chaînes que je recherche ont un trait de soulignement ("_"), qui est mon délimiteur. Cependant, certaines chaînes ont le délimiteur plusieurs fois. Par exemple:
'Dim arr As Variant
Dim i As Long
Dim filterRange As Range
Dim delimiterItem As String 'was variant
Dim a As Range
delimiterItem = "_"
Set filterRange = FindAll(Worksheets(newSheetName).UsedRange)
For i = filterRange.Rows.Count To 2 Step -1
'arr = Split(Cells(i, 1), delimiterItem)
'For j = LBound(arr) To UBound(arr)
If Split(filterRange.Cells(i, 1).Text, delimiterItem)(0) <> Split(filterRange.Cells(i - 1, 1).Text, delimiterItem)(0) Then
Range(filterRange.Cells(i, 1).EntireRow, filterRange.Cells(i, 1).EntireRow).Insert
End If
'Next j
Next i
D'autres chaînes avec un seul délimiteur fonctionnent à merveille. Mais ici, avec deux délimiteurs, "in" et "out" ne sont pas différenciés, car le délimiteur n'est trouvé qu'une seule fois. Comment trouver CHAQUE délimiteur dans une chaîne donnée?
Mon objectif avec ce code est de différencier les plages et de copier et coller ces différentes plages dans leurs propres feuilles de calcul individuelles. De plus, je ne peux pas coder en dur des cellules ou des chaînes, car les noms de chaînes sont susceptibles de changer, ainsi que la taille des plages.
Mon code:
text_in_00 text_in_01 text_out_00 text_out_01
3 Réponses :
Utilisez la fonction suivante pour obtenir un décompte du nombre de fois que Char apparaît dans votre chaîne, puis utilisez une construction de sélection de cas, faites n'importe quoi, en fonction du décompte.
Public Function CountChars(ByVal Source As String, ByVal Char As String) As Long
CountChars = Len(Source) - Len(Replace(Source, Char, vbNullString))
End Function
Créez une fonction qui renvoie le Nième index d'une sous-chaîne dans une autre:
Public Function NthIndexOf(ByVal needle As String, ByVal haystack As String, ByVal n As Long) As Long
Dim currentN As Long
Dim currentIndex As Long
Do
currentIndex = InStr(currentIndex + 1, haystack, needle, vbTextCompare)
currentN = currentN + 1
Loop Until currentIndex = Len(haystack) Or currentN = n Or currentIndex = 0
NthIndexOf = currentIndex
End Function
Vous pouvez maintenant obtenir le NthIndexOf ("_", "text_in_00", 2) code> et obtenez 8 . Si vous essayez d'obtenir le 3ème index de "_" , la sortie sera 0.
Si vous voulez la sous-chaîne entre chacun "délimiteur", vous devez alors Fractionner puis parcourir le tableau . Ce que vous comptez faire de chaque sous-chaîne n'est cependant pas clair, mais vous devriez avoir tous les outils dont vous avez besoin pour faire tout ce que vous faites maintenant.
delimiterItem = "_"
Set filterRange = FindAll(Worksheets(newSheetName).UsedRange)
For i = filterRange.Rows.Count To 2 Step -1
If Split(InStrRev(filterRange.Cells(i, 1).Text, delimiterItem))(0) <> Split(InStrRev(filterRange.Cells(i - 1, 1).Text, delimiterItem))(0) Then
Range(filterRange.Cells(i, 1).EntireRow, filterRange.Cells(i, 1).EntireRow).Insert
End If
Next i
Quel devrait être le résultat attendu et quel est le résultat actuel?
Vous pouvez vérifier la taille du tableau généré par
Splitpour voir combien il y a de délimiteurs.La sortie attendue devrait être capable de différencier le fait que les deux exemples que j'ai donnés sont différents en ce qui concerne "text_in_" et "text_out_". Celles-ci devraient aller sur deux feuilles différentes, mais elles vont toutes les deux sur la même feuille, car il ne trouve que le premier délimiteur.
Qu'entendez-vous par «aller sur une feuille différente»? Pour le moment, vous insérez simplement des lignes.
InStrRevdocs.microsoft.com/en-us/office/vba/language/reference/... pour trouver le dernier trait de soulignement (s'il y en a un), puis vérifiez la chaîne à gauche de cette positionLe code suivant copie et colle les plages dans une feuille différente.
Si
filterRangen'est pas une plage contiguë (si elle a plusieurs zones), vous ne pouvez pas la boucler comme ça.