2016-10-03 7 views
1

Ich bin ein Neuling für VBA, also bitte vergib meine mangelnde Erfahrung.Assoziative VBA-Arrays (Index)

Ich verwende Excel VBA und versuchen herauszufinden, wie man ein Array indizieren. Ich importiere eine CSV-Datei und verwende die Split-Funktion. Ich muss auf die einzelnen Elemente der Elemente zugreifen, die in die Arrays aufgeteilt sind. Der beste Weg, zu erklären, was ich brauche, ist ein Beispiel, wie dies von Actionscript:

var a:Array = []; 
a[1] = "Hello"; 
a[2] = "World"; 
(Except that what I have is a dynamic array created by the SPLIT function) 
Where I could access "Hello" with the var a[1] 

Hier ist, was ich bisher:

Sub getTxtfile() 
FilePath = Application.GetOpenFilename _ 
(Title:="Please choose a file to open", _ 
FileFilter:="CSV Files *.csv* (*.csv*),") 
Open FilePath For Input As #1 
row_number = 0 
Do Until EOF(1) 
    Line Input #1, LineFromFile 
    LineItems = Split(LineFromFile, ",") 
    'ActiveCell.Offset(row_number, 0).Value = LineItems(1) 
    'ActiveCell.Offset(row_number, 1).Value = LineItems(0) 
    row_number = row_number + 1 
    'Debug.Print LineItems(0) & ": " & LineItems(1) 
    Loop 
Close #1 
End Sub 

Ich habe jetzt 2-Arrays (Lineitem (0) & Lineitem (1)) aber wie indexiere ich an dieser Stelle, was in ihnen steckt?

Vielen Dank für jede Hilfe, es wird sehr geschätzt.

Mike


Die CSV Ich verwende formatiert mit anderen Anwendungen Solidworks zu verwenden, Python, etc.) neben Excel. Ich muss nur auf bestimmte Elemente im Array zugreifen, um bestimmte Zellen zu füllen. So wie es ist ... Ich kann das gesamte Array in Spalten ziehen, aber das möchte ich nicht, nur die, die ich brauche. Hier ist ein Beispiel des CSV:

0, .200 p, 1,0709 q, 1,167 r, 1.177 s, 1,216 t, 1.570 u, v 1,5843 , 1,6883 w, 1,9079 e , .2645

Was ich tun möchte, ist der Buchstabe im ersten Element verweisen und das zweite Element in einer bestimmten Zelle eingefügt: Referenz "t" durch einen Index und "1.570" eingefügt haben.

Die Elemente in meinen Arrays sind LineItems (0) und LineItems (1). Im Idealfall versuche ich, jedes indizierte Element in einem Element als LineItems (1) (a)/LineItems (1-a) oder etwas Ähnliches zu referenzieren.

+2

Sie bereits ein Array mit 2 Einträgen haben. Um zu sehen, was drin ist, können Sie etwas wie Debug.Print LineItems (0) für das erste Element oder (1) für das zweite tun. Sie können Objekte mit einer For-Schleife iterieren, wie zum Beispiel: 'Für i = LBound (LineItems) zu UBound (LineItems)' –

+0

Sie haben nicht 2 Arrays - Sie haben * ein * Array mit zwei * Elementen *. – Comintern

+1

In VBA gibt es keine assoziativen Arrays ... Alle Indizes sind numerisch. – salih0vicX

Antwort

0

Ich denke, die auskommentierten Zeilen in Ihrem Code sollte tatsächlich funktionieren, zumindest was Array-Zugriff betrifft. (Aber ich kann nicht verstehen, was Sie versuchen zu erreichen. Würden Sie bitte Ihre Frage bearbeiten zu klären?) Ich empfehle

Option Explicit 
Option Base 0 

am Anfang der Datei hinzufügen und

Dim LineItems as Variant 

vor dem Split Anruf. Auf diese Weise wird der Compiler Ihnen helfen, Fehler zu finden.

jedoch Wenn das, was Sie wirklich wollen, ist eine CSV-Datei zu öffnen, erlauben Sie mir vorschlagen:

Dim wb as Workbook 
Workbooks.OpenText Filename:="<filename>", DataType:=xlDelimited, Comma:=True 
Set wb = Workbooks(Workbooks.Count) 

, die Ihnen eine neue Arbeitsmappe wb mit dem CSV analysiert und bereit zu sein, Zugriff wie jedes andere Arbeitsblatt (docs on MSDN).

+0

Die von mir verwendete CSV-Datei ist so formatiert, dass sie neben Excel auch für andere Anwendungen verwendet werden kann. Ich muss nur auf bestimmte Elemente im Array zugreifen, um bestimmte Zellen zu füllen. So wie es ist ... Ich kann das gesamte Array in Spalten ziehen, aber das möchte ich nicht, nur die, die ich brauche. Hier ist ein Beispiel der CSV: – Mike

+0

Die CSV, die ich verwende, ist formatiert, um mit anderen Anwendungen SolidWorks, Python, etc.) neben Excel zu verwenden. Ich muss nur auf bestimmte Elemente im Array zugreifen, um bestimmte Zellen zu füllen. So wie es ist ... Ich kann das gesamte Array in Spalten ziehen, aber das möchte ich nicht, nur die, die ich brauche. Hier ist ein Beispiel des CSV: 0, .200 p, 1,0709 q, 1,167 r, 1.177 s, 1,216 t, 1.570 u, v 1,5843 , 1,6883 w, 1,9079 e ,. 2645 Ich möchte den Buchstaben im ersten Element referenzieren und das zweite Element in eine bestimmte Zelle einfügen: Referenz "t" durch einen Index und habe "1.570" eingefügt. – Mike

+0

@ Mike danke für die zusätzlichen Informationen! Würden Sie bitte [Ihre Frage bearbeiten] (http://stackoverflow.com/posts/39834124/edit), um die Informationen dort hinzuzufügen? Auf diese Weise wird es einfacher zu lesen, und es wird leichter für jemand anderen, eine andere Antwort hinzuzufügen. ** Übrigens, willkommen auf der Website! Weitere Informationen zum Stellen von Fragen, die qualitativ hochwertige Antworten liefern (und ein weiteres Abzeichen!), Finden Sie unter [tour] (https://stackoverflow.com/tour). – cxw

0

Sie können assoziative Arrays in VBA mit Scripting.Dictionary-Objekt oder der.NET System.Collections.HashTable, aber das scheint ein bisschen übertrieben.

Sie können mit Jagged Arrays (Arrays von Arrays) wie folgt aus:

Line = "0,.200 p,1.0709 q,1.167 r,1.177 s,1.216 t,1.570 u,1.5843 v,1.6883 w,1.9079 e,.2645" 
LineItems = Split(Line, ",") 

Dim LineSubItems()  ' has to be Variant or Variant() array 
ReDim LineSubItems(0 To UBound(LineItems)) 

For i = 0 To UBound(LineItems) 
    LineSubItems(i) = Split(LineItems(i), " ") 
Next 

Debug.Print LineSubItems(1)(1) ' "p"