• ベストアンサー

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
質問者

補足

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