• ベストアンサー

CSVファイルを任意の場所に出力するには?

ACCESS-VBAの初心者です。 ACCESSのテーブルを、csvファイルとして、任意の場所に出力させるには、どのようにしたら良いのでしょうか。 当方初心者につき、なるべく簡単な方法だとさらに助かるのですが。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

No.2です。 便利な使い方があるんですね。知りませんでした! せっかくやる気を出しているので、以下のAPIでダイアログを表示したらどうでしょうか(ネットで調べたものを多少修正しました)。自分の使いやすいように修正してください。このまま使用するなら該当するフォームにそのまま貼り付けてください(=== の間)。 ============================================================= Private Declare Function GetSaveFileName Lib "comdlg32.dll" _ Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long Private Type OPENFILENAME lStructSize As Long '構造体のサイズ hwndOwner As Long '親ウィンドウのハンドル hInstance As Long 'モジュールのインスタンスハンドル lpstrFilter As String 'VBのファイルパターン lpstrCustomFilter As String 'カスタムフィルタ nMaxCustFilter As Long '同バイト数 nFilterIndex As Long 'フィルタのインデックス lpstrFile As String 'フルパス名を受取るバッファ nMaxFile As Long '同バイト数 lpstrFileTitle As String 'ファイル名を受取るバッファ nMaxFileTitle As Long '同バイト数 lpstrInitialDir As String '初期ディレクトリ名 lpstrTitle As String 'ダイアログボックスのキャプションタイトル flags As Long '動作を指定する定数の組合せ nFileOffset As Integer 'フルパス中のファイル名までのオフセット nFileExtension As Integer '同 拡張子までのオフセット lpstrDefExt As String 'デフォルトの拡張子 lCustData As Long 'フックプロシージャに渡すデータ lpfnHook As Long 'フックプロシージャOFNHookprocへのポインタ lpTemplateName As String 'テンプレートリソース名 End Type Private Const OFN_HIDEREADONLY = &H4 Private Const OFN_OVERWRITEPROMPT = &H2 Private Const OFN_FILEMUSTEXIST = &H1000 Private Const OFN_PATHMUSTEXIST = &H800 Private Const OFN_EXPLORER = &H80000 '-------------------------------------- ' ダイアロゴを表示(名前を付けて保存) '-------------------------------------- Private Function FileSaveDialog(Optional folder As String = "C:\") As String Dim tOpenFileName As OPENFILENAME Dim lngRet As Long With tOpenFileName .lStructSize = Len(tOpenFileName) .hwndOwner = Me.hWnd .hInstance = 0 .lpstrFilter = "テキストファイル(*.txt)" & vbNullChar & "*.txt" _ & vbNullChar & "すべてのファイル(*.*)" & vbNullChar & "*.*" .nFilterIndex = 1 .lpstrFile = strFileName & String$(256, Chr$(0)) .nMaxFile = 256 .lpstrFileTitle = String$(256, Chr$(0)) .nMaxFileTitle = 256 .lpstrInitialDir = folder .lpstrTitle = "名前を付けて保存" .flags = OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or OFN_OVERWRITEPROMPT End With lngRet = GetSaveFileName(tOpenFileName) FileSaveDialog = Left$(tOpenFileName.lpstrFile, _ InStr(tOpenFileName.lpstrFile, vbNullChar) - 1) End Function ============================================================= 呼び出しは fileName = FileSaveDialog("デフォルトフォルダ") デフォルトフォルダが指定されなかったときは C:\ とみなします。 戻り値は fileName に指定ファイルの FullPath が返されます。 キャンセルした場合は空文字が返ります。 以上お試しください。 APIの詳細は GetSaveFileName でネット検索してみてください。

tamago800
質問者

お礼

遅くなって申し訳ありません。 コードまで呈示して頂き、本当にありがとうございます! とりあえず貼り付けてみて実行してみました。 すると、コモンダイアログが開くところまではいったのですが、最後に「実行時エラー 3027 データベースまたはオブジェクトは読み取り専用なので更新できません」となってしまい、保存できませんでした。 フォーム上のコマンドボタンに下記のコードを付けて実行したのですが…。 DoCmd.TransferText acExportDelim, "", "○○テーブル", FileSaveDialog, False, "" 何度もうまくいかなくて申し訳ありません。。もし何が悪いのかご存知でしたらご教唆いただきたいのですが・・・。

その他の回答 (7)

回答No.8

