2016-06-17 10 views
1

Ich habe an einem VBA-Makro gearbeitet, das die Werte eines Einheitsvektors für jede ausgewählte Linie in der SolidWorks Schnittstelle exportiert, und ich möchte den Wert der Einheit sortieren Vektor, bevor es in Excel geschrieben wird. Ich muss den Excel-Bereich B2 bis D2 sortieren (B2 repräsentiert Teil i des Einheitsvektors, C2 repräsentiert Teil j und D2 repräsentiert Teil k), und der Bereich hängt von der Anzahl der ausgewählten Zeilen ab. Jede ausgewählte Zeile repräsentiert einen Vektor und jeder Vektor repräsentiert eine Zeile in Excel.Sortieren von Daten nach Spaltenwerten mit Excel VBA, absteigend und aufsteigend

Ich möchte sie nach Spalte D sortieren, und dann möchte ich sie mit dem maximalen Wert in Zelle D2, den Mindestwert in Zelle D3, sortieren und es von dort aufsteigend gehen. Es würde zuerst aufsteigen und dann von der zweiten Reihe absteigen.

Also, wenn es vier ausgewählten Linien, würde die D-Säule wie folgt aussehen:

-0,99221 -1 -0,99789 -0,99664

Derzeit sieht es wie folgt aus:

Excel screenshot

Aber es würde nicht wissen, wie viele Zeilen zuerst sortiert werden mussten. Hier ist der entsprechende Code:

Derzeit gibt mir der Code den Fehler 1004. Ich denke, es ist etwas Kleines, das ist falsch, aber ich bin mir nicht sicher. Wie bestelle ich es in der oben beschriebenen Reihenfolge nach Spalte D?

Private Function WriteToExcel(startRow As Integer, data As Variant, Optional label As String = "") As Boolean 

    'get the results into excel 

    With xlWorkbook.ActiveSheet 
     .Cells(startRow + 2, 2).Value = data(0) 
     .Cells(startRow + 2, 3).Value = data(1) 
     .Cells(startRow + 2, 4).Value = data(2) 
    End With 
End Function 

Der obige Code ist die Funktion zum Schreiben der Daten in Excel; es ist sehr relevant. Dies geschieht alles in SolidWorks API, so dass die Syntax ein bisschen anders ist.

Antwort

0

Keine der geposteten Zeilen in Ihrer Frage gab mir einen Fehler, außer für die Zeile mit Ihrer benutzerdefinierten Funktion WriteToExcel (die Sie nicht in Ihrem Codebeispiel enthalten und daher ich für irrelevant halte).

Also, wenn Sie einen Fehler in dieser Funktion haben, sollte der obige Code einwandfrei funktionieren.

Für die Sortierung würde ich empfehlen, dass Sie die Spalte D aufsteigend sortieren und dann die Zeile der sortierten Tabelle (mit dem Maximum in Spalte D) vom Ende der Tabelle nach oben verschieben. Die folgende sub tut genau das:

Option Explicit 

Public Sub SortIt() 

Dim lngLastRow As Long 

With ThisWorkbook.Worksheets(1) 
    lngLastRow = .Cells(.Rows.Count, "D").End(xlUp).Row 
    With .Sort 
     .SortFields.Clear 
     .SortFields.Add Key:=Range("D2:D" & lngLastRow), _ 
      SortOn:=xlSortOnValues, Order:=xlAscending 
     .SetRange Range("A1:D" & lngLastRow) 
     .Header = xlYes 
     .Apply 
    End With 
    .Range("A2:D" & lngLastRow).Copy Destination:=Range("A3") 
    .Range(.Cells(lngLastRow + 1, 1), .Cells(lngLastRow + 1, 4)).Cut _ 
     Destination:=Range("A2") 
End With 

End Sub 

Beachten Sie, dass der obige Code in der Tabelle auf Blatt 1 zu sein, wird davon ausgegangen Wenn das nicht der Fall ist, dann sollten Sie den Code anpassen. Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben oder es irgendwelche Probleme gibt.

Bearbeiten: Geändert Kopieren Sie den Befehl zu Ausschneiden.

+0

Hallo Ralph, Die Logik sieht gut aus und ich habe es in meinen Code integriert und auch früher im Text aufgerufen, aber die Excel-Datei wird leer angezeigt, wenn ich sie ausführe. Es ist erwähnenswert, dass ich jeden Vektor 1, 2, 3 in der A-Spalte beschreibe. Ich habe auch die WriteToExcel-Funktion in meinem vorherigen Post bearbeitet, da es sehr relevant ist. Irgendwelche Ideen? Danke, und lassen Sie mich wissen, wenn Sie den gesamten Code benötigen. – nesco88

+0

Der obige Code funktioniert auf Basis der von Ihnen bereitgestellten Beispieldaten wie vorgesehen. Wenn Sie möchten, dass ich andere Daten teste, bitte posten Sie diese zusätzlichen/anderen Testdaten.Wenn Sie den obigen Code in einen anderen Code integriert haben, kann ich nicht sagen, was Sie getan haben oder wie Sie es gemacht haben, und ich kann sicherlich nicht sagen, ob oder warum mein Code nicht mehr wie beabsichtigt in Ihrem Code funktioniert. Wenn Sie möchten, dass wir einen anderen Kontext berücksichtigen, dann veröffentlichen Sie den gesamten Code, den Sie berücksichtigen sollten. Andernfalls testen Sie den obigen Code selbst und Sie werden sehen, dass er mit den gegebenen Testdaten funktioniert. – Ralph

+0

Ich habe es nach ein paar Experimenten zu arbeiten. Ich musste den letzten "Copy" -Befehl in "Cut" ändern, weil eine der Linien zweimal auftauchte, aber ansonsten sieht es gut aus. Ich werde jedoch weiterhin mehr Tests durchführen, danke. – nesco88

Verwandte Themen