2016-05-31 7 views
0

Ich versuche, ein Skript zu schreiben, eine Liste von Teilen und ihre verwendeten Nummern gegeben, die verwendeten Werte für alle doppelten Teile kombinieren und die resultierenden Werte sortieren. Das klang so hier verwirrend ist ein Bild von dem, was ich drehe für:VBA-Skript zum Kombinieren von doppelten Daten in eine Zeile

Desired Result

Es sollte Doppel- und Leer der Lage sein, zu handhaben.

Durch eine Kombination von Forschung und Basteln, habe ich eine sortWithinCell Funktion gemacht, aber meine Kopfschmerzen kommen vom Schreiben des Skripts, um die Liste der Teile zu Iterieren, kombiniert verwendeten Werte auf, wie Sie gehen, und dann weiter Wenn Sie eine andere Teilenummer erreichen, löschen Sie alle bis auf die erste Zeile, von der Sie begonnen haben, und fahren Sie fort. Angenommen, die Liste der eingegebenen Teile ist bereits nach Teilenummern sortiert.

Vielen Dank!

-Edit 1-

ich einen Weg zu finden, habe es geschafft, die Datenwerte zu kombinieren:

Funktion ConcatinateAllCellValuesInRange (sourceRange Als Excel.Range) As String Dim Endwert As String

Dim cell As Excel.Range 

For Each cell In sourceRange.Cells 
    finalValue = finalValue + "," + CStr(cell.Value) 
Next cell 

ConcatinateAllCellValuesInRange = Right(finalValue, Len(finalValue) - 1) 

Ende Funktion

Jetzt identifiziert der Trick noch den Eingabebereich für diese Funktion, dh wenn sich die Teilenummer ändert.

Antwort

0

Eine mögliche Lösung wäre, eine Sammlung zu erstellen, die den Part als Schlüssel verwendet und die Used-On-Werte als Wert hat. Beim ersten Auftreten von Part wird das KeyValue-Paar dann in einer laufenden Schleife hinzugefügt Der Schlüssel ist bereits in der Sammlung vorhanden, nimmt den Wert des Schlüssels und des Schlüssels aus der Sammlung, führt sie zusammen, löscht das aktuelle KeyValue-Paar und fügt ein neues hinzu (Sie können ein KeyValue-Paar einer Sammlung nicht ändern, daher löschen das alte und füge ein neues hinzu).

Wenn Sie mit dem Durchlaufen der Liste fertig sind, können Sie die Elemente in der Sammlung durchgehen und an anderer Stelle auf dem Blatt speichern. Oder, wenn Sie möchten, löschen Sie den aktuellen Bereich und fügen Sie alles ein, wo die alten Werte waren.

Lassen Sie mich wissen, wenn Sie mit diesem


EDIT Hilfe benötigen

Hier ist ein Beispiel für die Methode, die ich beschrieben, obwohl ich statt einer Sammlung ein Wörterbuch verwendet, weil es mehr Funktionalität (erfordert einen Verweis auf "Microsoft Scripting Runtime"):

Option Explicit 

Sub combineStuff() 

    'Create Dictionary 
    Dim tmpDic As New Dictionary 

    'tempstring to preserve the value of a key 
    Dim tmpValue As String 


    Dim i As Integer 

    'Loop through rows - change this to your needs 
    For i = 1 To 15 Step 1 

     'Simple check if "Part" and "Used-On" are both filled 
     If Cells(i, 1).Value <> "" And Cells(i, 2).Value <> "" Then 

      'Check if the Key already exists 
      If tmpDic.Exists(CStr(Cells(i, 1).Value)) Then 

       'If it does, save it's value 
       tmpValue = tmpDic.Item(CStr(Cells(i, 1).Value)) 

       'Delete the Key Value pair 
       tmpDic.Remove CStr(Cells(i, 1).Value) 

       'Add Key Value pair with updated Value 
       tmpDic.Add CStr(Cells(i, 1).Value), tmpValue & "," & CStr(Cells(i, 2).Value) 
      Else 

       'Key does not exist yet, add it 
       tmpDic.Add CStr(Cells(i, 1).Value), Cells(i, 2).Value 
      End If 
     End If 
    Next i 

    Dim tmpKey As Variant 
    i = 1 

    'Loop through all items in the Dictionary 
    For Each tmpKey In tmpDic 

     'Insert Key 
     Cells(i, 4).Value = tmpKey 

     'Insert Value 
     Cells(i, 5).Value = tmpDic(tmpKey) 
     i = i + 1 
    Next tmpKey 

End Sub 

Beachten Sie, dass das Wörterbuch nicht sortiert werden! Der zuletzt geänderte Schlüssel ist der letzte in der Liste. Wenn das Ergebnis sortiert werden soll, ist es möglicherweise besser, ein mehrdimensionales Array zum Speichern der Schlüssel- und Wertepaare zu verwenden. Dann können Sie diese leicht sortieren.

+0

Das klingt, als würde es definitiv funktionieren - leider bin ich nicht so mit VBA geübt, wie ich es möchte und ich bin mir nicht sicher, wie ich das machen würde. Ich würde die Hilfe auf jeden Fall zu schätzen wissen! – madacho

+0

aktualisierte Antwort. – gizlmo

+0

Wie gehen Sie bei der Referenzierung der Microsoft Scripting Runtime [email protected] – madacho