
お世話になります。
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)させるのかが不明です。
知識不足もあり、説明がわかりづらいと思うのですが、よろしくお願いします。
No.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のテーブルのフィールドの型は
テキスト型としています。
以上です。
piroin654 様
お礼がおくれてしまいすいませんでした。
記載頂いた内容すごい分かりやすく説明頂き感謝です。
ご説明頂いた内容でチャレンジしてみます。
いそがしい所ありがとうございました。
また、質問させていただくこともあるかもしれませんが
よろしくお願いいたします。
No.4
- 回答日時:
一応、テーブル定義を利用した方法はわかっていると
いう前提で以下に。
ファイルへのアクセスを行なう方法は以下にあります。
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
以上ですが、テキストファイルの列数とテーブルの列数は
同じであること前提にしているのでそれほど難しい
ことではないのですが。
配列にデータを読み込んでそれをメッセージで個別に表示したり、
テーブルに格納したりということをしています。
普通はこのようなことはしませんが、質問に答えて
ということで。
何かあれば補足してください。
No.3
- 回答日時:
その 「txtファイル」の内容を数行でかまいません、提示できませんか?
中味は適当にぼかしても構いませんが、
文字数やデータ型が変わってしまうものは止めてくださいね。
> DoCmd.TransferText acImportFixed, "インポート定義", "data", "d:\data.txt"
で acImportFixed を指定していますが固定長ファイルなのでしょうか?
またインポートウィザードで進めていった場合はテーブルに期待したとおりに
データが収まっていますか? ↓では入っているようですが?
>テーブルtestに、3列(フィールド1・フィールド2・フィールド3)あるとして、
>この3項目を配列を利用した際のSplitメソッドの利用・指定の方法がよくわかりませんでした。
この目的は?
どこまで出来ていて何処から判らないのかが、私には分かりません。。。
最初に書いたようにオリジナルデータの例示
最終的に求めたい結果の例示
が必要かと。。
nicotinism 様
>最初に書いたようにオリジナルデータの例示
>最終的に求めたい結果の例示
>が必要かと。。
確かにその通りですね。
一度 自分でもう一度内容を考えて見ます。
不明点がでましたら改めて質問させていただくかも
しれませんが、よろしくお願いいたします。
忙しい所ありがとうございました。
No.1
- 回答日時:
質問文を何回か読み直しましたが、どうにも
意図が汲み取れない・・・というか想像を
たくましくすると勘違いが起こりそうなので、
>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の配列として認識させることができるのかがよくわかっていないといいますか・・・
わかりづらいでしょうか
不明点だらけでしたら本当すいませんです。
以上 よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SUMPRODUCT関数を用いた最小値
-
ExcelのINDEXとMATCH関数でスピ...
-
エクセル 条件を指定した標準...
-
[エクセル]連続する指定範囲か...
-
【VBA】ユーザーフォーム リス...
-
数字配列データを画像に変換す...
-
エクセルで、絶対値の平均を算...
-
【VBA】配列に数式を仕込む方法...
-
DataSetから、DataTableを取得...
-
VB6.0 ファイルの一括読込み
-
ListBoxへの読み込み
-
Generic.Listに1次元配列の配...
-
配列がとびとびである場合の書き方
-
Dictionaryを使い4つの条件の一...
-
文字の場合でもA列の最終行の...
-
Access2010で二次元配列をプル...
-
INDEX(D:D,L3)の意味は?
-
array関数で格納した配列の型を...
-
Excelのセルの色指定をVBAから...
-
テキストボックスのvalueとtext...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
ExcelのINDEXとMATCH関数でスピ...
-
array関数で格納した配列の型を...
-
Excelのセルの色指定をVBAから...
-
DataSetから、DataTableを取得...
-
Excel オートフィルタのリスト...
-
Datatableへの代入
-
【VBA】ユーザーフォーム リス...
-
配列がとびとびである場合の書き方
-
VBAでの100万行以上のデータの...
-
二次元配列の中の各行の要素を...
-
スプレットシートのGetTextにつ...
-
.NET - 配列変数を省略可能の引...
-
VB6.0 ファイルの一括読込み
-
【VBA】配列に数式を仕込む方法...
-
iniファイルのキーと値を取得す...
-
配列のSession格納、及び取得方...
-
Split関数でLong配列に格納する...
おすすめ情報