プロが教えるわが家の防犯対策術!

こんにちは、いつも質問ばかりですみません。
WINDOWS2000 で ACCESS 97 ユーザーです。

品番.CSVがあるとします(数千行)
品番は、
100
A100
のように、数字のみやローマ字が入り混じっています。

ACCESS 側に「品番」テーブルを作り、データ型をテキストにします。その上で
 ファイル
 -外部データの取り込み
 -インポート
 -次のテーブルに保存する「品番」
でテーブルを指定すると、きちんと入ります。

が、マクロで
 テキスト変換
 -区切り記号付インポート
 -テーブル名「品番」
 -ファイル名「品番.CSV」
 -フィールド名の設定「はい」
で実行すると、
「品番インポートエラー」テーブルが別に作成され、
A100
を「データ型の変換エラー」と見なしています。

…どうしてでしょう。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>DoCmd.TransferText acImportDelim, "", "TEMP", "D:\TEMP.CSV", True, ""


インポート定義を作成して
DoCmd.TransferText acImportDelim, "インポート定義名", "TEMP","D:\TEMP.CSV", True
ではどうでしょうか。

>A100を「データ型の変換エラー」と見なしています
数値文字混在のデータで型変換エラーが出でしまうのは最初のデータが数値の場合それ以降を数値として扱ってインポートしようとして文字があるとエラーになるような事例があったと思ったのですが前の事なので定かではありません。
    • good
    • 0
この回答へのお礼

もう一度、#2 さんが教えてくださった「外部テキストファイルとの接続方法」で、インポート定義名が空欄の場合に起こるエラーについて読みましたが、やっぱり定義名を設定するまでには至りませんでした(スキル不足)
が、
> 最初のデータが数値の場合それ以降を数値として扱って
もしかしたら2000以降のバージョンでは改善されているのかもしれませんが、どうもコレが犯人くさいです。
VBE で取り込み前に元CSV データを降順でソートし、ローマ字で始まる品番を上に持ってきてから取り込むと、エラーが起きないことがわかりました。
根本的な解決にはなってないですが(^^;)、助かりました。
ありがとうございました。

お礼日時:2006/02/02 17:37

インポート定義を作成して保存し、


マクロでインポートする際に、
その定義を指定します。
http://www.f3.dion.ne.jp/~element/msaccess/AcTip …

「インポート/エクスポート定義の作成方法」
などを参考にしてみてください。

この回答への補足

ありがとうございました。
参考ページを教えていただきましたが、スキル不足で理解できません(泣)
VBA は、EXCEL 上ではそこそここなせますが、ACCESS はまだこれからの課題なんです。

とりあえず、マクロをモジュール化してみました。
(便宜上テーブル名をTEMP 、取り込みCSVもTEMP.CSV としています。)

DoCmd.TransferText acImportDelim, "", "TEMP", "D:\TEMP.CSV", True, ""

何が悪いのか、ご教授いただけるとありがたいです。。

補足日時:2006/02/01 12:02
    • good
    • 1

データ型が数値になっているからだと思います。



インポートする際に、フィールドのオプションを指定する際に該当列をテキスト型としてください。

この回答への補足

回答ありがとうございました。
いやー。。。

> ACCESS 側に「品番」テーブルを作り、データ型をテキストにします。

受け入れテーブルは、テーブルデザインのデータ型を「テキスト型」にしてあります。
私の解釈、間違っています…?

補足日時:2006/02/01 11:49
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qインポート時のエラー「データ型の変換エラー」

ACCESS2000を使用しています。
CSVファイルをマクロを使い、インポートしようとしているのですが、ある列に「33300G2」というデータがあります。
インポートのマクロを実行するとそのデータのみがインポートエラー(エラー内容は「データ型の変換エラー」)となってしまいます。
ちなみに、エラーが出る列は、「33300G2」以外全てが数字のみなのですが関係あるのでしょうか。
もし原因らしきものがわかればアドバイスよろしくお願いいたします。

Aベストアンサー

インポート定義をして下さい。
インポート→設定→データ型を変更して下さい。
何かあれば補足して下さい。
がんばれ

Qcsvファイルをアクセスにインポート

こんにちは。Access2000について質問させてください。よろしくお願いいたします。


