- ベストアンサー
Access VBA Split利用方法
- VBAを使ってAccessでtxtファイルをインポートし、配列を利用してカンマ区切りにしたい場合、Split関数を使用することができます。
- Split関数を使用して配列を条件分岐に利用し、テーブルに書き込むことも可能です。
- VBAでの基本的な使い方から、条件分岐での利用方法まで、詳しく解説しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No4について少し説明をしておきます。 No4のSub cmdFile2() について、 Do While Not EOF(1) Line Input #1, LineofText '配列にデータを格納 arrayText = Split(LineofText, ",") '配列の要素をテーブルに格納 rs.AddNew For i = 0 To UBound(arrayText) rs.Fields(i) = arrayText(i) Next i rs.Update Loop arrayTextの型はVariantですが、配列を格納する場合は この型で行ないます。 (1) Line Input #1, LineofText はテキストファイルのデータを一行ずつ変数LineofTextに読み込む コードで、たとえば、LineofTextに 関東,東京,群馬,神奈川,千葉 のようにデータが格納されている考えてください。 (2) 次に、 arrayText = Split(LineofText, ",") によって、カンマを区切りとして配列を arrayTextに作ります。 (3) ここからが肝要ですが、補足に >Dim aaa() As String のような状態にした場合、 >そこからどうテーブルの列をを認識させて、 >aaa(0)がフィールド1の配列として認識させる >ことができるのかがよくわかっていないといいますか・・・ >わかりづらいでしょうか とありますが、 '配列の要素をテーブルに格納 rs.AddNew For i = 0 To UBound(arrayText) rs.Fields(i) = arrayText(i) Next i rs.Update は、ちょうどこの部分を表しているところで、 rs.Fields(i) = arrayText(i) の、左側はテーブルのi番目のフィールドを表し、右側は 配列のi番目の要素を表しています。今、テーブルと テキストファイルの列の数は同じとしているので、 rs.Fields(i) = arrayText(i) のようにして、テーブルの列の位置と、配列の要素の位置 を簡単に同期させることができます。 (4) 一つの行の処理が終わったら、 Do While Not EOF(1) Loop によって、次の行に進み、データを同様に取得します。 なお、テーブルの次の行に新しくデータを格納するのは、 rs.AddNew rs<Update のくみあわせによって、新しい行にレコードを追加する ことができることになります。そして新たにiは0から 始まるので行の先頭からレコードを追加できる、と いうことになります。 なお、テキストファイルにNullがある場合、たとえば、 関東,東京,,神奈川,千葉 関西,大阪,兵庫,,奈良 中国,広島,岡山,鳥取,山口 のように、ところどころデータが空の部分がある場合、 No4のSub cmdFile2()を実行すると、長さが0の文字列 を格納できません、といったエラーが出ます。 そういった場合は、まさに条件分岐で、たとえば、 Do While Not EOF(1) Line Input #1, LineofText '配列にデータを格納 arrayText = Split(LineofText, ",") '配列の要素をテーブルに格納 rs.AddNew For i = 0 To UBound(arrayText) If arrayText(i) <> "" Then rs.Fields(i) = arrayText(i) Else rs.Fields(i) = "空" End If Next i rs.Update Loop のようにして、処理を行ないます。 なお、Accessのテーブルのフィールドの型は テキスト型としています。 以上です。
その他の回答 (4)
- piroin654
- ベストアンサー率75% (692/917)
一応、テーブル定義を利用した方法はわかっていると いう前提で以下に。 ファイルへのアクセスを行なう方法は以下にあります。 http://support.microsoft.com/kb/151262/ja これを利用して回答してみます。 (1) たとえば、以下のようなカンマ切りのテキストファイルが あるとします。フィールド数でいえば5あります。 関東,東京,群馬,神奈川,千葉 関西,大阪,兵庫,京都,奈良 中国,広島,岡山,鳥取,山口 このテキストファイルをmdbファイルと同じフォルダに おきます。 アクセスのテーブルにF1,F2,F3,F4,F5の名前でフィールドを 設定し、テーブルを設定し、名前をテーブル1とします。 (2) 以下に二つのプロシージャを提示します。この中身が 何をしているかを理解できないとなかなか難しい ものがありますが。 なお、以下でDAOを使用しているので、コード表の ツール→参照設定からDAOにチェックを入れてください。 Microsoft DAO xx Object Library xxは3.6のような数値です。 Sub cmdFile1() Dim LineofText As String Dim arrayText As Variant Dim strPath As String Dim i As Long 'テキストファイルを開く Open CurrentProject.Path & "\test1.txt" For Input As #1 '一行ずつ変数に読み込む Do While Not EOF(1) Line Input #1, LineofText '配列にデータを格納 arrayText = Split(LineofText, ",") '配列の要素を一つずつ表示 For i = 0 To UBound(arrayText) MsgBox arrayText(i) Next Loop Close #1 End Sub Sub cmdFile2() Dim LineofText As String Dim arrayText As Variant Dim strPath As String Dim i As Long Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("テーブル1", dbOpenDynaset) 'テキストファイルを開く Open CurrentProject.Path & "\test1.txt" For Input As #1 '一行ずつ変数に読み込む Do While Not EOF(1) Line Input #1, LineofText '配列にデータを格納 arrayText = Split(LineofText, ",") '配列の要素をテーブルに格納 rs.AddNew For i = 0 To UBound(arrayText) rs.Fields(i) = arrayText(i) Next i rs.Update Loop Close #1 rs.Close: Set rs = Nothing db.Close: setdb = Nothing End Sub 以上ですが、テキストファイルの列数とテーブルの列数は 同じであること前提にしているのでそれほど難しい ことではないのですが。 配列にデータを読み込んでそれをメッセージで個別に表示したり、 テーブルに格納したりということをしています。 普通はこのようなことはしませんが、質問に答えて ということで。 何かあれば補足してください。
- nicotinism
- ベストアンサー率70% (1019/1452)
その 「txtファイル」の内容を数行でかまいません、提示できませんか? 中味は適当にぼかしても構いませんが、 文字数やデータ型が変わってしまうものは止めてくださいね。 > DoCmd.TransferText acImportFixed, "インポート定義", "data", "d:\data.txt" で acImportFixed を指定していますが固定長ファイルなのでしょうか? またインポートウィザードで進めていった場合はテーブルに期待したとおりに データが収まっていますか? ↓では入っているようですが? >テーブルtestに、3列(フィールド1・フィールド2・フィールド3)あるとして、 >この3項目を配列を利用した際のSplitメソッドの利用・指定の方法がよくわかりませんでした。 この目的は? どこまで出来ていて何処から判らないのかが、私には分かりません。。。 最初に書いたようにオリジナルデータの例示 最終的に求めたい結果の例示 が必要かと。。
お礼
nicotinism 様 >最初に書いたようにオリジナルデータの例示 >最終的に求めたい結果の例示 >が必要かと。。 確かにその通りですね。 一度 自分でもう一度内容を考えて見ます。 不明点がでましたら改めて質問させていただくかも しれませんが、よろしくお願いいたします。 忙しい所ありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
失礼しました。No1の(1)のCSVファイルはtxtファイルに訂正です。
- piroin654
- ベストアンサー率75% (692/917)
質問文を何回か読み直しましたが、どうにも 意図が汲み取れない・・・というか想像を たくましくすると勘違いが起こりそうなので、 >Accessを利用して、txtファイルをインポート後、テーブルの項目 >を配列利用してカンマ区切りにしたいのと、Splitを利用して、 >配列を条件分岐に利用して、テーブルに書き込みをしたいと >おもってます。 について、 (1) このようなCSVファイルがある。 (2) テーブルのフィールドにこのように書き込みたい。 といったことを具体的にしたほうが回答がしやすいのですが。
補足
piroin654 様 お世話になります。 わかりにくいというか理解しがたい質問ですいません。 まだ素人に毛が生えた状態な為 ご了承ください。m(__)m (1)やりたいことは、単純にボタンを押したらtxtファイルをインポートを行う (2)インポート後、一つのテーブルの、Nullになっている項目に数字や文字列をいれたい この二つになります。 条件分岐の記述については勉強がてら、とりあえず自力でやりたいとおもってまして 詳しくは記載してません。(わがままですいません。) もしかしたら改めて質問させていただくかもしれません。 ご指導いただきたい内容として、 テーブル testに、3列(フィールド1・フィールド2・フィールド3)あるとして、この3項目を配列を利用した際のSplitメソッドの利用・指定の方法がよくわかりませんでした。 Dim strVal Dim aryStrings strVal = "山田,佐藤,中山,山本,鈴木" aryStrings = Split(strVal, ",") 上記のような状態だとイメージしやすいんですが、変数として、 Dim aaa() As String のような状態にした場合、そこからどうテーブルの列をを認識させて、 aaa(0)がフィールド1の配列として認識させることができるのかがよくわかっていないといいますか・・・ わかりづらいでしょうか 不明点だらけでしたら本当すいませんです。 以上 よろしくお願いいたします。
お礼
piroin654 様 お礼がおくれてしまいすいませんでした。 記載頂いた内容すごい分かりやすく説明頂き感謝です。 ご説明頂いた内容でチャレンジしてみます。 いそがしい所ありがとうございました。 また、質問させていただくこともあるかもしれませんが よろしくお願いいたします。