2016-10-03 4 views
1

Я новичок в VBA, поэтому, пожалуйста, простите мою нехватку опыта.Ассоциативные массивы VBA (как индексировать)

Im using excel VBA и пытается выяснить, как индексировать массив. Я импортирую CSV и использую функцию split. Мне нужно получить доступ к каждому отдельному элементу элементов, разбитому на массив (ы). Лучший способ объяснить, что мне нужно, это пример, как это от 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] 

Вот то, что я до сих пор:

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 

теперь у меня есть 2 массивы (LineItems (0) & LineItems (1)), но как мне проиндексировать то, что внутри них на данный момент?

Спасибо за любую помощь, мы будем благодарны.

Майк


CSV-я использую отформатирован для использования с другими приложениями SolidWorks, питона и т.д.), кроме Excel. Мне нужно получить доступ к определенным элементам в массиве для заполнения определенных ячеек. Поскольку это ... Я могу вывести весь массив в столбцы, но я не хочу этого делать, только те, которые мне нужны. Вот образец CSV:

0, 0,200 р, 1,0709 кв, 1,167 г, 1,177 с, 1,216 т, 1,570 и, 1,5843 V, 1,6883 ш, 1,9079 е , .2645

То, что я хочу сделать, это ссылка на букву в первом элементе и добавление второго элемента в определенную ячейку: ссылку «t» на индекс и вставить «1.570».

Элементы в моих массивах - это LineItems (0) и LineItems (1). Поэтому в идеале я хочу ссылаться на каждый индексированный элемент в элементе как LineItems (1) (a)/LineItems (1-a) или что-то подобное этому.

+2

У вас уже есть массив с 2 ст. Чтобы увидеть, что внутри, вы можете сделать что-то вроде Debug.Print LineItems (0) для первого элемента или (1) для второго. Вы можете перебирать элементы с помощью цикла For, например: 'Для i = LBound (LineItems) для UBound (LineItems)' –

+0

У вас нет 2 массивов - у вас есть * один * массив с двумя * элементами *. – Comintern

+1

В VBA нет ассоциативных массивов ... Все индексы численные. – salih0vicX

ответ

0

Я думаю, что прокомментированные строки в вашем коде должны работать, по крайней мере, до доступа к массиву. (Тем не менее, я, возможно, не в полной мере понять, что вы пытаетесь сделать. Не могли бы вы изменить свой вопрос прояснить?) Я рекомендую добавить

Option Explicit 
Option Base 0 

в верхней части файла, и

Dim LineItems as Variant 

до Split звонок. Таким образом, компилятор поможет вам найти ошибки.

Однако Если то, что вы действительно хотите, чтобы открыть файл CSV, пожалуйста, позвольте мне предложить:

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

который даст вам новую книгу wb с CSV разобран и готов к доступ к нему, как и любой другой рабочий лист (docs on MSDN).

+0

CSV, который я использую, отформатирован для использования с другими приложениями помимо Excel. Мне нужно получить доступ к определенным элементам в массиве для заполнения определенных ячеек. Поскольку это ... Я могу вывести весь массив в столбцы, но я не хочу этого делать, только те, которые мне нужны. Вот пример CSV: – Mike

+0

CSV, который я использую, отформатирован для использования с другими приложениями SolidWorks, python и т. Д.), Кроме Excel. Мне нужно получить доступ к определенным элементам в массиве для заполнения определенных ячеек. Поскольку это ... Я могу вывести весь массив в столбцы, но я не хочу этого делать, только те, которые мне нужны. Вот образец CSV: 0, 0,200 р, 1,0709 кв, 1,167 г, 1,177 с, 1,216 т, 1,570 U, 1,5843 V, 1,6883 ш, 1,9079 е ,. 2645 То, что я хочу сделать, это ссылка на букву в первом элементе и второй элемент, вставленный в определенную ячейку: Ссылка «t» через индекс и вставка «1.570». – Mike

+0

@Mike за дополнительную информацию! Не могли бы вы [изменить свой вопрос] (http://stackoverflow.com/posts/39834124/edit), чтобы добавить туда информацию? Таким образом, читать будет легче, и кому-то будет проще добавить еще один ответ. ** Кстати **, добро пожаловать на сайт! Ознакомьтесь с [tour] (https://stackoverflow.com/tour) для получения дополнительной информации о задании вопросов, которые привлекут качественные ответы (и еще один значок!). – cxw

0

Вы можете иметь ассоциативные массивы в VBA с помощью Scripting.Dictionary object или.NET System.Collections.HashTable, но это похоже немного overkill.

Вы можете использовать Jagged массивы (массивы массивов), как это:

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" 
Смежные вопросы