csvファイル内のデータをAccess2000に作成したデータベースにインポートしたいんのですが、どうすれば良いでしょうか?

何を調べたらいいかもわからない状態で…

どなかかご存知の方がいらっしゃったら教えて下さい。なにとぞ宜しくお願いいたします。

Aベストアンサー

メニューのファイルメニューから外部データの取り込みを選択するかデータベースウィンドウ上で右クリックしインポートを選択します。
ファイルの種類をテキストファイルに設定しcsvファイルのあるフォルダを開きファイルを指定しインポートボタンをクリックするとインポートウィザードが開きますので順次従って進めればできます。
データを保存する場所で既存のテーブルに保存したければ次のテーブルで指定します。ウィザードの設定が終わったら完了ボタンでインポートできます。
ウィザードにある設定ボタンをクリックすればインポート定義を登録できます。インポート定義を登録すれば次回からフィールドの設定などしなくてインポート定義を使って同様のデータ構成のファイルはインポートできるようになります。
ヘルプでインポートで検索すれば出てきますのでそちらも参照してください。

QAccessのマクロでCSVファイルをインポートする

Accessのマクロ・VBAにてCSVファイルを
インポートしたいのですが、うまくいきません。

DoCmd.TransferText acImportDelim, , "C:\Documents and Settings\yoshimi\My Documents\顧客マスタテーブル.csv", False
現在のコードです。

「オブジェクト'0.txt’が見つかりませんでした。
オブジェクトが存在していること、名前やパス名が正しいことを確認
してください。」
とエラーが表示されます。

過去ログを検索し、似たようなものを見つけ同じようにしたつもりです。
http://okweb.jp/kotaeru.php3?q=1691138
(回答のANo.1の定義の保存場所が分からずしていません)

どこがおかしいのか教えていただきたいです・・・

Aベストアンサー

インポート先(保存先)となるテーブルが指定されていないようです。

その分、カンマ(,)が1個少ないなっているために引数がずれて判断され、インポートするファイルが「C:\~顧客マスタテーブル.csv」ではなく、「0.txt」だと判断されているのではないかと思います。
(「False」がファイル名と解釈され(False=0)、テキストファイルと解釈されて拡張子「.txt」をつけてエラー表示された、と)

とりあえず、「Test」テーブルを作成し(フィールドは仮でF1,F2の2つでテキスト型)、「,"C:\~」の前に「,"Test"」を入れて実行してみて下さい。
(csvファイルが3列以上の構成であれば、「テーブル'Test'にはF3フィールドがありません」とのエラーが表示されるようになりると思いますので、適宜F3,F4,・・・と、必要な列数を追加して下さい:定義のかわりです)

Qアクセスで、毎回インポートエラーが出るのはなぜ?

アクセス2003に、エクセルデータをインポートする時に、
「テーブル$_インポート エラー」というテーブルが作成されてしまいます。
取込み自体は出来ているようなのですが、どのテーブルにインポートしても、毎回同じ内容の、このエラーテーブルが別に出来てしまいます。
何か致命的な問題があるのでしょうか?

困っています。どうか宜しくおねがいします!

「テーブル$_インポート エラー」のデータシートビュー内容↓
   
  エラー           フィールド      行
データ型の変換エラー        F4     11
データ型の変換エラー      F9      11
データ型の変換エラー      F4      22
データ型の変換エラー      F9      22
データ型の変換エラー      F14      22
データ型の変換エラー      F4      24
データ型の変換エラー      F9      24

Aベストアンサー

>ただ、どのエクセルシートを取込んでも、同じエラー内容
>が出るのです。
これは、おかしいですね。 なんとも不思議ですね・・
内容が違えば、例えエラーが事実であっても、内容は異なるはずですから。
エラーが出たらエラーテーブル自体を削除しても
また、同じ内容で作成されるんですよね?

例えば、EXCEL側ではC列しか使っていないと思っていても、セルに対してスペースとかが入っていて
インポートする際に、C列を超えて認識してしまうことはありますが
どのシートでもと言うのは、ありえないですね。

本来の目的のA、B、CのみのEXCELを開いて、ごみが無いかD列以降を
広範囲に、列削除して試してみましょうか?