こんにちは No.2です。原因がわかってよかったです。 折角ですので FileSaveDialog を以下のように修正するともっと使いやすくなると思います。  .lpstrDefExt = ".csv" を追加する。  ダイアログで拡張子が未入力の時 .csv が自動的に追加されます それと .lpstrFilter のtxt部分をcsvに変更したほうが自然ですよね

tamago800
質問者

お礼

ありがとうございます、これでやりたかったことが完全に実現できました! 正直、csvを好きなところに吐き出すだけのことが、こんなに大変なことだとは思っていませんでした。すんなり、ナントカメソッドがあるんじゃないかと思ってました。。 にもかかわらず私のような初心者に対し、ご親切にご指導いただきましたこと、感謝申し上げます。とても勉強になりました。ありがとうございました。

回答No.7

こんにちは。No.2です。 ダイアログは表示されたようなので安心しました。 今度は DoCmd.TransferText メソッドの問題のようですね。Access2002を使ってテストしてみましたが問題なく動作します。 テーブルが存在しなかった場合、出力先テキスト(既存)が Readonly であった場合など、何れも実行時エラーにはなりますが、「実行時エラー 3027 ...」にはなりません。 Access のレベルは若干違いますが原因を把握できません。差し支えなければ実際に指定した出力先の詳細など、もう少し詳しい状況を記載して他の方のアドバイスを受けてみてください。 なお、DoCmd.TransferText メソッドの中に関数呼び出しが組み込まれていますが、ダイアログでキャンセルした場合は不都合が生じます。以下のように記述するのが一般的だと思います。 fileName = FileSaveDialog() if fileName <> "" then  DoCmd.TransferText acExportDelim, , "○○テーブル", fileName, False end if

tamago800
質問者

お礼

色々やってみたらうまく行きました!! コードは以下の通りです。 fileName = FileSaveDialog() If fileName <> "" Then DoCmd.TransferText acExportDelim, , "main", fileName & ".csv", False End If 4番目の引数の後ろに、拡張子を付けていなかったのが原因だったみたいです。 今回はとても助かりました。ご親切にご指導いただき、本当にありがとうございました。

回答No.5

No.2です。 お力になれず残念ですが、下記のことが気になったので再度アップしてみました。 > ☆transfertext を使うと、任意の場所に出力できない。 > ☆OutputTo を使うと、任意の場所に出力は出来る 任意の場所とはフォルダのことですよね。後者ができるということはどういうことでしょう? どちらのメソッドも第4引数で出力先(例えば c:\temp\FaileName.csv)を指定することになっていますので、前者も当然できると思いますが。 ダイアログボックスはパスの指定を正確かつ容易に指定できる手段を提供しているだけで、面倒ですがテキストボックスに直接入力することで代替することもできます。任意の場所への出力とダイアログボックスによるパスの取得は直接関係ないですよね。 ピンボケの返答だったらご容赦ください。 ActiveXコントロールのインストールについては、他の方からのアドバイスを期待しましょう。

tamago800
質問者

お礼

たびたび説明が不足で申し訳ありません。 私が「任意」と書かせて頂いた感じは、その場でユーザがフォルダを選べるというイメージなんです。 具体的には、OutputToの4番目の引数に何も入れないと、その場でユーザが好きな場所を選べるのですけれど、そんな感じなのです。 例(DoCmd.OutputTo acTable, "○○テーブル", "MicrosoftExcel(*.xls)", "", False, "") でも3番目の引数にcsv形式だってことを指示できなくて。 TransferTextだと4番目になにも入れないとエラーになってしまうし。 むずかしいです。。

回答No.4

No.2です。 エラーに関する的確なアドバイスができません。 下記URLを参考にトライしてみてください。

参考URL:
http://www.accessclub.jp/bbs3/0033/superbeg13443.html
tamago800
質問者

お礼

 URLまで教えていただき、ほんとうにありがとうございます。    私は常々以下のことで悩んでいました。 ☆transfertext を使うと、csv形式には出来るけど、任意の場所に出力できない。 ☆OutputTo を使うと、任意の場所に出力は出来るけど、テキスト形式やエクセル形式にしかならず、csv形式にできない。  色々調べてみたのですが、どうやらCreateObjectを使うには、ライセンスというものが必要みたいなのです。(きっとお金もかかるのだと思います。)  私は普通の事務のOLなので、開発者の方々とは環境が違うのだと思いました。ということで、とりあえずあきらめがつきました。けれどとても勉強になりました。心より感謝申し上げます。

回答No.3

こんにちは。No.2です。 (1)は、ふつうのツールボックスから持ってくるコマンドボタンでもよいのでしょうか? その通りです。 (2)は、もしかして、「CreateObject」というのを使うのでしょうか?? 以下の操作を試してください。 現在表示されているツールボックスの「コントロールの選択」アイコンをクリックすると使用可能なコントロールの一覧が表示されますので、Microsoft Common Dialog Control, version xxx ... をダブルクリックしてください(フォーム上にアイコンが表示されると思います)。 (3)出力先を指定してボタンを押したら、csvではきだされる DoCmdコマンドを利用して DoCmd.TransferText acExportDelim, , Table名, CSVファイル名, True 詳しくはDoCmd.TransferTextを調べてください。

tamago800
質問者

お礼

ご親切な回答、ありがとうございます。 (2)で、Microsoft Common Dialog Control version6 というのを呼び出そうとしたのですが、以下のようなメッセージが出てしまい、再び途方に暮れてしまいました。 「このActiveXコントロールを使用するライセンスがありません。」 ちなみにWindowsXPのHome Edition で、ACCESS2000を使用しています。 なんとか解決する方法はないものでしょうか??

回答No.2

こんにちは ボタンを押した時にダイアログボックスを表示したいということでしょうか。 Microsoft Common Dialog Controlをフォームに配置し ボタンのClickイベントでCommonDialog8.ShowSaveメソッドを呼び出します。 ファイル名を獲得後Docmd.TranferTextでCSV出力します。 こんな感じでしょうか。

tamago800
質問者

お礼

ご回答ありがとうございます。やりたいことはそうなんです。 けど、うまくいきません…むずかしい…(汗) えーと、まず、こんなふうに流れをわけてみました。 (1)ボタンをフォームにつくる (2)それを押したらダイアログボックスが表示される (3)出力先を指定してボタンを押したら、csvではきだされる (1)は、ふつうのツールボックスから持ってくるコマンドボタンでもよいのでしょうか?(ふつうのフォームやマクロならなんとか解ります) (2)は、もしかして、「CreateObject」というのを使うのでしょうか?? (「Commondialog」をインターネットで調べてみました。) でも、そうすると、「実行時エラー429」というのが出てしまい、ここで止まってしまったのです。(あさっての方向を向いていたらすみません) どうやって解決していいのかわかりません。。 申し訳ないのですが、ご存知でしたら教えて下さいませんでしょうか。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

データベースウインドウのテーブル画面にて 出力したいテーブルを右クリック してエクスポート(E)を実行 出力先をどこにするかダイアログボックスが表示されるので ファイルの種類を Text FILE(Csv,TXT) を選択して 名前を指定してOKを押せばウイザードが表示されます。 あとは指示に従うだけでできます。

tamago800
質問者

補足

あああ、申し訳ありません、説明不足です。。。 ひとつのツールとして、ユーザが「出力」ボタンを押したときに、ユーザが好きな場所に掃き出せるようにしたいのです。

関連するQ&A

  • CSVファイルのエクスポートでソートしたい

    ACCESS VBAで DoCmd.TransferText acExportDelim, , "テーブル名", CSV_File_Full_Path でCSVファイルのエクスポートを行っていますが、 エクスポートするテーブルの任意の複数項目でソートして出力する方法はあるのでしょうか? 現在はテーブルの表示順と異なった出力がされています。

  • CSVファイルをアクセスのテーブルに出力する

    こんにちは Access VBA初心者です。 やりたい処理なのですが CSVファイルをmdb内であらかじめ作成されているテーブルに出力したいのですが、 最初にTransferTextwでワークのテーブルにインポートして そのワークテーブルを1レコードずつ読み込みmdbのあらかじめ作成されているテーブルにINSERTしていくという方法しか今思いつきません。 インポートするとワークテーブルはすべてテキスト型になっていますが、 それを違う型の項目にINSERTするということなど可能なのでしょうか? それとももっとスマートな方法があるのでしょうか? ざっくりと書いてしまいましたが、よろしくお願いいたします。

  • CSVファイルの出力

    こんにちは。 ただいまアクセスで商品の検索プログラムを作っていまして、入力した商品名に一致する商品コードと商品名をテーブルから抽出し、CSVファイルに出力したいのですが、どういった方法で出力すればいいのでしょうか?

  • ファイルメーカーでcsv出力

    ファイルメーカーのcsv出力で質問があります。 明細テーブルと顧客テーブルの内容を連結してcsvファイルを出力したいのですが、 (明細テーブルの内容に顧客テーブルより顧客名称を付与する) どういった方法で出力するのが良いのでしょうか? ちなみに件数は毎回1000件前後です。 今は出力するcsvファイルのレイアウトのテーブルcを作成し、 いったん明細テーブルをインポートし、その後顧客テーブルより顧客名称を設定、 その後エクスポートでテーブルcのcsvファイルを出力しています。 あまり余計なテーブルを増やしたくないので 他に良い方法があればと思い質問しました。 よろしくお願いします。

  • Access csvの取込 ファイルは任意でテーブルは指定したいのですが?

    Access初心者です。2003を使用しています。 csvをマクロの「テキスト変換」で取り込ませています。取り込み時に定義どおりのテーブルを作成してくれるので、追加クエリを使い作業用テーブルに移動させ、処理にはそちらを使う仕組みにしています。 csv → データ用テーブル → 作業用テーブル(実際使うテーブル) csv取り込みには「テキスト変換」マクロでファイル名にパスを設定していますが、この部分を固定パスではなく任意に指定できるようにしたいのです。(取り込みたいcsvが決まったパス、ファイル名で無い場合があります。) 「コマンドの実行:インポート」ですとダイアログが出て任意に取込ファイルが指定できますが、インポートウィザードが起動してしまいます。使用者がウイザードで適切な定義を選びデータ用テーブルを作成してくれればいいのですが、私がツールを作りPCに詳しくない人が使うのでインポートウイザードを避けたいと考えます。 どなたか、マクロ「テキスト変換」でファイル名をダイアログなどで、任意に指定できるような手法をご存じないでしょうか? また、マクロでは無理なようでしたらVBAでしたら可能でしょうか? よろしくお願いします。

  • Access VBAからcsvの出力について

    Access VBAからcsvの出力について Select * into csvファイル From テーブル名 Where ••• Where句なし、全件ではちゃんと出力できるのですが、 Where句ありだと0件になってしまいます。 Where句指定はできないのでしょうか? よい方法があれば教えてくださいm(._.)m 環境はフロントAccess ,DBはSQL server バッチでの出力も試みましたが、 Serverがあるフォルダにアクセス権限がないため、 断念しました。

  • csvファイルでの出力について

    C言語初心者です。 プログラミングにおいて質問なのですが、csvファイルを読み込み、 そのデータを用いて計算し、csvファイルで出力するという問題なのですが、C言語においてcsvファイル形式で出力するにはどのような方法がありますか? 補足:ラベル行に全角文字を入力しないといけません。

  • EXCELからCSVファイルの出力方法について

    EXCELについて質問です。 エクセルのシートに入力した内容をCSVファイルで出力したいです。 当方の希望としまして、いくつかあるシートの中で、希望のシートだけCSVファイルを出力し、出力する際は「CSVファイルを出力」のようなボタンをクリックすれば、CSVファイルが出力されるものです。 初心者ですので、できるだけ詳しく教えて頂きたいです。

  • MDBファイルをCSV出力したい

    こんばんは。 環境: OS:WINDOWS2000 VB6.0 sp5 アクセス2000 VBからアクセスのMDBデータをCSV形式で出力させようとしています。  mdbファイルが実行中にVBのexeを起動してcsvファイルを取得したいのですが、いい方法が分かりません。 閉じているMDBファイルのデータをCSVで出力することは可能です。  MDBファイルが開いているとexeを実行した時に「実行時エラー7866 データベースが開いています」というようなメッセージが出て処理ができません。 なにかいい方法はないでしょうか よろしくお願いいたします。

  • csvのデーターファイルから任意の行をエクセルファイルへ入力するエクセ

    csvのデーターファイルから任意の行をエクセルファイルへ入力するエクセルVBA が上手くできません。 6列2000行のcsvデーターのテキストファイルの作成は、色々な参考書があり成功しました。次に このcsvのデーターファイルから任意の複数行をシート4などの任意のワークシートの任意の場所に60行程度をインポートして、この60行の数値データーを加工しようとしていますが、入力が上手くできません。数値データーの加工のプログラムは一応できているため、その様式にあわせて、所定の場所にデーターを入れる必要が有ります。 1列目には日付(シリアルの数値にしています)、その他はすべて数値(LONG型)です。エクセルは2003を使用しています。 VBAの初心者です。宜しくお願いいたします。