お世話になります。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
【VBA】配列に数式を仕込む方法...
-
VBA listBoxについて
-
VBAでの100万行以上のデータの...
-
SUMPRODUCT関数を用いた最小値
-
エクセル 条件を指定した標準...
-
[エクセル]連続する指定範囲か...
-
配列の受け渡しについて
-
[VBA]改行入りのセルの値を配列...
-
読み込みで一行おきに配列に格納
-
ノーツのデータをVBScriptで取...
-
DataSetから、DataTableを取得...
-
Excel オートフィルタのリスト...
-
VBS 複数ファイル複数行を配列...
-
エクセルVBAで変数をセルに一行...
-
array関数で格納した配列の型を...
-
vba:一覧表から自動転記をしたい
-
.NET - 配列変数を省略可能の引...
-
スプレットシートのGetTextにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
array関数で格納した配列の型を...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
VBA listBoxについて
-
エクセルで、絶対値の平均を算...
-
配列がとびとびである場合の書き方
-
DataSetから、DataTableを取得...
-
[VBA]改行入りのセルの値を配列...
-
VBA 配列に格納した値の平均の...
-
配列のSession格納、及び取得方...
-
【VBA】ユーザーフォーム リス...
-
エクセルでエラーを無視して一...
-
SUMPRODUCT関数を用いた最小値
-
Excel VBA 配列の分割について
-
Excelのオートフィルタで抽出し...
-
VB6.0 ファイルの一括読込み
-
Excel オートフィルタのリスト...
-
VBAで指定期間の範囲を抽出し、...
おすすめ情報