【Microsoft Access 2003について】

次のようなテーブルと、テキストファイルがあります。

◆名前(テーブル)
苗字
ミドルネーム
名前
(すべてテキスト型)

◆C:\氏名.txt(テキストファイル)
苗字,名前 ←(先頭行はフィールドとして使用したい)
山田,太郎

この「氏名.txt」をテーブル「名前」に取り込みたいので、インポート定義を作成し、
次のような文を書いたのですが、「ミドルネーム」のフィールドに「太郎」が入ってきてしまいます。

DoCmd.TransferText acImportDelim, "インポート定義", "名前", "C:\氏名.txt", True, ""

インポート定義は以下のように設定しました。
【フィールド名】【データ型】
苗字  テキスト型
ミドルネーム テキスト型
名前 テキスト型

本来ならば、「ミドルネーム」のフィールドはnullになり、「苗字」と「名前」フィールドに「山田」「太郎」が
入るようにしたいのですが…。
このような動作をさせるには、どのように修正すればいいでしょうか。
ご存知の方よろしくお願いします。

ちなみに手動でインポートした場合は、目的の動作になりました。

回答の条件
  • 1人2回まで
  • 登録:2007/12/12 15:34:02
  • 終了:2007/12/19 15:35:04

回答(4件)

id:careplanner No.1

らいず回答回数338ベストアンサー獲得回数132007/12/12 15:43:19

ポイント20pt

苗字,ミドルネーム,名前

山田,,太郎

という形でテキストを作成してみたらできませんか?

id:db_Magician

回答ありがとうございます。

すみません、テキストの構成を変えずにやりたいのです。

2007/12/12 15:52:00
id:rikuzai No.2

りくっち回答回数1366ベストアンサー獲得回数1412007/12/12 16:16:44

ポイント20pt

インポート定義の中にミドルネームが設定されているからではないかと。

ミドルネームの定義を削除して、苗字と名前の定義のみにして実行してみてはどうでしょうか。

id:db_Magician

回答ありがとうございます。

ミドルネームが入ってるテキストも存在するため、それはできません。

2007/12/12 16:29:55
id:careplanner No.3

らいず回答回数338ベストアンサー獲得回数132007/12/12 20:45:39

ポイント30pt

コメントが付けられないのでこちらで書き込みます。

データ形式を変えられないとするなら、モジュール内にデータを読み込み1行ずつ処理をしてテーブルに入れて行くしかないと思います。

読み込んだデータを確認して、3つ目のデータがない場合は2つ目のデータを名前に登録するようにすればいいと思いますよ。

http://www.tsware.jp/tips/tips_366.htm

id:db_Magician

補足ありがとうございます。

つまり「先頭行からフィールドを判別して、そのフィールドにだけデータを入れる」という動作は一発では

できないということですね。

質問文では「苗字」「ミドルネーム」「名前」の3フィールドだけですが、

実際にはもっと沢山のフィールドがあり、場合によって増えたり減ったりするので

教えていただいた方法でも難しそうですが…

2007/12/13 09:39:13
id:charleston No.4

charleston回答回数1ベストアンサー獲得回数02007/12/14 20:22:52

ポイント20pt

↓いかが?

Public Sub test()
    Dim db As Database          'データベース
    Dim rs As Recordset         'レコードセット
    Dim TxtData1 As Variant     'フィールド名
    Dim TxtData2 As Variant     'データ
    Dim TxtFileNum As Long      'ファイル番号
    Dim strData As String       '一時データ
    Dim varNum As Long          '読込変数
    Dim varMax As Long          '読込最大数
    
    TxtFileNum = FreeFile()     'TXT開く
    Open "c:\氏名.txt" For Input As #TxtFileNum
    
    Set db = CurrentDb          'テーブル開く
    Set rs = db.OpenRecordset("名前")
    
    Line Input #TxtFileNum, strData     'フィールド名
    TxtData1 = Split(strData, ",", , vbTextCompare)
    
    Do Until EOF(TxtFileNum)    'TXTデータ
        Line Input #TxtFileNum, strData
        TxtData2 = Split(strData, ",", , vbTextCompare)
        With rs
            .AddNew             '対象フィールドにデータを追加
                For varNum = 0 To UBound(TxtData1)
                    Select Case TxtData1(varNum)
                        Case "苗字": !苗字 = TxtData2(varNum)
                        Case "ミドルネーム": !ミドルネーム = TxtData2(varNum)
                        Case "名前": !名前 = TxtData2(varNum)
                    End Select
                Next
            .Update
        End With
    Loop
    
    rs.Close: Set rs = Nothing  '閉じる
    db.Close: Set db = Nothing
    Close #TxtFileNum
                    
End Sub

ツール 参照設定 DAO Object Library の追加をお忘れなく

id:db_Magician

回答ありがとうございます&わざわざプログラムいただきすみません…

只今時間が取れないので、時間が取れ次第検証してみようと思います。

2007/12/17 16:07:18
  • id:bonlife
    質問文の"ちなみに手動でインポートした場合は、目的の動作になりました。"とは、具体的にどういうデータに対してどういう操作を行ったのでしょうか。

    データをインポートする明確なロジックがある場合、そのロジックをプログラムに落とし込めば、(簡単かどうかは別にして)作業を自動化することは可能です。
    内容に応じて人間系の判断が入っている場合、自動化は不可能です。
  • id:db_Magician
    氏名.txtに対して、以下の操作を行いました。

    ファイル→外部データの取り込み→インポート→氏名.txtを指定
    ・区切り記号付き(カンマ区切り)
    ・「先頭行をフィールドとして使う」
    ・「次のテーブルに保存する」にてテーブル「名前」を指定

    動き的には、rikuzaiさんの回答の「インポート定義でフィールド【苗字】【名前】のみが設定されている
    状態」で正しく取り込まれたことになるのでしょうか。
  • id:db_Magician
    テキストの先頭行によって、インポート定義を再作成するプログラムを作れば
    行けるかも。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません