プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

VBAを勉強している最中です。
Accessを利用して、txtファイルをインポート後、テーブルの項目を配列利用して
カンマ区切りにしたいのと、Splitを利用して、配列を条件分岐に利用して、テーブルに
書き込みをしたいとおもってます。

おそらく基本的なことで自分で勉強するべきと思うのですが
漠然なイメージしかない状態で、ヒントやこういう方法があるなど
教えていただけますでしょうか

基本的な使い方ですと
Private Sub XXX_Click()
str = Split("あああ いいい ううう")
  MsgBox str(1)
End Sub

上記の用な利用方法と思いますが、このような使い方ではなく
test(0)のような使い方をして、条件分岐で利用したいと
おもってます。

イメージとしては、下記のようなことをイメージしてます。

Public Sub Test()

  Dim test() As String
Dim row As String
  Dim iNum1 As Long,
  Dim iNum2 As Long
  
  DoCmd.SetWarnings False
  DoCmd.RunSQL "DELETE * FROM data"
 DoCmd.TransferText acImportFixed, "インポート定義", "data", "d:\data.txt"
  DoCmd.SetWarnings True

  iNum1 = 0
  iNum2 = 0

  Do While xxx
     If test(0) = 0 Then 
        iNum1 = iNum1 + 1
iNum2 = 1
     Else
        xxxx
     End If

  Loop
End Sub

ここでSplitを利用してどのように指定するのが望ましいのか考えてしまってます。
test = row.Split(" ") を利用する場合、どのように連結(row)させるのかが不明です。

知識不足もあり、説明がわかりづらいと思うのですが、よろしくお願いします。

A 回答 (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のテーブルのフィールドの型は
テキスト型としています。

以上です。
    • good
    • 0
この回答へのお礼

piroin654 様
お礼がおくれてしまいすいませんでした。

記載頂いた内容すごい分かりやすく説明頂き感謝です。

ご説明頂いた内容でチャレンジしてみます。

いそがしい所ありがとうございました。

また、質問させていただくこともあるかもしれませんが
よろしくお願いいたします。

お礼日時:2012/11/14 13:24

一応、テーブル定義を利用した方法はわかっていると


いう前提で以下に。


ファイルへのアクセスを行なう方法は以下にあります。
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



以上ですが、テキストファイルの列数とテーブルの列数は
同じであること前提にしているのでそれほど難しい
ことではないのですが。
配列にデータを読み込んでそれをメッセージで個別に表示したり、
テーブルに格納したりということをしています。
普通はこのようなことはしませんが、質問に答えて
ということで。

何かあれば補足してください。
    • good
    • 0

その 「txtファイル」の内容を数行でかまいません、提示できませんか?


中味は適当にぼかしても構いませんが、
文字数やデータ型が変わってしまうものは止めてくださいね。

> DoCmd.TransferText acImportFixed, "インポート定義", "data", "d:\data.txt"
で acImportFixed を指定していますが固定長ファイルなのでしょうか?
またインポートウィザードで進めていった場合はテーブルに期待したとおりに
データが収まっていますか? ↓では入っているようですが?

>テーブルtestに、3列(フィールド1・フィールド2・フィールド3)あるとして、
>この3項目を配列を利用した際のSplitメソッドの利用・指定の方法がよくわかりませんでした。
この目的は?

どこまで出来ていて何処から判らないのかが、私には分かりません。。。
最初に書いたようにオリジナルデータの例示
最終的に求めたい結果の例示
が必要かと。。
    • good
    • 0
この回答へのお礼

nicotinism 様

>最初に書いたようにオリジナルデータの例示
>最終的に求めたい結果の例示
>が必要かと。。

確かにその通りですね。

一度 自分でもう一度内容を考えて見ます。
不明点がでましたら改めて質問させていただくかも
しれませんが、よろしくお願いいたします。

忙しい所ありがとうございました。

お礼日時:2012/11/14 13:39

失礼しました。

No1の(1)のCSVファイルはtxtファイルに訂正です。
    • good
    • 0

質問文を何回か読み直しましたが、どうにも


意図が汲み取れない・・・というか想像を
たくましくすると勘違いが起こりそうなので、

>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の配列として認識させることができるのかがよくわかっていないといいますか・・・
わかりづらいでしょうか

不明点だらけでしたら本当すいませんです。

以上 よろしくお願いいたします。

補足日時:2012/11/13 02:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!