ちょっと変わったマニアな作品が集結

Accessのマクロを作成しています。
ファイルを開くダイアログから複数ファイルを選択してCSVファイルをインポートするマクロを書きました。(最後に抜粋を記載します)
インポートの行はこうなっています。
DoCmd.TransferText acImportDelim, , "traffic", varFname, True

ファイル名に拡張子直前以外にドットを含むファイル名だと以下のエラーとなります。
実行時エラー '3011'
オブジェクト'ドットを含むファイル名'が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください。

余分なドットさえ含まなければ、50ファイル、7MBのインポートも問題ありません。

わけあってファイル名は変更できません。
ファイル名にドットを含む場合のインポートの書き方を教えてください。

宜しくお願い致します。



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

'[ファイルを開く]ダイアログボックスの初期設定
dlgOpen.AllowMultiSelect = True
dlgOpen.Filters.Clear
dlgOpen.Filters.Add "CSV", "*.csv"
dlgOpen.InitialFileName = CurrentProject.Path

'[ファイルを開く]ダイアログボックスを表示
ret = dlgOpen.Show

'[キャンセル]ボタンを選択したときは、プロシージャを終了
If ret = 0 Then
Exit Function
End If

'カレントデータベースに接続
Set db = CurrentDb

'lineテーブルからレコードを取得
Set rs = db.OpenRecordset("line", dbOpenDynaset)

'単数または複数選択されたファイル分だけ処理する
For Each varFname In dlgOpen.SelectedItems
'CSVファイルをインポートする
DoCmd.TransferText acImportDelim, , "traffic", varFname, True

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

A 回答 (2件)

TransferTextの仕様をかえることはできませんので


Recordset等をつかって自力でインポートするか、
一時的にファイル名を変えてインポート後に戻すか、
のどちらかになるのではないでしょうか。
    • good
    • 0
この回答へのお礼

TransferTextの仕様ですか...(T_T)

なるほどドットを含むファイルの場合だけ一時的にリネイムして戻すのが早くて効率的ですね。

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

お礼日時:2007/03/29 23:48

For Each ~ Nextループの中で、問題のファイルをドットのつかない


ファイル名でコピーし、そのファイルをインポートするのはどうですか。

ファイルのコピーは、FileCopy ステートメントで実現可能です。
    • good
    • 0
この回答へのお礼

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

ファイルのサイズが大きめなので一時的にリネイムする方向で考えて見ます。それがダメならコピーにしてみます。

お礼日時:2007/03/29 23:50

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

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

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

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

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

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"...続きを読む

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,・・・と、必要な列数を追加して下さい:定義のかわりです)

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Q「Nullの使い方が不正です」のエラー

AccsessとVB間でデータの参照・登録・削除を行うプログラムを作成中です。
テキストボックスにデータを入力せずに更新するとAccess側はNull値が入るので、参照をした際に
「Nullの使い方が不正です」のエラーが表示されます。

Null値が表示可能ならその方法を教えてください。

Aベストアンサー

読み込んだ際にIsNull()で判断してみては?
If IsNull(Fields) Then
Text1.Text = ""
Else
Text1.Text = Fields
End If

Qアクセスマクロで、csv データを取り込むときに起こるエラー

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

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

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

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

…どうしてでしょう。

Aベストアンサー

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

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

QACCESS VBAでのインポート

アクセスでエクセルのファイルをインポートするVBAを書いています。
まず、フォルダ内のファイル名を全て取得してコンボボックスで表示します。
そのコンボボックスからインポートするファイルを選択し、インポートします。
ところが、インポートしようとすると「実行時エラー'3011'」となり、オブジェクトが見つかりませんとなってしまいます。

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "氏名順_仮", Me.shimei_folder.Value & "\06.6.1氏名順.xls", True
このように記述するとキチンとインポートするのですが、
path = Me.shimei_folder.Value & "\" & CStr(Me.shimei_combo.Value)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "氏名順_仮", path, True
これだと3011エラーになってしまうのです。
エラー表示が「オブジェクト"06.6.16氏名順$"が見つかりません」となるのですが、.xlsが$になってしまうのが原因??とも思います。
コンボボックス上は「06.6.16氏名順.xls」と表示されているし、デバッグしてみてもMe.shimei_combo.Valueは「06.6.16氏名順.xls」なのですが・・・。
どなたか、解決方法がわかれば教えて下さい。

ちなみにACCESS、EXCELともに2000です。

アクセスでエクセルのファイルをインポートするVBAを書いています。
まず、フォルダ内のファイル名を全て取得してコンボボックスで表示します。
そのコンボボックスからインポートするファイルを選択し、インポートします。
ところが、インポートしようとすると「実行時エラー'3011'」となり、オブジェクトが見つかりませんとなってしまいます。

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "氏名順_仮", Me.shimei_folder.Value & "\06.6.1氏名順.xls", True
このように記述すると...続きを読む

Aベストアンサー

こんにちは。

問題は、
"06.6.16氏名順.xls"

って、ファイル名としては、少し奇妙だと思います。例えば、"06_6_1氏名順.xls" なら分かるのですが、「.」が、それほど多いと、ファイル名としての認識が危ういような気がします。

単体では取れているようですから、それ以上のことは分かりませんが、他の方法としては、やはり、CurrentDirctor の変更で、そのまま、単発のファイル名でインポートしてしまう方法が考えられます。

いずれにしても、私なら、

If Dir(myPath & "\" & FileName) = "" Then
  MsgBox "ファイルが見当たりません" : Exit Sub
Else
  'DoCmd.TransferSpreadsheet '.....
End iF

このような、ファイル・チェッカーを入れます。

もちろん、ComboBox の値では、CStr 関数は必要がないように思います。また、path という変数ですが、一般的には、既存のプロパティ名(予約語とはいいませんが)ですから、その名称はやめたほうが無難だとは思います。

こんにちは。

問題は、
"06.6.16氏名順.xls"

って、ファイル名としては、少し奇妙だと思います。例えば、"06_6_1氏名順.xls" なら分かるのですが、「.」が、それほど多いと、ファイル名としての認識が危ういような気がします。

単体では取れているようですから、それ以上のことは分かりませんが、他の方法としては、やはり、CurrentDirctor の変更で、そのまま、単発のファイル名でインポートしてしまう方法が考えられます。

いずれにしても、私なら、

If Dir(myPath & "\" & FileName) = "" Then...続きを読む

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

Qaccessへエクセルの複数のシートのインポートの仕方

エクセルの複数のシートをアクセスにインポートをするにはどうしたらいいのでしょうか?
シート数が40以上あって困っています。

できればVBAやマクロ等はわかりませんのでそれ以外の方法で無いでしょうか?
よろしく御願いいたします。

Aベストアンサー

VBAで書けば、例えば、こんな感じになります。
db1.xls というエクセルのファイルがあって、そのファイルに Sheet1、Sheet2、、、、、、Sheet40というシートが含まれている、という前提です。
(行替えやタブがここでうまく書けないので、読みにくいし、そのままコピーしてもうまく行かないかもしれません)

Sub A()
Dim I As Intege
For I = 1 To 40
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Sheet" & I, "db1.xls", True
Next
End Sub

F5で実行します。
データベースに、シートと同じ名前のテーブルができます。
同じシート名のテーブルがすでにあれば、インポートしたレコードは追加されます。

コードは実際に自分のパソコンで走らせて確認していますが、やる前に絶対にパックアップを取っておいてください。
お手元のデータベースがめちゃくちゃになってしまったら、私は、これも絶対に、直せません。

ポイントは DoCmd.TransferSpreadsheet という命令です。
引数は左から順番に、インポート、ソースはエクセル2000、シートの名前は Sheet**、ソースのファイル名は db1.xls、先頭行をフィールド名として使う、と言う意味です。

詳しくはヘルプで見ていただきたいと思います。
ヘルプはもしかしたら、デフォルトでインストールされていないかもしれません。
インストールされていれば、TransferSpreadsheet の部分のどこかにカーソルを置いて、F1で表示されます。
2番目の引数について、エクセル2000より後の場合にどうなるのかは、申し訳ないですが、知りません。
これについては、ヘルプで確認してください。

もし、シート名がこのように規則的な名前でなければ、この DoCmd.TransferSpreadsheet をシートの数だけ羅列します。

Sub A()
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "なんとか"db1.xls", True
DoCmd.TransferSpreadsheet acImport acSpreadsheetTypeExcel9, "かんとか"db1.xls", True
............(以下同様)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "ほにゃら"db1.xls", True
End Sub

さて、余談になりますが、今回きりの作業であれば、私なら、ひとつひとつインポートウィザードでインポートします。
高々、40シートですよね。スプレッドシートの構成や中身によりますが、1シートあたり10分もあれば、インポートできるのではないでしょうか。

TransferSpreadsheet メソッドでインポートしても、あとでフィールドのデータ型を変えたり、主キーを設定したり、という作業がそれぞれのテーブルで必要になるかもしれません。つまり、モジュールをつくってみても、それで終わりにはなりません。定期的なルーチン作業ならともかく、今回限りなら、大して手間は変わらないと思います。

VBAで書けば、例えば、こんな感じになります。
db1.xls というエクセルのファイルがあって、そのファイルに Sheet1、Sheet2、、、、、、Sheet40というシートが含まれている、という前提です。
(行替えやタブがここでうまく書けないので、読みにくいし、そのままコピーしてもうまく行かないかもしれません)

Sub A()
Dim I As Intege
For I = 1 To 40
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Sheet" & I, "db1.xls", True
Next
End Sub

F5で実行します...続きを読む

QOfficeアクセス テーブル「テキスト型」⇒「日付型」への変換について

テーブルにデータが保管されており、そのフィールドの一つに「テキスト型」で”20080301”のようなデータを持っています。これを「日付/時刻型」”2008/03/01”のように変換したいのですが、どのようにすればよいのでしょうか。

※ちなみにこのオリジナルデータは毎日、自動的にテーブルにダウンロードされており、このテーブル自体の型を予め「日付/時刻型」に変換すると、日々のデータ取得時にエラーとなってしまいます。ですので、「日付/時刻型」のフィールドを持った新規のテーブルに、この”20080301”のデータを変換し格納したいのですがどのようにすればよろしいでしょうか。

テーブル⇒デザインより、該当のフィールドの型を「テキスト型」⇒「日付/時刻型」へ直接変換してしまうと、「データの変換中にエラーが発生しました。○○件のレコードのデータが失われました。」と表示されます。素人のため、なるべく追加クエリや更新クエリや簡単な関数のみでの方法を教えていただけたら幸いです。

Aベストアンサー

テーブルに日付時刻型フィールドを追加して、
更新クエリを使って、#1さんが提案されている
数式を使えばよいのでは?


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

人気Q&Aランキング