少なくとも、その状態でF14とかのエラーが再度作成されるとなると、
EXCELのデータでエラーが出ているのではない確証にはなります。

QExcelのデータ(数字)をテキスト型としてaccessにインポートする方法

Excelの「セルの書式設定」を「文字列」にして、数字を入力し、accessで「インポート」すると「データ型」が「倍精度浮動小数点型」となって「1(2)」や「1&2」と入力した行がインポートできずerrorとなります(普通の数字はインポートできます)。Excelの書式設定を「ユーザ定義」→「@」としても同じです。またaccessでテーブルのデザインでそのインポートするフィルドを「データ型」としておいてインポート操作をしてもインポートされません。Excelを開きそのセルや行の書式設定を確認しましたが文字列となっています。どこが問題なのでしょうか?
また正しくインポートできる方法を教えてください。
accessとExcelのバージョンは2003です。
よろしくお願いします。

Aベストアンサー

Excelの「表示形式」を「文字列」にしているのに…というのを疑問に感じていらっしゃるようですが、この設定は、そもそも原則としては「表示上」のデータを整形する機能として用意されたもので、Access等のデータベースで、フィールド型を指定する機能とは、根本的に異なります。この点を理解されておいたほうがいいでしょう。

では、ExcelデータをAcessにインポートするときには、どのようにしてフィールド型を判別しているのかと言えば、1件目のデータからであると思われます。
文字列にしている列の1件目のデータは、数字のみ等の数値として認識できるデータではないでしょうか? これによって、「倍精度浮動小数点型」が自動設定されるのでしょう。ところが、「1(2)」などのデータは、型が違うので、エラーが表示されると。
「ANo.#2」さんの「方法3」ならうまくいくというのも、この理由でしょう。

ただ、私がExcel2002とAcess2002で試してみたところでは、おっしゃるような問題が発生しませんでした。何が、違うんでしょうねぇ。「ANo.#2」さんの「方法2」についても、私はうまく行きました。「方法1」のTXTファイルとして保存する方法ですが、Excelでカンマ区切りやタブ区切り形式で保存すれば、空白セルがあっても、問題ないと思いますがいかがでしょうか。

Excelの「表示形式」を「文字列」にしているのに…というのを疑問に感じていらっしゃるようですが、この設定は、そもそも原則としては「表示上」のデータを整形する機能として用意されたもので、Access等のデータベースで、フィールド型を指定する機能とは、根本的に異なります。この点を理解されておいたほうがいいでしょう。

では、ExcelデータをAcessにインポートするときには、どのようにしてフィールド型を判別しているのかと言えば、1件目のデータからであると思われます。
文字列にしている列の1件目の...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QACCESSのVBAでCSVを取込処理について

ACCESS初心者です。
ACCESSのVBAでCSV取込をしようとしていますが、
うまくいきません。
CSVとテーブルの項目の場所が違ったりオートナンバーが設定されていたりしているので、
そこのところが全くわかりません。
いろいろ調べて試しましたが、うまくいがず行き詰っています。
VBAでなくてもクエリやマクロといったやり方でもいいので、
教えてください。
-------------------------------------------------------------------
VBAプログラム
'処理実行確認画面
rc = MsgBox("処理を実行しますか?", vbOKCancel, "注文データ処理")
If rc = vbCancel Then
Exit Sub
End If

'[ファイルを開く]ダイアログボックスを作成
Set dlgOpen = Application.FileDialog(msoFileDialogOpen)

'ダイアログボックスの初期値をセット
dlgOpen.AllowMultiSelect = False
dlgOpen.Filters.Clear
dlgOpen.Filters.Add "CSVファイル", "*.csv"
dlgOpen.InitialFileName = CurrentProject.Path

'ダイアログボックス表示
retDialog = dlgOpen.Show

'[キャンセル]ボタン
If retDialog = 0 Then
Exit Sub

'[開く]ボタン
Else
'選択したファイル名を表示
Me!txtファイル名IN = dlgOpen.SelectedItems(1)
End If

Const ForRading = 1

strFilePath = txtファイル名IN

Set Con = CurrentProject.Connection
Rec.Open "order_list", Con, adOpenDynamic, adLockOptimistic


Open strFilePath For Input As #FNo
'ファイルの1行目の項目名部分を読み込む(何も処理しない)
Line Input #FNo, txtData

