2016-05-22 10 views
0

excel(例:record city = "Paris")をループして、.csvファイルから複数のレコードを検索したい都市パリに関連する.csvファイルで利用可能な複数のレコードを再編成する可能性がある)は、タブ区切りファイルの.txtの基本構造になります。vbaを使用してexcelからレコードを取得し、複数のレコードを.csv/.txtファイルで検索する

1 Tokyo JA test Tokyo "test, testttttttttt." "images url to download delimited by ," 
2 Tokyo JA test Tokyo "test, testttttttttt." "images url to download delimited by ," 
3 Paris FR test Tokyo "test, testttttttttt." "images url to download delimited by ," 

誰もがこれで私を助けることができ、ファイルの上に.txtファイルおよび.TXT/csvファイルでExcel reocrdsごとに会った私は(カウント)されているレコード数を知りたいと言ったであることに注意してください私は自分のシステムで必要な他の活動をしたいと思っています。

はここに私のコードです:

currPath1 = "C:\sourceexcel.xlsx" 
    currentPath2 = "C:\CSVtoberead.txt" 
fileNum =FreeFile() 
    Open currentPath2 For Input As fileNum 
    totoalRows= xlsheet.UsedRange.Rows.Count 
     startrow1 =1 
     PreviousCity="" 
     For x= startRow To totoalRows 
      currentCity = xlsheet.Cells(startRow,3).value '' this is city from excel sheet 
      Do While Not EOF(fileNum) 
       Line Input #fileNum, txt '''file to read .txt file 
       parseRecord = Split (txt,Chr(9)) 
       If parserecord(1)= currentCity Then 
+1

あなたは何をしたいと言っていますが、質問はしませんでした。どのような技術的困難があなたの欲望を果たさないのですか?これまでに何を試しましたか?あなたはあなたのコードを含めると(たとえコードがバグであっても)より良い回答を得る傾向があります。あなたの質問として、それはどのように動作しない無料のコーディングサービスとしてスタックオーバーフローを使用するように思えます。 –

+0

currPath1 = "C:\ test1.xlsx" currentPath2 = "C:\出力Cities.txt" totoalRows = xlsheet.UsedRange.Rows.Count \t startrow1 = 1 \t PreviousCity = "" X = startRow属性について \t totoalRows \t \t currentCity = xlsheet.Cellsに(startRow属性、3)上記のコードからtxtをされないEOF(FILENUM) \t \t \tライン入力#fileNumが、私はどのように多くのレコードがあたりに一致していることを知らなかったしDO \t \tを.VALUE優れた都市の記録だから私の質問は、そこに遊ぶための他の方法があるということです。 – user5769212

+0

これは助けになりますが、コメントではなく質問にコードを入れて、もう少し文脈を付けてください。それが立てば、ループの断片と宣言されていない変数があります。 –

答えて

0

繰り返しテキストファイルを読み込み、一度、ワークシート内の都市のすべての発生のために、非常に非効率的です。代わりに、ファイルを一度読むだけで、各行のデータを都市にキー入力された値に配列された辞書に読み込むことができます。その値は配列の集合です(各配列は行の分割に対応します)。このようなもの:

Function ExtractData(fname As String, colNumber As Long, Optional delim As String = vbTab) As Variant 
    'Takes a delimited txt file and returns a dictionary 
    'keyed by the entries in the specified column 
    'the values for a key is a collection of split lines 

    Dim fileNum As Long 
    Dim txt As String 
    Dim C As Collection 
    Dim d As Variant, k As Variant, parseRecord As Variant 

    Set d = CreateObject("Scripting.Dictionary") 

    fileNum = FreeFile() 
    Open fname For Input As fileNum 

    Do While Not EOF(fileNum) 
     Line Input #fileNum, txt '''file to read .txt file 
     parseRecord = Split(txt, delim) 
     k = parseRecord(colNumber) 
     If d.exists(k) Then 
      d(k).Add parseRecord 
     Else 
      Set C = New Collection 
      C.Add parseRecord 
      d.Add k, C 
     End If 
    Loop 

    Close #fileNum 

    Set ExtractData = d 

End Function 

コードを合理化するためには、上記の関数を使用することができます。あなたにそれがどのように動作するかのいくつかのアイデアを与えるために、私は、テキストファイルに(タブで置き換えスペースで)あなたのデータをコピーして実行しました:

Sub test() 
    Dim v As Variant 
    Set v = ExtractData("C:/Programs/test.txt", 1) 
    Debug.Print v("Tokyo").Count 
    Debug.Print v("Paris").Count 
    Debug.Print Join(v("Tokyo")(2), "/") 
End Sub 

出力は次のとおりです。

2 
1 
2/Tokyo/JA/test/Tokyo/"test, testttttttttt."/"images url to download delimited by ," 

ビットを拡大します:コードの先頭に関数を1回だけ実行し、それを変数に代入します(例:v)。次に、都市を含むスプレッドシートの列を繰り返します。各都市について、v.Exists(city)は、都市にデータが存在するかどうかを確認することができます。そうであれば、v(city).Countは何度何回言いますか、v(city)(i)のようなものは、その都市に対応するデータの個々の行にアクセスするために使用できます。 jが特定の列番号である場合、v(city)(i)(j)は、指定された都市のオカレンスiの列jのデータを(文字列として)返します。

+0

おかげであなたの助けのためにたくさんのジョン・コールマンは、あなたは私のコードの下に理解する助けてくださいすることができます:エルスその後d.exists(K) D(K).Add parseRecord セットC =新コレクション C.Add parseRecord Dの場合.Add k、C 終了場合 – user5769212

+0

私はさまざまな都市のデータを格納する辞書を使用しています。辞書の基本的な紹介についてはこちらをご覧ください:http://www.techbookreport.com/tutorials/vba_dictionary.htmlあなたが尋ねているコードでは、すでに都市の辞書エントリがある場合、その辞書エントリ(それ自体がコレクションです)にデータを追加しています。その都市の辞書エントリがまだない場合は、データを保持する新しいコレクションを作成し、都市をキーとして、コレクションに対応する値を新しい辞書エントリとして作成します。 –

関連する問題