Ich möchte ein Array oder die Dateien aus einem Dateisystem-Ordner so sortieren, wie wir es erwarten würden, wenn sie von einem Menschen sortiert würden. Was ich letztendlich zu erreichen versuche, ist ein Makro, das Bilder aus einem Ordner aufnimmt und sie in das Word-Dokument einfügt, mit Text über jedem, um zu identifizieren, was es repräsentiert, hier benutze ich Schritte für einen Leitfaden und es ist wichtig, dass Schritt 2 vor Schritt kommt 100;Word VBA Natural Sorting
Einrichten meines Test-Sub;
Sub RunTheSortMacro()
Dim i As Long
Dim myArray As Variant
'Set the array
myArray = Array("Step-1", "Step-2", "Step-10", "Step-15", "Step-9", "Step-20", "Step-100", "Step-8", "Step-7")
'myArray variable set to the result of SortArray function
myArray = SortArray(myArray)
'Output the Array through a message box
For i = LBound(myArray) To UBound(myArray)
MsgBox myArray(i)
Next i
End Sub
Dann ist die einzige/beste Sortierfunktion, die ich fand, wirklich nur gut für Zahlen;
Function SortArray(ArrayIn As Variant)
Dim i As Long
Dim j As Long
Dim Temp
'Sort the Array A-Z
For i = LBound(ArrayIn) To UBound(ArrayIn)
For j = i + 1 To UBound(ArrayIn)
If ArrayIn(i) > ArrayIn(j) Then
SrtTemp = ArrayIn(j)
ArrayIn(j) = ArrayIn(i)
ArrayIn(i) = SrtTemp
End If
Next j
Next i
SortArray = ArrayIn
End Function
Diese Funktion gibt das Array als; Step-1, Step-10, Step-100, Step-15, Step-2, Step-20, Step-7, Step-8, Step-9
aber ich wollen; Step-1, Step-2, Step-7, Step-8, Step-9, Step-10, Step-15, Step-20, Step-100
dachte ich mit StrComp (ArrayIn (i), ArrayIn (j), vbBinaryCompare/vbTextCompare) wäre ein Weg zu gehen, aber sie scheinen auf die gleiche Weise zu sortieren. Wenn es einfacher ist, gehe ich nur die Array-Route, weil ich keine Möglichkeit finden konnte, die Eingabedateien zu sortieren;
Set objFSO = CreateObject("Scripting.Filesystemobject")
Set Folder = objFSO.GetFolder(FolderPath)
For Each image In Folder.Files
ImagePath = image.Path
Selection.TypeText Text:=Left(image.Name, Len(image.Name) - 4)
Selection.TypeText Text:=vbCr
'Insert the images into the word document
Application.Selection.EndKey END_OF_STORY, MOVE_SELECTION
Application.Selection.InlineShapes.AddPicture (ImagePath)
Application.Selection.InsertBreak 'Insert a pagebreak
Next
Also wollte ich den Dateinamen und Pfad in zwei Arrays, die ich natürlich sortieren könnte;
Set objFiles = Folder.Files
FileCount = objFiles.Count
ReDim imageNameArray(FileCount)
ReDim imagePathArray(FileCount)
icounter = 0
For Each image In Folder.Files
imageNameArray(icounter) = (image.Name)
imagePathArray(icounter) = (image.Path)
icounter = icounter + 1
Next
aber ich kann keinen Hinweis auf natürliche Sortierung in VBA finden.
Aktualisierung, zusätzliche Details;
Ich habe nicht über die A und B nach Zahlen nachgedacht und alles, was ich suche, stimmt überein, was "natürliche Sortierung" ist; 1,2,3, A, B, C; Apple < 1A < 1C < 2. Regex könnte gut sein So habe ich das in einem Python-Skript erreicht;
import os
import re
def tryint(s):
try:
return int(s)
except:
return s
def alphanum_key(s):
""" Turn a string into a list of string and number chunks.
"z23a" -> ["z", 23, "a"]
"""
return [ tryint(c) for c in re.split('([0-9]+)', s) ]
def sort_nicely(l):
""" Sort the given list in the way that humans expect.
"""
l.sort(key=alphanum_key)
files = [file for file in os.listdir(".") if (file.lower().endswith('.png')) or (file.lower().endswith('.jpg'))]
files.sort(key=alphanum_key)
for file in sorted(files,key=alphanum_key):
stepname = file.strip('.jpg')
print(stepname.strip('.png')
Für VBA habe ich gefunden, dass diese;
Geben Sie mir die numerische Sortierung, aber nicht die alphabetische, also 1B vor 1A sortiert.
Es sollte ausreichen, wenn Sie nicht die Array-Einträge direkt vergleichen, hat aber eher zwei temporäre Variablen, die 'enthalten Ersetzen Sie (ArrayIn (i), "Step-", "") 'und' Replace (ArrayIn (j), "Step-", "") '. Dann vergleichen Sie nur die Zahlen, die Sie mit dem gewünschten Ergebnis verlassen sollten. – LocEngineer
Ich möchte, dass es allgemeiner ist, "Schritt" ist die Art und Weise, wie meine Bilder derzeit beschriftet sind, aber sie könnten "Schritt" sein oder sogar einen Buchstaben nach der Nummer enthalten; Schritt 7a. –
Dann müssen Sie Beispiele für einige Varianten angeben und auch, was Sie bei diesen Varianten als "natürliche Sortierung" betrachten würden. Vielleicht kann ein Regex helfen. – LocEngineer