On Error GoTo ErrHndl
'エラーが発生した場合にデータのインポートをなかったこと(ロールバック)
'にするためにトランザクション処理として実行
Con.BeginTrans
'実際のデータ部分(2行目)からの処理
Do While Not EOF(FNo)
Line Input #FNo, txtData
Debug.Print txtData
Loop

Con.CommitTrans

Close #FNo

MsgBox ("処理が完了しました。")

Exit Sub

ErrHndl:
Close #FNo
Con.RollbackTrans
MsgBox "以下のエラーが発生したためロールバックしました。" & vbCrLf & _
Err.Description, vbCritical
----------------------------------------------------------------------------------------

ACCESS初心者です。
ACCESSのVBAでCSV取込をしようとしていますが、
うまくいきません。
CSVとテーブルの項目の場所が違ったりオートナンバーが設定されていたりしているので、
そこのところが全くわかりません。
いろいろ調べて試しましたが、うまくいがず行き詰っています。
VBAでなくてもクエリやマクロといったやり方でもいいので、
教えてください。
-------------------------------------------------------------------
VBAプログラム
'処理実行確認画面
rc = MsgBox("処理を実行します...続きを読む

Aベストアンサー

CSVファイルにタイトル行が有り、テーブルのフィールド名と同じ、
列数も同じ(オートナンバー型フィールドは除く)、
ならTransferTextメソッドでインポートはだめですか。
安全のためインポート定義を利用するべき
オートナンバー型フィールドは考えなくとも自動的に処理されます。
トランザクション処理が出来ないからNGか・・・。

インポート出来ないデータ型(数値に文字など)の場合は
インポートエラーテーブルが自動生成され記録されます。
テキスト型に255超の文字数の場合、超過分は黙って切り捨てられ
エラーは記録されません。

姑息な方法かもしれませんがインポート前にオートナンバーの最大値を控え
インポート処理後にエラーテーブルの有無・レコード数の増加をチェックし
変化が有れば削除クエリで元に戻す。
オートナンバーが大きく飛ぶので最適化で修正
Access VBA 自身を最適化 でGoogleとVBAサンプルもあるけど。。。

・・・
現状の方向だと
dim v() as variant,i as integer
v=split(txtData,",") '配列に格納
for i= lbound(v(i)) to ubound(v(i))
debug.print i,v(i) '添え字と値(タイトル)の確認
next

with rec
.addnew
!購入者氏名(漢字)= v(2)
!注文日時= cdate(v(0) ) 'Cdate 要らないかも?
・・のように対応する配列を指定
.update
end with
のようになるかと思います。
ただ、CSVファイルを、,カンマで分割して配列に入れているだけなので
ExcelでCSV出力した時のようなフォーマット
(位取り有りの数値にダブルクォートがついて、"1,100")
区切り以外でカンマが使われていると項目数・データとも崩れます。
Rollbackすることに。

CSVファイルにタイトル行が有り、テーブルのフィールド名と同じ、
列数も同じ(オートナンバー型フィールドは除く)、
ならTransferTextメソッドでインポートはだめですか。
安全のためインポート定義を利用するべき
オートナンバー型フィールドは考えなくとも自動的に処理されます。
トランザクション処理が出来ないからNGか・・・。

インポート出来ないデータ型(数値に文字など)の場合は
インポートエラーテーブルが自動生成され記録されます。
テキスト型に255超の文字数の場合、超過分は黙って切...続きを読む

Qマクロにてaccessへテキストファイルをインポートする方法

マクロを利用しaccessへテキストファイルをインポートしようとしているのですが、
どのHPを参照しても、
マクロを利用してのテキストインポートはできないみたいなことが書かれてます。
一度、CSVに落として実行するしか方法はないのでしょうか?

Aベストアンサー

1度、「ファイル」「外部データの取り込み」でテキストファイルを参照
左下の「設定」ボタンでフィールドの設定をして定義を保存します。

マクロにて「テキスト変換」を選び
[変換の種類]区切り記号付きインポート 又は 固定長インポート
[定 義 名]上記で保存した定義
[テーブル名]保存するテーブル
[ファイル名]テキストファイル名(パス付き)

これでできると思いますが...

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング