2009-06-23 8 views
2

Ich versuche, Daten aus der Zwischenablage, die aus Excel kopiert wurden (d. H. Durch Tabulator getrennte Texte), in eine Sammlung von Wörterbüchern zu zerlegen. Die Idee ist, dass jede Zeile durch ein Dictionary repräsentiert wird, das von Kopfzeilen auf Zellenwerte abbildet. Die erste Zeile in den kopierten Daten enthält die Header.Tabulatorseparierte Werte in VBA analysieren

den Text aus der Zwischenablage zu erhalten ist einfach genug:

Dim dataObj As DataObject 
Dim clipString As String 
Set dataObj = New DataObject 
dataObj.GetFromClipboard 
clipString = dataObj.GetText 

Dann teile ich die Eingabe in Reihen:

Dim strRows As Variant 

strRows = Split(clipString, vbNewLine) 

Als nächstes versuche ich die Header zu extrahieren:

Dim headers As New Collection 
Dim strCols As Variant 
strCols = Split(strRows(0), vbTab) 

For col = LBound(strCols) To UBound(strCols) - 1 
    headers.Add strCols(col) 
Next 

Schließlich extrahiere ich die Zeilen:

Dim cells 
Dim rows As New Collection 

For i = 1 To UBound(strRows) - 1 
    strCols = Split(strRows(0), vbTab) 
    Set cells = CreateObject("Scripting.Dictionary") 
    For col = 0 To UBound(strCols) - 1 
     cells.Add headers.Item(col + 1), strCols(col) 
    Next 
    rows.Add cells 
Next 

Ich erhalte jedoch einen Fehler. Auf der Linie

Zugriff kommt zurück mit Laufzeitfehler '12': Typ Mismatch.

Update behoben das Problem oben, danke für die Vorschläge. Jetzt erhalte ich einen Fehler in der Zeile

Set cells = CreateObject(Scripting.Dictionary) 

424: Objekt erforderlich.

Alle Hinweise, was ich diong falsch bin - VBA ist nicht wirklich meine Stärke.

Update 2 behebt dieses Problem auch (Danke für den Vorschlag unten). Der Code funktioniert jetzt.

Antwort

3

Für Ihr zweites Problem - Sie müssen den Zeichenfolge Namen der Zielklasse bieten, so ist es eigentlich

Set cells = CreateObject("Scripting.Dictionary") 
+0

Danke, das war das letzte Glied in der Kette. Typische MSFT-Dokumente waren falsch (ich hatte direkt für dieses Bit kopiert). – jwoolard

2

Ich denke, col muss String-Typ sein.

headers.Add strCols(col), cstr(col)

+1

..von Microsoft: Public Sub hinzufügen (_ ByVal Artikel Als Objekt, _ Optional ByVal Key als String, _ Optional ByVal {Vor | Nach} Als Objekt = Nichts _ ) – ozczecho

Verwandte Themen