2016-10-03 12 views
1

私はVBAの初心者ですので、私の経験不足を許してください。VBA連想配列(索引方法)

私はexcel VBAを使用して、配列のインデックスを作成する方法を理解しようとしています。私はCSVをインポートして、分割機能を使用しています。私は配列に分割されたアイテムの個々のアイテムにアクセスする必要があります。私は必要なものを説明するための最良の方法は、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は、Excel以外の他のアプリケーションのSolidWorks、パイソンなど)で使用するようにフォーマットされています。配列内の特定の要素にのみアクセスして、特定のセルを設定する必要があります。それは...私は列全体に配列全体を引き出すことができますが、私は必要なものだけをしたくありません。

0、.200 P、1.0709 Q、1.167 R、1.177 S、1.216 T、1.570 U、1.5843 V、W 1.6883 、1.9079 E:ここでCSVのサンプルであります.2645

私がしたいのは、最初の要素の文字を参照し、2番目の要素を特定のセルに挿入することです。インデックスを介して "t"を参照し、 "1.570"を挿入します。

私の配列の要素はLineItems(0)とLineItems(1)です。理想的には、LineItems(1)(a)/ LineItems(1-a)などと同様の要素の各インデックス項目を参照するのが理想的です。

+2

。内部の内容を確認するには、最初の項目のDebug.Print LineItems(0)、2番目の項目の(1)のような処理を行うことができます。 'For i = LBound(LineItems)to UBound(LineItems) ' –

+0

2つの配列を持つことはできません。* 1つの*配列には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) 

CSVが解析され、の準備ができて、あなたに新しいワークブックwbを与えるであろうが他のワークシートと同様にアクセスします(docs on MSDN)。

+0

私が使用しているCSVは、Excel以外の他のアプリケーションで使用するようにフォーマットされています。配列内の特定の要素にのみアクセスして、特定のセルを設定する必要があります。それは...私は列全体に配列全体を引き出すことができますが、私は必要なものだけをしたくありません。ここにCSVのサンプルがあります: – Mike

+0

私が使用しているCSVはExcel以外の他のアプリケーションSolidWorks、pythonなどで使用するようにフォーマットされています)。配列内の特定の要素にのみアクセスして、特定のセルを設定する必要があります。それは...私は列全体に配列全体を引き出すことができますが、私は必要なものだけをしたくありません。ここでCSVのサンプルである: 0、.200 P、1.0709 Q、1.167 R、1.177 S、1.216 T、1.570 Uを、1.5843 V、W 1.6883 、1.9079 eは、。私がしたいのは、最初の要素の文字を参照し、2番目の要素を特定のセルに挿入することです。インデックスを介して "t"を参照し、 "1.570"を挿入します。 – Mike

+0

@Mike追加情報をありがとう!情報を追加するには、[あなたの質問を編集する](http://stackoverflow.com/posts/39834124/edit)をお願いしますか?そうすれば、読みやすくなり、他の人が別の回答を追加する方が簡単になります。 **ところで**、サイトにようこそ!質の高い回答(および別のバッジ!)を求める質問の詳細については、[ツアー](https://stackoverflow.com/tour)をご覧ください。 – cxw

0

VBAには、Scripting.Dictionaryオブジェクトまたは.htmで連想配列を使用できます。NET System.Collections.HashTableしかし、それは少し過度のようです。

あなたは次のようにギザギザの配列(配列の配列)を使用することができます:あなたはすでに2つの項目を持つ配列を持っている

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"